Merhabalar,
Bu makalemde, linux sistemlerde ekstra bir güvenlik sistemi olan SELinux hakkında bilgilendirmeler yapacağım. Esasen uzun bir konu ve ilerleyen adımları oldukça teknik olan bir konu. Bundan dolayı, bu makalede giriş niteliğinde ve çok teknik işlemlere girmeden, ana hatlarıyla SELinux’un ne olduğuyla ilgili bilgileri aktaracağım. Kendi içinde bir seri gibi düşünebiliriz. Konu biraz kafamızda şekillendiğinde ise ilerleyen makalelerle birlikte teknik işlere de başlarız.
Dilerseniz başlayalım…
SELinux, Linux çekirdeğinde bir Mandatory Access Control-MAC (Zorunlu Erişim Kontrolü) izin sisteminin bir uygulamasıdır. Bu tip erişim kontrolü, bir kaynağa erişimin nasıl sağlandığı açısından bakıldığında, Access Control List (ACL)‘lerden ve standart unix ugo/rwx izinleri gibi Discretionary Access Control-DAC (İsteğe Bağlı Erişim Kontrol) sistemlerinden farklıdır. Her işlem ve sistem kaynağının, SELinux context adı verilen özel bir güvenlik etiketi vardır. Bazen bir SELinux label olarak adlandırılan bir SELinux context’i, sistem düzeyindeki ayrıntıları soyutlayan ve nesnelerin güvenlik özelliklerine odaklanan bir tanımlayıcı olabilir. Bu durum, yalnızca SELinux politikasındaki nesnelere, tutarlı bir referans verme yöntemi sağlamakla kalmaz, aynı zamanda diğer tanımlama yöntemlerinde bulunabilecek herhangi bir belirsizliği de ortadan kaldırır. Örneğin, bir dosya, bir sistemde birden çok geçerli yol adına sahip olabilir ve farklı isimlerle mount edilmiş olabilir. Dolayısıyla her isim için mi kural yazılacak, farklı isimlerle mount edilirse nasıl bir davranış sergilenecek?
SELinux politikası bu context’leri, süreçlerin birbirleriyle ve çeşitli sistem kaynaklarıyla nasıl etkileşime girebileceğini tanımlayan bir dizi kuralda kullanır. Default olarak, bir kural ile açıkça erişim izni verilmedikçe, uygulanan politika, herhangi bir etkileşime izin vermez.
Özetle, SELinux temel olarak şu soruyu yanıtlar:
<konu> , <nesneye> , <eylem> yapabilir mi?
Örneğin, bir web sunucusu, kullanıcıların ev dizinlerindeki dosyalara erişebilir mi?
Böylece, Security Enhanced Linux (SELinux), ek bir sistem güvenliği katmanı sağlamış olur.
NOT:
SELinux politika kurallarının, DAC kurallarından sonra kontrol edildiğini unutmamak önemlidir. DAC kuralları önce erişimi reddederse, SELinux politika kuralları uygulanmaz. Dolayısıyla bu, geleneksel DAC kuralları erişimi engelliyorsa hiçbir SELinux reddinin loglanmadığı anlamına gelir.
SELinux Mimarisi ve Çalışma Prensibi
SELinux, Linux çekirdeğine yerleştirilmiş bir Linux Güvenlik Modülüdür (Linux Security Module – LSM). Çekirdekteki SELinux alt sistemi, yönetici tarafından kontrol edilen ve önyükleme sırasında yüklenen bir güvenlik politikası tarafından yönlendirilir. Sistemde, çekirdek düzeyindeki, güvenlikle ilgili tüm erişim işlemleri SELinux tarafından durdurulur ve yüklenen güvenlik politikası bağlamında incelenir. Yüklenen politika, işleme izin veriyorsa, devam eder. Aksi takdirde işlem engellenir ve işlem bir hata alır.
Erişime izin verme veya engelleme gibi SELinux kararları önbelleğe alınır. Bu önbellek, Erişim Vektör Önbelleği (Access Vector Cache – AVC) olarak bilinir. Bu önbelleğe alınmış kararlar kullanılırken, SELinux ilke kurallarının daha az kontrol edilmesi sağlanmış olur ve bu da performansı artırır. DAC kuralları önce erişimi reddederse, yukarıda da belirttiğim gibi SELinux politika kurallarının hiçbir etkisi olmadığını unutmayın.
Aşağıdaki diyagram, bu mimaride bahsettiğim akışları çok iyi özetlemektedir.
SELinux Çalışma Seviyeleri
SELinux’un, olası 3 çalışma seviyesi vardır:
- Disabled : SELinux tamamen kapalıdır. Çalışan sistem üzerinde herhangi bir etkisi yoktur.
- Permissive : SELinux etkindir. Politika ihlallerini günlüğe kaydeder, ancak bunları engellemek için hiçbir şey yapmaz.
- Enforcing : SELinux aktiftir ve politikalar tam olarak uygulanır.
SELinux durumunu sisteminizde kontrol etmenin birçok yolu vardır. Bunlardan yaygın olanı, getenforce komutunu kullanmaktır.
getenforce, sadece durumu, yani çalışma seviyesi hakkında bilgi verir. Daha detaylı bilgi almak istersek de aşağıdaki komutu kullanabiliriz.
sestatus
Bu çıktı bize bazı yararlı bilgileri de sağlamaktadır. Bunlardan ilki, SELinuxfs mount point’tir. SELinuxfs, /proc gibi sözde bir dosya sistemidir: runtime’da, Linux çekirdeği tarafından doldurulur ve SELinux durumunu belgelemek için yararlı dosyalar içerir.
SELinux root directory, SELinux yapılandırma dosyalarını saklamak için kullanılan yoldur, ana dizin /etc /selinux/config‘dir (bu dosyaya sembolik bir bağlantı /etc/sysconfig/selinux’da da mevcuttur).
Bu dosyayı doğrudan değiştirmek, selinux durumunu ve modunu değiştirmenin en kolay yoludur. Aşağıdaki komutla, dosya içeriğine kısaca bir göz atalım.
cat /etc/selinux/config
Dosya, gayet anlaşılır yorumlanmıştır: SELINUX ve SELINUXTYPE değişkenlerinin değerlerini değiştirerek, sırasıyla SELinux durumunu ve SELinux modunu ayarlayabiliriz. Şimdi bu modları inceleyelim.
SELinux Çalışma Modları
3 mod bulunur: targeted, minimum ve mls.
SELinux=targeted : targeted mod, default moddur. Bu mod etkin olduğunda hedeflenen tüm işlemler korunur.
SELinux=minimum : Minimum mod, yalnızca belirli işlemlerin korunduğu ilk modun bir alt kümesidir.
SELinux=mls : Multi-Level Security (MLS) politikası, güvenlik sınıflandırması kavramına dayanan en sofistike olanıdır. Sınıflandırılmamıştan çok gizliye: ABD Savunma Bakanlığı için geliştirilen Bell-La Padula modelini kullanır.
SELinux Çalışma Seviyelerini Değiştirme
SELinux çalışma seviyesini değiştirmek için setenforce komutunu kullanabilirsiniz.
Setenforce komutuyla birlikte 0 ve 1 değerlerini kullanarak enforcing ve permissive çalışma seviyelerine geçiş yapılabilir.
Fakat bu komutla yapamayacağınız şey, SELinux’u tamamen devre dışı bırakmaktır. Kalıcı değişiklikler yapmak için, ana konfigürasyon dosyasını aşağıdaki gibi düzenlemeniz gerekir.
nano /etc/selinux/config
Bu dosyada yaptığınız değişiklikler, reboot sonrası aktif olacaktır. Dolayısıyla yaptığınız değişikliklerin etkin olabilmesi için, dosyayı düzenledikten sonra, sisteminizi reboot etmeniz gerekmektedir.
NOT:
Birçok makalede SELinux, setenforce komutuyla permissive moda çekiliyor. Fakat reboot sonrası, kurulan uygulama veya altyapı her ne ise, SELinux yeniden yüklenip aktif hale geleceği için, erişim problemi yaşanabileceği ihtimali belirtilmiyor. Sonra, ara dur problem nerede diye 🙂 Linux’tan soğutmaya gerek yok yeni başlayan arkadaşlarımızı.
Şimdi bir örnekle açıklayayım.
Enforing modda çalışıyoruz diyelim. Permissive moda çekip sunucumu restart edeceğim. Bakalım neler olacak.
Restart sonrası, SELinux durumunu tekrar kontrol ediyorum. 🙂
Gördüğünüz gibi yeniden yüklenmiş ve aktif durumda. Dolayısıyla bu konuya dikkat etmek gerekiyor.
SELinux File Labeling Nedir?
Giriş bölümlerinde, güvenlik etiketlerinden bahsetmiştim. Şimdi bunların ne olduğunu incelemeye başlayalım.
Tüm dosyaların, dizinlerin, aygıtların ve işlemlerin, kendileriyle ilişkili bir güvenlik context’i (veya etiketi) vardır. Dosyalar için bu context, dosya sisteminin genişletilmiş özniteliklerinde saklanır. SELinux ile ilgili sorunlar, genellikle dosya sisteminin yanlış etiketlenmesinden kaynaklanır. file_t içeren bir hata mesajı görürseniz, bu genellikle dosya sistemi etiketlemeyle ilgili bir sorununuz olduğunun iyi bir göstergesidir.
Dosya sistemini yeniden etiketlemenin birkaç yolu vardır:
- /.autorelabel dosyasını oluşturulur ve sunucu yeniden başlatılır.
- SELinux GUI’deki durum görünümü, bir sonraki yeniden başlatmada yeniden etiketleme seçeneği sunar.
- 3 komut satırı yardımcı programı olan, restorecon, setfiles ve fixfiles, dosyalar yeniden etiketlenebilir.
SELinux Context Nedir?
SELinux context’leri, SELinux kullanıcısı, rolü, türü ve düzeyi gibi ek bilgileri içerir. İşlemler, Linux kullanıcıları ve dosyalar üzerindeki erişim kontrolü kararları, bu context bilgisine dayanır. Erişim kontrolü aşağıdaki bilgilere dayanmaktadır:
SELinux user: Linux kullanıcıları SELinux kullanıcılarıyla eşleştirilmiştir.
Role: Domain’ler ve SELinux kullanıcıları arasında aracı görevi gören bir RoleBased Access Control (RBAC) özelliğidir.
Type: İşlemler için bir alan tanımlayan bir Type Enforcement (TE) özniteliğidir.
Level: İsteğe Bağlı Bilgi; Multi-Level Security (MLS) ve MultiCategory Security (MCS)’nin bir özelliğidir.
SELinux Context’ler nasıl görülebilir?
Dosya sistemi context bilgilerini komut satırından görüntülemek için;
ls -Z
NOT: Bu bilgiler ayrıca /etc/selinux/[SELINUXTYPE]/contexts/files dizininde de saklanır.
Bu çıktıyı aşağıdaki gibi yorumlamamız gerekiyor.
Process’lerin context bilgilerini görüntülemek için;
ps -Z
Kullanıcılar hakkındaki SELinux context bilgilerini görüntülemek için;
id -Z
Bu çıktıda, SELinux context, aşağıdaki sözdizimi şeklinde görüntülenir durumdadır.
user:role:type:level
Şematize edersek aşağıdaki gibi yorumlayabiliriz.
Bu kısımdan sonra artık teknik işler başlayacağı için genel hatlarıyla SELinux giriş konusunu burada sonlandırıyorum. İlerleyen makalelerde yapacağımız teknik işlemlerle, daha anlaşılır duruma gelecektir.
Yararlı olması dileğiyle.
Yusuf İşleyen