SELinux kavramları

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

Zorunlu erişim kontrolü

Security Enhanced 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ı vardır. Bu genellikle kabadır ve istenmeyen ayrıcalık artışına tabidir. Ancak bir MAC sistemi, tüm erişim girişimlerine ilişkin bir 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 depolanan bilgilere dayanarak eyleme izin verilip verilmeyeceğini belirlemek için bir LSM kanca işlevi çağrılır. SELinux, bu kancalar için bir uygulama ve erişim kararlarını belirlemek için kendi politikasıyla birleşen bu güvenlik nesnelerinin yönetimini sağlar.

Diğer Android güvenlik önlemleriyle birlikte, Android'in erişim denetimi politikası, güvenliği ihlal edilmiş makine 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ışmasını sağlayacak bir yapı sağlar. Bu, saldırıların etkilerini azaltır ve hatalı süreçlerin verilerin üzerine yazma ve hatta aktarma olasılığını azaltır.

Android 4.3 ve sonraki sürümlerde SELinux, geleneksel isteğe bağlı erişim denetimi (DAC) ortamları üzerinde zorunlu bir erişim denetimi (MAC) şemsiyesi sağlar. Örneğin, ham blok cihazlarına yazmak için yazılım genellikle kök kullanıcı hesabı olarak çalışmalıdır. Geleneksel bir DAC tabanlı Linux ortamında, kök kullanıcı tehlikeye girerse, bu kullanıcı her ham blok cihazına yazabilir. Ancak, SELinux bu aygıtları etiketlemek için kullanılabilir, böylece kök ayrıcalığına atanan işlem yalnızca ilgili ilkede belirtilenlere yazabilir. Bu şekilde işlem, belirli ham blok cihazının dışındaki verilerin ve sistem ayarlarının üzerine yazamaz.

Daha fazla tehdit örneği ve bunları SELinux ile ele almanın yolları için Kullanım Durumlarına bakın.

yaptırım seviyeleri

SELinux çeşitli modlarda uygulanabilir:

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

Bu seçim ikilidir ve politikanızın harekete geçip geçmediğini veya yalnızca olası hataları toplamanıza izin verip vermediğini belirler. İzin verici özellikle uygulama sırasında kullanışlıdır.

Türler, nitelikler ve kurallar

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

Nesneler sınıflara (örneğin, bir dosya, bir dizin, bir sembolik bağlantı, bir soket) eşlenir ve her sınıf için farklı erişim türleri izinlerle temsil edilir. Örneğin, sınıf file için open izni var. Türler ve nitelikler Android SELinux ilkesinin 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 ilke kuralı şu şekilde gelir: allow source target : class permissions ; nerede:

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

Bir kuralın bir ö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ğini söylüyor. Uygulamalar için başka türler de vardır. Örnekler için, isolated_app , bildirimlerinde isolatedProcess=true olan uygulama hizmetleri için 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 özniteliği 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, öznitelikle ilişkili etki alanları veya türler listesine otomatik olarak genişletilir. Bazı dikkate değer özellikler şunlardır:

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

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 yaygın durumları ele almak için 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;

Daha fazla yararlı makro örneği 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 olduğunda makrolar kullanılmalıdır.

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

Güvenlik İçeriği ve Kategoriler

SELinux ilkelerinde hata ayıklarken veya dosyaları etiketlerken ( file_contexts aracılığıyla veya ls -Z çalıştırırken), bir güvenlik bağlamıyla ( etiket olarak da bilinir) karşılaşabilirsiniz. Örneğin: u:r:untrusted_app:s0:c15,c256,c513,c768 . Bir güvenlik bağlamı şu biçime sahiptir: user:role:type:sensitivity[:categories] . Genellikle bir bağlamın user , role ve sensitivity alanlarını yok sayabilirsiniz (bkz. Özgüllük ). type alanı önceki bölümde açıklanmıştır. categories , SELinux'daki Çok Düzeyli Güvenlik (MLS) desteğinin bir parçasıdır. Android S'den bu yana, kategoriler şunlar için kullanılır:

  • Uygulama verilerini başka bir uygulamanın erişiminden ayırın,
  • Uygulama verilerini bir fiziksel kullanıcıdan diğerine ayırı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 ilkelerin çoğu, Çekirdek İlke Dili kullanılarak tanımlanır. Ortak Orta Düzey Dili (CIL) kullanmanın 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 duyarlılıkları kullanılmaz. Varsayılan s0 duyarlılığı her zaman ayarlıdır.
  • SELinux boolean'ları kullanılmaz. İlke bir cihaz için oluşturulduktan sonra, cihazın durumuna bağlı değildir. Bu, ilkelerin denetlenmesini ve hata ayıklamasını basitleştirir.