SELinux kavramları

SELinux kavramlarıyla ilgili bilgi edinmek için bu sayfayı inceleyin.

Zorunlu erişim denetimi

Güvenlik Gelişmiş Linux (SELinux), Linux işletim sistemi için zorunlu erişim denetimi (MAC) sistemidir. MAC sistemi olarak Linux'un bilinen isteğe bağlı erişim denetimi (DAC) sisteminden farklıdır. DAC sistemlerinde, belirli bir kaynağın sahibinin onunla ilişkili erişim izinlerini kontrol ettiği bir sahiplik kavramı vardır. Bu genellikle kabaca uygulanır ve istenmeyen ayrıcalık yükseltmelerine tabidir. Ancak MAC sistemi, tüm erişim girişimleriyle ilgili karar için merkezi bir yetkiliye danışır.

SELinux, çeşitli çekirdek nesnelerini ve bunlar üzerinde gerçekleştirilen hassas işlemleri tanıyan Linux Güvenlik Modülü (LSM) çerçevesinin bir parçası olarak uygulanmıştır. Bu işlemlerin her birinin gerçekleştirileceği noktada, işleme izin verilip verilmeyeceğini belirlemek için opak bir güvenlik nesnesinde depolanan bilgilere göre bir LSM kanca işlevi çağrılır. SELinux, erişim kararlarını belirlemek için bu güvenlik nesnelerinin kendi politikasıyla birlikte kullanılan bu kancaları ve yönetimini uygular.

Android'in erişim denetimi politikası, diğer Android güvenlik önlemleriyle birlikte güvenliği ihlal edilmiş makinelerin ve hesapların olası hasarını büyük ölçüde sınırlar. Android'in isteğe bağlı ve zorunlu erişim denetimleri gibi araçları kullanmak, yazılımınızın yalnızca minimum ayrıcalık düzeyinde çalıştığından emin olmanızı sağlayacak bir yapı sağlar. Bu, saldırıların etkilerini azaltır ve hatalı işlemlerin verilerin üzerine yazması veya hatta veri aktarması olasılığını azaltır.

Android 4.3 ve sonraki sürümlerde SELinux, geleneksel isteğe bağlı erişim denetimi (DAC) ortamları için zorunlu erişim denetimi (MAC) çatısı sağlar. Örneğin, yazılımların ham blok cihazlara yazmak için genellikle kök kullanıcı hesabı olarak çalışması gerekir. Geleneksel DAC tabanlı bir Linux ortamında, kök kullanıcının güvenliği ihlal edilirse bu kullanıcı her ham blok cihazına yazabilir. Ancak SELinux, root ayrıcalığı atanan işlemin yalnızca ilişkili politikada belirtilenlere yazabilmesi için bu cihazları etiketlemek amacıyla kullanılabilir. Bu sayede, işlem belirli ham blok cihazının dışındaki veri ve sistem ayarlarının üzerine yazamaz.

Tehditlerle ilgili daha fazla örnek ve SELinux ile bunları ele alma yöntemleri için Kullanım Alanları bölümüne bakın.

Yaptırım düzeyleri

SELinux farklı modlarda uygulanabilir:

  • İzin verici: SELinux güvenlik politikası zorunlu kılınmaz, yalnızca kaydedilir.
  • Uygulama: Güvenlik politikası uygulanır ve günlüğe kaydedilir. Başarısızlıklar EPERM hatası olarak görünür.

Bu seçim ikili olup politikanızın işlem yapıp yapmayacağını veya yalnızca olası hataları toplamanıza izin verip vermeyeceğini belirler. İzin verici, özellikle uygulama sırasında faydalıdır.

Türler, özellikler ve kurallar

Android, politikası için SELinux'un Tür Zorunluluğu (TE) bileşenini kullanır. Bu, tüm nesnelerin (ör. dosya, işlem veya soket) kendileriyle ilişkili bir türü olduğu anlamına gelir. Örneğin, bir uygulama varsayılan olarak untrusted_app türüne sahiptir. Bir işlemin türü, alanı olarak da bilinir. Bir türü bir veya daha fazla özellikle ek açıklamayla belirtebilirsiniz. Özellikler, aynı anda birden fazla türe başvurmak için kullanışlıdır.

Nesneler sınıflarla eşlenir (ör. dosya, dizin, sembolik bağlantı, soket) ve her sınıf için farklı erişim türleri izinlerle temsil edilir. Örneğin, file sınıfı için open izni vardır. Türler ve özellikler Android SELinux politikası kapsamında düzenli olarak güncellenirken izinler ve sınıflar statik olarak tanımlanır ve yeni bir Linux sürümü kapsamında nadiren güncellenir.

