SELinux kavramları hakkında bilgi edinmek için bu sayfayı inceleyin.
Zorunlu erişim denetimi
Güvenliği Artırılmış Linux (SELinux), Linux işletim sistemi için zorunlu erişim kontrolü (MAC) sistemidir. MAC sistemi olarak, Linux'un bilinen isteğe bağlı erişim kontrolü (DAC) sisteminden farklıdır. Bir DAC sisteminde, belirli bir kaynağın sahibinin, kaynakla ilişkili erişim izinlerini kontrol ettiği bir sahiplik kavramı vardır. Bu genellikle kaba tanelidir ve istenmeyen ayrıcalık artışına tabidir. Ancak bir 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, opak bir güvenlik nesnesinde depolanan bilgiler temelinde işlemin izin verilip verilmeyeceğini belirlemek için bir LSM kanca işlevi çağrılır. SELinux, erişim kararlarını belirlemek için kendi politikasıyla birleşen bu kancaların ve güvenlik nesnelerinin yönetimi için bir uygulama sağlar.
Android'in erişim kontrolü politikası, diğer Android güvenlik önlemleriyle birlikte güvenliği ihlal edilmiş makinelerin ve hesapların verebileceği olası zararı büyük ölçüde sınırlar. Android'in isteğe bağlı ve zorunlu erişim kontrolleri gibi araçları kullanarak yazılımınızın yalnızca minimum ayrıcalık düzeyinde çalışmasını sağlayabilirsiniz. Bu, saldırıların etkilerini azaltır ve hatalı işlemlerin verilerin üzerine yazma veya verileri iletme olasılığını düşürür.
Android 4.3 ve sonraki sürümlerde SELinux, geleneksel isteğe bağlı erişim denetimi (DAC) ortamları üzerinde zorunlu erişim denetimi (MAC) şemsiyesi sağlar. Örneğin, yazılımların ham blok cihazlara yazmak için genellikle root kullanıcı hesabı olarak çalışması gerekir. Geleneksel bir DAC tabanlı Linux ortamında, root kullanıcısının güvenliği ihlal edilirse bu kullanıcı her bir ham blok cihazına yazabilir. Ancak SELinux, bu cihazları etiketlemek için kullanılabilir. Böylece, kök ayrıcalığı atanan işlem yalnızca ilişkili politikada belirtilenlere yazabilir. Bu şekilde, işlem belirli ham blok cihazının dışındaki verilerin ve sistem ayarlarının üzerine yazılamaz.
Tehditlerle ilgili daha fazla örnek ve SELinux ile bu tehditlerin nasıl ele alınacağı hakkında bilgi edinmek 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 günlüğe 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 ikilidir ve 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 yararlıdır.
Türler, özellikler ve kurallar
Android, politikası için SELinux'un Tür Uygulama (TE) bileşenini kullanır. Bu, tüm nesnelerin (ör. dosya, işlem veya soket) kendileriyle ilişkili bir türe sahip olduğu anlamına gelir. Örneğin, bir uygulama varsayılan olarak untrusted_app
türündedir. Bir sürecin türü, alanı olarak da bilinir. Bir türü bir veya daha fazla özellikle açıklama eklemek mümkündür. Özellikler, aynı anda birden fazla türe başvurmak için kullanışlıdır.
Nesneler sınıflarla (örneğin, dosya, dizin, sembolik bağlantı, soket) eşlenir 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ının bir parçası olarak düzenli şekilde 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.
Politika kuralı şu biçimde olur:
allow source target:class permissions;
Burada:
- Kaynak: Kuralın konusunun türü (veya özelliği). Erişimi kim istiyor?
- Hedef: Nesnenin türü (veya özelliği). Erişim hangi öğe için isteniyor?
- Sınıf: Erişilen nesnenin türü (ör. dosya, soket).
- İzinler: Gerçekleştirilen işlem (veya işlemler grubu) (örneğin, okuma, yazma).
Bir 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ğini gösterir. Uygulamalar için başka türler de vardır. Örneğin, manifest dosyasında isolated_app
bulunan uygulama hizmetleri için isolatedProcess=true
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ıldığında bu ad, özellikle ilişkili alanların veya türlerin listesine otomatik olarak genişletilir. Önemli özelliklerden bazıları şunlardır:
domain
- Tüm işlem türleriyle ilişkili özellik,file_type
: Tüm dosya türleriyle ilişkilendirilmiş ö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 üzerinde stat
işlevini çağırmak için yeterli değildir. Android, kural tanımını basitleştirmek için en yaygın durumları ele alan bir dizi makro sağlar. Örneğin, open
gibi eksik izinleri eklemek için yukarıdaki kural şu şekilde yeniden yazılabilir:
allow appdomain app_data_file:file rw_file_perms;
Faydalı makrolara dair daha fazla örnek için global_macros
ve te_macros
dosyalarına bakın. İlgili izinlerin reddedilmesi nedeniyle hataların oluşma olasılığını azaltmak 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 bilgi için SELinux'u uygulama başlıklı makaleyi inceleyin. 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
kullanılarak ya da ls -Z
ile) bir güvenlik bağlamıyla (etiket olarak da bilinir) 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 (Özellik bölümüne bakın). 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 12 ve sonraki sürümlerde kategoriler şu amaçlarla kullanılır:
- Uygulama verilerinin başka bir uygulama tarafından erişilmesini engelleme,
- Uygulama verilerini bir fiziksel kullanıcıdan diğerine ayırın.
Belirginlik
Android, SELinux'un sağladığı tüm özellikleri kullanmaz. Harici dokümanları okurken aşağıdaki noktaları göz önünde bulundurun:
- AOSP'deki politikaların çoğu çekirdek politikası dili kullanılarak tanımlanır. Common Intermediate Language (CIL) kullanımıyla ilgili bazı istisnalar vardır.
- SELinux kullanıcıları kullanılmaz. Tek kullanıcı tanımlı hizmet
u
. Gerekli durumlarda, fiziksel kullanıcılar bir güvenlik bağlamının kategoriler 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:
Özneler için
r
, nesneler içinobject_r
. - SELinux hassasiyetleri kullanılmaz. Varsayılan
s0
hassasiyeti her zaman ayarlanır. - SELinux boole'ları kullanılmaz. Bir cihaz için politika oluşturulduğunda cihazın durumuna bağlı değildir. Bu, politikaların denetlenmesini ve hatalarının ayıklanmasını kolaylaştırır.