SELinux kavramları

SELinux kavramlarına aşina olmak için bu sayfayı inceleyin.

Zorunlu erişim kontrolü

Güvenliği Geliştirilmiş Linux (SELinux), Linux işletim sistemi için zorunlu bir erişim kontrolü (MAC) sistemidir. Bir MAC sistemi olarak Linux'un tanıdık isteğe bağlı erişim kontrolü (DAC) sisteminden farklıdır. Bir DAC sisteminde, belirli bir kaynağın sahibinin, onunla ilişkili erişim izinlerini kontrol ettiği bir sahiplik kavramı mevcuttur. Bu genellikle kaba tanelidir ve kasıtsız ayrıcalık artışına tabidir. Ancak bir MAC sistemi, tüm erişim girişimlerine ilişkin karar için merkezi bir otoriteye danışır.

SELinux, çeşitli çekirdek nesnelerini ve bunlar üzerinde gerçekleştirilen hassas eylemleri tanıyan Linux Güvenlik Modülü (LSM) çerçevesinin bir parçası olarak uygulanmıştır. Bu eylemlerin her birinin gerçekleştirileceği noktada, opak bir güvenlik nesnesinde saklanan bilgilere dayanarak eyleme izin verilip verilmeyeceğini belirlemek için bir LSM kanca işlevi çağrılır. SELinux, erişim kararlarını belirlemek için bu kancalara ve bu güvenlik nesnelerinin yönetimine kendi politikasıyla birleşen bir uygulama sağlar.

Diğer Android güvenlik önlemlerinin yanı sıra, Android'in erişim kontrolü politikası, ele geçirilen makinelere ve hesaplara gelebilecek olası hasarı büyük ölçüde sınırlar. Android'in isteğe bağlı ve zorunlu erişim kontrolleri gibi araçları kullanmak, yazılımınızın yalnızca minimum ayrıcalık düzeyinde çalışmasını sağlayacak bir yapı sağlar. Bu, saldırıların etkilerini azaltır ve hatalı süreçlerin verilerin üzerine yazılması ve hatta iletilmesi olasılığını azaltır.

Android 4.3 ve üzeri sürümlerde SELinux, geleneksel isteğe bağlı erişim kontrolü (DAC) ortamları üzerinde zorunlu erişim kontrolü (MAC) şemsiyesi sağlar. Örneğin, yazılımın ham blok aygıtlarına yazabilmesi 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 cihaza yazabilir. Ancak SELinux bu cihazları etiketlemek için kullanılabilir, böylece kök ayrıcalığı atanan süreç yalnızca ilgili politikada belirtilenlere yazabilir. Bu şekilde süreç, belirli ham blok cihazının dışındaki verilerin ve sistem ayarlarının üzerine yazamaz.

Tehditlere ilişkin daha fazla örnek ve bunları SELinux ile gidermenin yolları için Kullanım Durumlarına bakın.

Yaptırım seviyeleri

SELinux çeşitli modlarda uygulanabilir:

  • İzin Veren - SELinux güvenlik politikası uygulanmaz, yalnızca günlüğe kaydedilir.
  • Zorlama - Güvenlik politikası uygulanır ve günlüğe kaydedilir. Arızalar EPERM hataları olarak görünür.

Bu seçim ikili bir seçimdir ve politikanızın harekete geçip geçmeyeceğini veya yalnızca potansiyel arızaları toplamanıza izin verip vermeyeceğini belirler. İzin verici özellikle uygulama sırasında faydalıdır.

Türler, nitelikler ve kurallar

Android, politikası için SELinux'un Type Enforcement (TE) bileşenine güveniyor. Bu, tüm nesnelerin (dosya, işlem veya yuva gibi) kendileriyle ilişkilendirilmiş bir türe sahip olduğu anlamına gelir. Örneğin, varsayılan olarak bir uygulama untrusted_app türüne sahip olacaktır. Bir işlemin türü aynı zamanda etki alanı olarak da bilinir. Bir türe bir veya daha fazla öznitelik ile açıklama eklemek mümkündür. Nitelikler aynı anda birden fazla türe atıfta bulunmak için kullanışlıdır.

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

