SELinux

Eyl 06, 2013

SELinux olarak bilinen Security-Enhanced Linux, Linux’a güvenlik açısından hangi ekstra özelliklerin eklenebileceğinin bir araştırması olarak, geliştirilmiş güvenlik özellikleri ve zorunlu giriş kontrolleri içeren ve Linux Kernel'in (Linux çekirdeğinin) ön ürünü olarak piyasa sunulan bir çekirdek yapısıdır. SELinux ilk olarak National Security Agency tarafından 1999 yılında askeri projelerde kullanılmak üzere ordu için geliştirilmiştir. Sonrasında SELinux eklentisi, 2.6 serisi çekirdekler ile birlikte Linux çekirdeğine eklenmiştir.

Geleneksel UNIX modelinde, DAC (Discretionary Access Control-İsteğe Bağlı Erişim Kontrolü) ile kaynaklara erişim denetimi yalnızca kullanıcı kimliği ve nesne sahipliği ile sınanmaktadır. Ancak bu model, bir kullanıcının sistem üzerinde güvenlik açığı olan bir programı çalıştırması durumunda, programın kullanıcının yetkisi olan tüm kaynaklara erişmesine de izin vermektedir. SELinux ise Linux çekirdeği için geliştirilmiş zorunlu bir erişim denetimi MAC (Mandatory Access Control-Zorunlu Erişim Kontrolü) mekanizmasıdır. Bir saldırgan programdaki hatalardan faydalanarak programı amacı dışında çalıştırmayı denese de, SELinux çekirdek eklentisi bu durumu tespit ederek engeller. SELinux ile bir Linux sistemi üzerindeki tüm öznelere (kullanıcılar, programlar ve süreçler) ve tüm nesnelere (dosyalar, aygıtlar vb.) ilişkin son derece kapsamlı erişim denetim kuralları tanımlanabilir. Özellikle hizmet sunucu yazılımlar için (Apache, Postfix, MySQL) var olan SELinux kural kümelerinin rafine edilip geliştirilmesi sonrasında sunucu güvenliğinin daha üst seviyelere taşınması konusunda önemli bir katkısı görülecektir.

SELinux'un Çalışması

SELinux, kullanıcı programlarına ve sistem sunucularına zorunlu giriş kontrolleri sunarak, yapmaları gerekli olan işlemleri mümkün olan en az yetki ile gerçekleştirmeleri için sınırlandırma imkanı sağlar. Bu yolla sistem uygulamalarının eksik yapılandırma dosyaları veya programlara ayrılan belleğin taşması gibi sistemde hataya sebep olabilecek durumların etkileri saf dışı bırakılır veya mümkün olan en düşük seviyeye indirilir. Bu kısıtlama mekanizması, bilinen "Linux Erişim Kontrolü"nden bağımsız olarak çalışır. “root” ya da “super-user” gibi kullanıcılar olmadığı gibi Linux'un geleneksel güvenlik mekanizmasının, uid'ye (user id-kullanıcı kimliği) bağımlı kalmak gibi, bilinen kısayollarını da kullanmaz. SELinux  sıralı sayı kullanan işlemlere rastgele sayı vererek bir güvenlik önlemi sağlar. Örneğin fork() sistem çağrısında kullanılan get_pid() işlevinin sıralı pid'ler (process id-işlem kimliği) dönmesinden ziyade rastgele ve tahmin edilemeyecek pid numaraları döndürmesini sağlar.

Üzerinde değişiklik yapılmamış olan Linux sistemlerin güvenliği; çekirdeğin, ayrıcalıklı uygulamaların ve bunların yapılandırma dosyalarının doğruluğuna bağlıdır. Bunların herhangi birinde oluşabilecek bir hata sisteme giriş için bir açık oluşturabilir. SELinux çekirdek eklentisine dayalı değiştirilmiş sistemler üzerinde ise güvenlik öncelikli olarak kernel(çekirdek) ve çekirdeğin security policy(güvenlik ilkeleri) yapılandırmasına bağlıdır. Kullanılan programların yapılandırma hataları veya sistem uygulamaları üzerindeki kullanıcı hataları sadece o programı ya da sistem uygulamasını etkiler, diğer programlar veya uygulamalar üzerinde bir hataya ya da güvenlik açığına sebep olmaz. SELinux’un yeni özellikleri gizlilik ve bütünlüğe dayalı bilgilerin ayrılmasının güçlendirilmesi amacıyla geliştirilmiştir. Süreçleri; zararlı veri ve programların okunmasından, sıkıştırılmasından, güvenliğe ait uygulamaların safdışı bırakılmasından, güvenilir olmayan programların sistem üzerinde çalıştırılmasından ve sistem güvenlik politikasına zarar verecek uygulamaların çalıştırılmasından korumak amacıyla tasarlanmıştır. Ayrıca sistem uygulama ve program bilgilerine ve dosyalarına farklı güvenlik yetkilerine sahip kullanıcılar tarafından güvenlik açığı oluşturmadan ulaşılmasını sağlar.

SELinux’ta herşey güvenlik sınıflarına bağlıdır. SELinux, kullanıcıların atandıkları güvenlik seviyeleri için etiketlenen servislerin kullanmasını zorunlu kılan, zorunlu bir erişim kontrol şeklidir. Herbir süreç ve onun etki ettiği dosya ya da işlem kendisiyle alakalı bir güvenlik sınıfına sahiptir. Örneğin: Bu güvenlik sınıfı bir dosya ile alakalı ise o zaman "dosya_sınıfı adı" adını alır. SELinux'ta bu güvenlik sınıfları "kullanıcılar", "roller", "çeşitler" ve FedoraCore 5'ten itibaren oluşturulan "MLS" (multilevel security model-çok seviyeli güvenlik modeli) olmak üzere dört bileşenden oluşur.

SELinux’un Kapatılması

SELinux'un getirmiş olduğu birçok yenilik ve güvenlik denetimi ile birlikte, bazı ağ servislerinin kararlı bir biçimde çalıştırılabilmesi için SELinux'un kapatılması gerekir. SELinux'u bir oturum süresince veya kalıcı olarak devre dışı bırakmak, etkinleştirmek ve durumunu gözlemlemek için aşağıdaki adımlar izlenebilir:

  • SELinux'un o anki durumunu görüntülemek için:
    # getenforce
    Komut çıktısında "Disabled" (devre dışı) ya da "Enabled" (etkin) ifadesi yer alacaktır.

  • SELinux'u o oturum süresince devre dışı bırakmak için;
    # setenforce 0
  •  SELinux'u tekrar devreye almak için;
    # setenforce 1
  • SELinux'u her oturumda devre dışı bırakmak için;
    1. /etc/grub.conf veya /etc/lilo.conf dosyasına selinux=0 satırı eklenebilir.
      ya da
    2. /etc/sysconfig/selinux dosyasındaki SELINUX=enabled ifadesi SELINUX=disabled olarak değiştirilir.