Politika kuralı şu şekildedir: allow source target:class permissions; Burada:

  • Kaynak: Kuralın konusunun türü (veya özelliği). Erişim isteğinde bulunan kim?
  • Hedef: Nesnenin türü (veya özelliği). Erişim isteğinde bulunulan şey nedir?
  • Sınıf: Erişilen nesne türü (ör. dosya, soket).
  • İzinler: Gerçekleştirilen işlem (veya işlem grubu) (ör. okuma, yazma).

Kural örneği:

allow untrusted_app app_data_file:file { read write };

Bu, uygulamaların app_data_file etiketli dosyaları okumasına ve yazmasına izin verildiği anlamına gelir. Uygulamalar için başka türler de vardır. Örneğin, manifest dosyasında isolatedProcess=true bulunan uygulama hizmetleri için isolated_app kullanılır. Android, her iki tür için de kuralı tekrarlamak yerine uygulamaları kapsayan tüm türler için appdomain adlı bir özellik kullanır:

# Associate the attribute appdomain with the type untrusted_app.
typeattribute untrusted_app appdomain;

# Associate the attribute appdomain with the type isolated_app.
typeattribute isolated_app appdomain;

allow appdomain app_data_file:file { read write };

Bir özellik adını belirten bir kural yazılırken bu ad, otomatik olarak özellikle ilişkili alan adları veya türlerin listesine genişletilir. Bazı önemli özellikler şunlardır:

  • domain: Tüm işlem türleriyle ilişkili özellik,
  • file_type: Tüm dosya türleriyle ilişkili özellik.

Makrolar

Özellikle dosya erişimi için dikkate alınması gereken birçok izin türü vardır. Örneğin, read izni dosyayı açmak veya dosyada stat işlevini çağırmak için yeterli değildir. Android, kural tanımını basitleştirmek için en yaygın durumları ele alacak bir dizi makro sağlar. Örneğin, open gibi eksik izinleri dahil etmek için yukarıdaki kural şu şekilde yeniden yazılabilir:

allow appdomain app_data_file:file rw_file_perms;

Faydalı makrolarla ilgili daha fazla örnek için global_macros ve te_macros dosyalarına bakın. İlgili izinlerin reddedilmesinden kaynaklanan hata olasılığını azaltmak için mümkün olduğunda makrolar kullanılmalıdır.

Tanımlanan türlerin, temsil ettikleri dosya veya işlemle ilişkilendirilmesi gerekir. Bu ilişkilendirmenin nasıl yapıldığı hakkında daha fazla bilgi için SELinux'u uygulama başlıklı makaleyi inceleyin. Kurallar hakkında daha fazla bilgi için SELinux Not Defteri'ne bakın.

Güvenlik bağlamı ve kategorileri

SELinux politikalarında hata ayıklama yaparken veya dosyaları etiketlerken (file_contexts kullanarak veya ls -Z yazarken) güvenlik bağlamı (etiket olarak da bilinir) ile karşılaşabilirsiniz. Örneğin: u:r:untrusted_app:s0:c15,c256,c513,c768. Güvenlik bağlamı şu biçimdedir: user:role:type:sensitivity[:categories]. Genellikle bir bağlamın user, role ve sensitivity alanlarını yoksayabilirsiniz (Belirlilik bölümüne bakın). type alanı önceki bölümde açıklanmıştır. categories, SELinux'taki Çok Katmanlı Güvenlik (MLS) desteğinin bir parçasıdır. Android 12 ve sonraki sürümlerde kategoriler şu amaçlarla kullanılır:

  • Uygulama verilerini başka bir uygulamanın erişimine kapatma,
  • Uygulama verilerini bir fiziksel kullanıcıdan diğerine ayırın.

Belirginlik

Android, SELinux tarafından sağlanan tüm özellikleri kullanmaz. Harici dokümanları okurken aşağıdaki noktaları göz önünde bulundurun:

  • AOSP'deki politikaların çoğu, çekirdek politika dili kullanılarak tanımlanır. Common Intermediate Language (CIL) kullanımıyla ilgili bazı istisnalar vardır.
  • SELinux kullanıcıları kullanılmaz. Yalnızca kullanıcı tanımlı u. Gerekirse fiziksel kullanıcılar, güvenlik bağlamının categories alanı kullanılarak temsil edilir.
  • SELinux rolleri ve Rol Tabanlı Erişim Denetimi (RBAC) kullanılmaz. İki varsayılan rol tanımlanır ve kullanılır: Konu için r ve nesneler için object_r.
  • SELinux hassasiyetleri kullanılmaz. Varsayılan s0 hassasiyeti her zaman ayarlıdır.
  • SELinux doğru/yanlış değerleri kullanılmaz. Politika bir cihaz için oluşturulduğunda, cihazın durumuna bağlı değildir. Bu, politikaların denetlenmesi ve hata ayıklanmasını kolaylaştırır.