Bir politika kuralı şu biçimde gelir: allow source target : class permissions ; Neresi:

  • Kaynak - Kuralın konusunun türü (veya niteliği). Erişimi kim talep ediyor?
  • Hedef - Nesnenin türü (veya niteliği). Erişim ne için talep ediliyor?
  • Sınıf - Erişilen nesnenin türü (örn. dosya, soket).
  • İzinler - Gerçekleştirilen işlem (veya işlemler dizisi) (örneğin okuma, yazma).

Bir kural örneği şöyledir:

allow untrusted_app app_data_file:file { read write };

Bu, uygulamaların app_data_file etiketli dosyaları okumasına ve yazmasına izin verildiğini söylüyor. Uygulamalar için başka türler de mevcuttur. Örneğin, manifest dosyasında isolatedProcess=true bulunan uygulama hizmetleri için isolated_app kullanılır. Her iki tür için de kuralı tekrarlamak yerine Android, uygulamaları kapsayan tüm türler için appdomain adlı bir öznitelik 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 öznitelik adını belirten bir kural yazıldığında, bu ad otomatik olarak öznitelikle ilişkilendirilen etki alanları veya türler listesine genişletilir. Bazı dikkate değer özellikler şunlardır:

  • domain - tüm süreç türleriyle ilişkili öznitelik,
  • file_type - tüm dosya türleriyle ilişkili öznitelik.

Makrolar

Özellikle dosya erişimi için dikkate alınması gereken birçok izin türü vardır. Örneğin, dosyayı açmak veya üzerinde stat çağırmak için read izni yeterli değildir. Kural tanımını basitleştirmek için Android, en sık karşılaşılan 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;

Yararlı makrolara ilişkin daha fazla örnek için global_macros ve te_macros dosyalarına bakın. İlgili izinlerin reddedilmesinden kaynaklanan hata olasılığını azaltmaya yardımcı olmak için mümkün olan her durumda makrolar kullanılmalıdır.

Bir tür tanımlandıktan sonra, temsil ettiği dosya veya süreçle ilişkilendirilmesi gerekir. Bu ilişkilendirmenin nasıl yapıldığına ilişkin daha fazla ayrıntı için SELinux'u Uygulamaya bakın. Kurallar hakkında daha fazla bilgi için SELinux Notebook'a bakın.

Güvenlik Bağlamı ve Kategorileri

SELinux politikalarında hata ayıklarken veya dosyaları etiketlerken ( file_contexts yoluyla veya ls -Z komutunu kullanırken), bir güvenlik bağlamıyla ( label olarak da bilinir) karşılaşabilirsiniz. Örneğin: u:r:untrusted_app:s0:c15,c256,c513,c768 . Bir güvenlik bağlamı şu biçimdedir: user:role:type:sensitivity[:categories] . Genellikle bir bağlamın user , role ve sensitivity alanlarını göz ardı edebilirsiniz (bkz. Özgüllük ). type alanı önceki bölümde açıklanmıştır. categories SELinux'taki Çok Düzeyli Güvenlik (MLS) desteğinin bir parçasıdır. Android S'den bu yana kategoriler şu amaçlarla kullanılıyor:

  • Uygulama verilerini başka bir uygulamanın erişiminden yalıtın,
  • Uygulama verilerini bir fiziksel kullanıcıdan diğerine yalıtın.

özgüllük

Android, SELinux tarafından sağlanan tüm özellikleri kullanmaz. Harici belgeleri okurken şu noktaları aklınızda bulundurun:

  • AOSP'deki politikaların çoğunluğu Çekirdek Politika Dili kullanılarak tanımlanır. Ortak Orta Dilin (CIL) kullanımına ilişkin bazı istisnalar vardır.
  • SELinux kullanıcıları kullanılmaz. Tanımlanan tek kullanıcı u . Gerektiğinde, fiziksel kullanıcılar bir güvenlik bağlamının kategoriler alanı kullanılarak temsil edilir.
  • SELinux rolleri ve Rol Tabanlı Erişim Kontrolü (RBAC) kullanılmaz. İki varsayılan rol tanımlanır ve kullanılır: özneler için r ve nesneler için object_r .
  • SELinux hassasiyetleri kullanılmaz. Varsayılan s0 hassasiyeti her zaman ayarlıdır.
  • SELinux boolean'ları kullanılmaz. Politika bir cihaz için oluşturulduktan sonra cihazın durumuna bağlı değildir. Bu, politikaların denetlenmesini ve hata ayıklamasını basitleştirir.