Takip et

SELinux Nedir? Kapsamlı Bir Teknik Rehber

SELinux Nedir? Kapsamlı Bir Teknik Rehber Linux tabanlı sistemlerde güvenlik, her zaman öncelikli konulardan biri olmuştur. Geleneksel olarak,

SELinux Nedir? Kapsamlı Bir Teknik Rehber

Linux tabanlı sistemlerde güvenlik, her zaman öncelikli konulardan biri olmuştur. Geleneksel olarak, Linux sistemleri kullanıcı ve grup tabanlı erişim kontrolü (Discretionary Access Control – DAC) ile çalışır. Ancak bu model, bazı gelişmiş saldırı vektörlerine karşı yeterli koruma sağlayamayabilir. İşte tam bu noktada, güvenlik mimarisini kökten değiştiren ve Mandatory Access Control (MAC) adı verilen zorunlu erişim kontrolünü getiren bir teknoloji devreye girer: SELinux (Security-Enhanced Linux).

SELinux, Amerika Birleşik Devletleri Ulusal Güvenlik Ajansı (NSA) tarafından geliştirilmiş ve Linux çekirdeğine entegre edilmiş bir güvenlik mekanizmasıdır. Amacı, sistemdeki her bir sürecin ve dosyanın, belirli bir güvenlik politikası çerçevesinde ne yapabileceğini veya neye erişebileceğini kesin olarak tanımlamaktır. Bu, potansiyel bir güvenlik açığının veya kötü niyetli bir sürecin sistemin tamamına zarar vermesini engellemek için önemli bir katman sağlar. DAC’den farklı olarak, SELinux’ta bir süreç, DAC izinlerine sahip olsa bile, SELinux politikası buna izin vermediği sürece belirli bir kaynağa erişemez. Bu rehberde, SELinux’un temellerini, çalışma prensiplerini, yönetimini ve pratik kullanım senaryolarını detaylı bir şekilde inceleyeceğiz.

SELinux’un Temel Çalışma Prensibi ve Mimarisi

SELinux’un gücü, sistemdeki tüm kaynaklara (dosyalar, dizinler, ağ portları, süreçler vb.) güvenlik bağlamları (security contexts) ataması ve bu bağlamlar arasındaki etkileşimleri bir politika (policy) aracılığıyla zorunlu kılmasıyla ortaya çıkar.

DAC vs. MAC: Güvenliğe Farklı Yaklaşımlar

* Discretionary Access Control (DAC): Geleneksel Linux izin sistemi (rwx). Bir dosyanın sahibi, o dosya üzerindeki izinleri başkalarına verme veya kaldırma yetkisine sahiptir. Bu, kullanıcıların kendi dosyaları üzerinde tam kontrole sahip olmalarını sağlar ancak bir uygulamanın veya kullanıcının ele geçirilmesi durumunda, sahip olduğu tüm izinlerle sistemde serbestçe hareket edebilir.
* Mandatory Access Control (MAC): SELinux’un kullandığı modeldir. Sistem yöneticisi tarafından merkezi olarak tanımlanan ve zorunlu kılınan kurallar bütünüdür. Bir kullanıcının veya sürecin, DAC izinleri olsa bile, SELinux politikası buna izin vermediği sürece bir kaynağa erişemez. Bu, en az ayrıcalık (least privilege) prensibini uygulayarak, sistemin saldırı yüzeyini önemli ölçüde azaltır.

Güvenlik Bağlamları (Security Contexts)

SELinux’un temel yapı taşıdır. Her dosya, dizin, süreç, ağ portu gibi sistem kaynağının bir güvenlik bağlamı vardır. Bir bağlam genellikle dört ana bileşenden oluşur: user:role:type:level.
* User (Kullanıcı): SELinux kullanıcısı. Genellikle Linux kullanıcılarıyla eşleşmezler. Örnek: unconfined_u, system_u.
* Role (Rol): SELinux rolü. Kullanıcıların hangi tür süreçleri çalıştırabileceğini veya hangi kaynaklara erişebileceğini tanımlar. Örnek: system_r, object_r.
* Type (Tip): En önemli bileşendir. Bir dosyanın veya sürecin işlevini tanımlar. SELinux politikası, tipler arasındaki etkileşimleri kurallarla belirler. Örnek: httpd_t (Apache süreci), httpd_sys_content_t (Apache’nin sunabileceği dosyalar).
* Level (Seviye): Çoğunlukla Çok Seviyeli Güvenlik (Multi-Level Security – MLS) veya Çok Kategorili Güvenlik (Multi-Category Security – MCS) sistemlerinde kullanılır. Örnek: s0:c0.c1023. Genel kullanımda genellikle s0 olarak kalır ve nadiren değiştirilir.

Örnek Bağlam: /var/www/html/index.html dosyasının bağlamı system_u:object_r:httpd_sys_content_t:s0 olabilir. Bu, dosyanın system_u SELinux kullanıcısına, object_r rolüne ve httpd_sys_content_t tipine ait olduğunu gösterir. Apache süreci (httpd_t tipinde), bu httpd_sys_content_t tipindeki dosyalara erişim iznine sahip olacak şekilde politika tarafından tanımlanmıştır.

SELinux Modları

SELinux üç ana modda çalışabilir:
* Enforcing (Zorunlu): Varsayılan ve en güvenli moddur. SELinux politikasına uymayan tüm eylemleri engeller ve bu olayları loglar.
* Permissive (İzin Verici): SELinux politikasına uymayan eylemleri engellemez, ancak bu olayları loglar. Hata ayıklama ve politika geliştirme aşamalarında çok kullanışlıdır.
* Disabled (Devre Dışı): SELinux tamamen kapalıdır ve hiçbir güvenlik kontrolü sağlamaz. Güvenlik açısından tavsiye edilmez.

Politika (Policy)

SELinux’un kalbidir. Sistemdeki tüm güvenlik bağlamları arasındaki izin verilen ve verilmeyen etkileşimleri tanımlayan kurallar bütünüdür. Politika, çekirdek tarafından yüklenen ikili dosyalardır ve genellikle dağıtıma özel olarak optimize edilmiştir (örneğin, targeted veya mls politikaları). Çoğu kullanıcı için targeted politikası yeterlidir; bu politika, kritik sistem servislerini korur ve kullanıcıların kendi dosyaları üzerinde daha fazla esneklik sağlar.

SELinux Yönetimi ve Temel Komutlar

SELinux’u etkin bir şekilde yönetmek için çeşitli komutlara ve araçlara ihtiyaç duyarız.

SELinux Durumunu Kontrol Etme ve Değiştirme

* Mevcut SELinux modunu öğrenme:

getenforce
    # Çıktı: Enforcing, Permissive veya Disabled

* Daha detaylı SELinux durumu bilgisi:

sestatus

Bu komut, SELinux’un durumunu, politika adını, politika tipini ve diğer detayları gösterir.
* Geçici olarak modu değiştirme:

# Enforcing moda geçmek için:
    sudo setenforce 1
    # Permissive moda geçmek için:
    sudo setenforce 0

Bu değişiklikler yeniden başlatmaya kadar geçerlidir.
* Kalıcı olarak modu değiştirme:
/etc/selinux/config dosyasını düzenleyin.

sudo nano /etc/selinux/config

Dosya içeriği aşağıdaki gibi olabilir:

# This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of these two values:
    #     targeted - Targeted processes are protected,
    #                others are not.
    #     mls      - Multi Level Security protection.
    SELINUXTYPE=targeted

SELINUX= satırını enforcing, permissive veya disabled olarak değiştirin ve sistemi yeniden başlatın.

Dosya Bağlamlarını Görüntüleme ve Değiştirme

* Dosya ve dizinlerin güvenlik bağlamlarını görüntüleme:
ls komutuna -Z parametresi eklenir.

ls -Z /var/www/html/index.html
    # Çıktı: -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
ls -Zd /var/www/html/
    # Çıktı: drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/

* Geçici olarak dosya bağlamını değiştirme:
chcon komutu kullanılır. Bu değişiklikler kalıcı değildir, dosya sistemi yeniden etiketlendiğinde veya restorecon çalıştırıldığında kaybolur.

# /opt/myweb/ dizinindeki bir dosyayı Apache'nin okuyabileceği bir tipe dönüştürme:
    sudo chcon -t httpd_sys_content_t /opt/myweb/index.html
    # Rekürsif olarak bir dizinin içeriğini değiştirme:
    sudo chcon -R -t httpd_sys_content_t /opt/myweb/

* Kalıcı olarak dosya bağlamlarını tanımlama ve uygulama:
Yeni bir dizin oluşturduğunuzda veya bir uygulamanın verilerini standart olmayan bir yere taşıdığınızda bu gereklidir.
semanage fcontext ile bağlam kuralı tanımlanır, restorecon ile bu kural uygulanır.

# /srv/myweb dizini ve içeriği için httpd_sys_content_t tipini tanımlama:
    sudo semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
    # Tanımlanan kuralı dosya sistemine uygulama:
    sudo restorecon -Rv /srv/myweb/

semanage fcontext -l ile mevcut fcontext kurallarını listeleyebilirsiniz.
semanage fcontext -d "/srv/myweb(/.*)?" ile bir kuralı silebilirsiniz.

Boolean Değerleri Yönetme

SELinux politikası, belirli davranışları açıp kapatmanıza olanak tanıyan boolean değerlere sahiptir.
* Tüm boolean değerlerini listeleme:

getsebool -a

* Belirli bir boolean değerini kontrol etme:

getsebool httpd_can_network_connect
    # Çıktı: httpd_can_network_connect --> off

* Boolean değerini değiştirme:
setsebool komutu kullanılır. -P parametresi kalıcı değişiklik sağlar.

# Apache'nin ağ bağlantısı kurmasına izin verme (geçici):
    sudo setsebool httpd_can_network_connect on
    # Apache'nin ağ bağlantısı kurmasına izin verme (kalıcı):
    sudo setsebool -P httpd_can_network_connect on

SELinux İhlallerini Giderme (Troubleshooting)

SELinux ile ilgili sorunların çoğu, bir sürecin erişiminin politika tarafından reddedilmesinden kaynaklanır. Bu reddetmeler audit.log dosyasında kaydedilir.
* Audit loglarını kontrol etme:

sudo tail -f /var/log/audit/audit.log

“AVC denied” mesajlarını arayın. Bu mesajlar, hangi sürecin hangi kaynağa hangi erişimi denediğini ve SELinux’un bunu neden engellediğini gösterir.
* sealert ile sorunları analiz etme:
setroubleshoot-server paketi yüklü ise sealert aracı, audit.log dosyasındaki SELinux ihlallerini insan tarafından okunabilir bir formata çevirir ve genellikle çözüm önerileri sunar.

sudo sealert -a /var/log/audit/audit.log

Bu komut, ihlallerin ayrıntılarını, olası nedenlerini ve nasıl çözüleceğine dair komut örneklerini gösterir (örneğin, bir boolean’ı açma veya bir dosya bağlamını değiştirme).
* audit2allow ile özel politika oluşturma (dikkatli kullanılmalı):
Eğer sealert bir çözüm bulamazsa veya uygulamanızın özel bir davranışı varsa, audit2allow aracı audit.log‘daki reddetmeleri analiz ederek bir özel SELinux politika modülü oluşturmanıza yardımcı olabilir.

# Audit log'daki reddetmeleri analiz et ve önerilen kuralları göster:
    sudo ausearch -c AVC -m avc -ts today | audit2allow -w -a
    # Yeni bir politika modülü (.te) ve paket (.pp) oluştur:
    sudo ausearch -c AVC -m avc -ts today | audit2allow -M myapp_custom
    # Oluşturulan politikayı yükle:
    sudo semodule -i myapp_custom.pp

audit2allow kullanırken çok dikkatli olunmalıdır, çünkü yanlış veya aşırı geniş kurallar güvenlik açıklarına yol açabilir. Genellikle, mevcut boolean’ları kullanmak veya dosya bağlamlarını doğru şekilde ayarlamak tercih edilir.

Pratik Senaryolar ve SELinux İpuçları

SELinux, özellikle sunucu ortamlarında çeşitli servislerin güvenliğini sağlamak için hayati öneme sahiptir. İşte birkaç yaygın senaryo:

Web Sunucusu (Apache/Nginx) İçin SELinux Ayarları

Varsayılan olarak, Apache (httpd_t) veya Nginx (nginx_t) süreçleri sadece belirli SELinux tiplerine sahip dosyalara (httpd_sys_content_t, httpd_user_content_t vb.) erişebilir.
* Web içeriğini standart olmayan bir dizinden sunma:
Diyelim ki web sitenizin dosyalarını /srv/www/html dizininde tutmak istiyorsunuz.

# Dizini oluşturun ve örnek bir dosya ekleyin
    sudo mkdir -p /srv/www/html
    echo "Merhaba SELinux!" | sudo tee /srv/www/html/index.html

    # Dizine ve içeriğine doğru SELinux bağlamını atayın
    sudo semanage fcontext -a -t httpd_sys_content_t "/srv/www/html(/.*)?"
    sudo restorecon -Rv /srv/www/html/

    # Apache/Nginx yapılandırmanızı bu dizini kullanacak şekilde güncelleyin.

* Web sunucusunun ağ üzerinden başka bir servise bağlanması (örneğin veritabanı):
Varsayılan olarak, web sunucusu süreçlerinin dışarıya ağ bağlantısı kurması kısıtlıdır. Eğer web uygulamanız bir veritabanına veya API’ye bağlanacaksa, httpd_can_network_connect boolean’ını açmanız gerekebilir.

sudo setsebool -P httpd_can_network_connect on

Benzer şekilde, eğer web sunucusu bir proxy olarak çalışacaksa, httpd_can_network_connect_http veya httpd_can_network_connect_ftp gibi daha spesifik boolean’lar kullanılabilir.

Dosya Paylaşımı (NFS/Samba) ve SELinux

* NFS/Samba paylaşımları için doğru bağlamları ayarlama:
Eğer /export/data dizinini NFS veya Samba üzerinden paylaşacaksanız, bu dizine public_content_t veya samba_share_t gibi uygun bir tip atamanız gerekebilir.

# /export/data dizini için public_content_t tipini tanımlama:
    sudo semanage fcontext -a -t public_content_t "/export/data(/.*)?"
    sudo restorecon -Rv /export/data/

    # Samba için: Samba'nın ev dizinlerini paylaşmasına izin ver
    sudo setsebool -P samba_enable_home_dirs on
    # Samba'nın genel paylaşımlara yazmasına izin ver
    sudo setsebool -P samba_export_all_rw on

Kullanıcı Home Dizini Güvenliği

Kullanıcıların home dizinleri (/home/kullanici) genellikle user_home_dir_t tipine sahiptir. Bu, diğer kullanıcıların veya yetkisiz süreçlerin bu dizinlere erişimini kısıtlar.

Yeni Servis Kurulumu

Yeni bir uygulama veya servis kurduğunuzda ve çalışmadığında, ilk kontrol etmeniz gereken yerlerden biri SELinux’tur.
1. Modu Permissive’e alın: sudo setenforce 0. Servis şimdi çalışıyorsa, sorun SELinux’tadır.
2. Audit loglarını kontrol edin: sudo tail -f /var/log/audit/audit.log veya sudo sealert -a /var/log/audit/audit.log ile reddetmeleri inceleyin.
3. Önerilen çözümleri uygulayın: sealert‘ın önerdiği boolean değişikliklerini veya dosya bağlam güncellemelerini yapın.
4. Modu tekrar Enforcing’e alın: sudo setenforce 1. Servisin hala çalışıp çalışmadığını kontrol edin.

Sonuç ve Sıkça Sorulan Sorular (SSS)

SELinux, Linux sistemlerinin güvenliğini önemli ölçüde artıran güçlü ve esnek bir zorunlu erişim kontrol mekanizmasıdır. İlk başta karmaşık görünse de, temel prensiplerini ve yönetim komutlarını anlamak, sistemlerinizi daha güvenli hale getirmenize yardımcı olacaktır. SELinux’u devre dışı bırakmak yerine, karşılaşılan sorunları gidermeyi öğrenmek, uzun vadede sistem güvenliğiniz için çok daha faydalıdır. Doğru yapılandırılmış bir SELinux politikası, bir saldırganın sisteme sızması durumunda bile, hasarı sınırlamada kritik bir rol oynar.

Sıkça Sorulan Sorular (SSS)

* SELinux’u tamamen kapatmalı mıyım?
Hayır, genellikle tavsiye edilmez. SELinux, sistemin güvenliğini artıran önemli bir katmandır. Sorun yaşadığınızda, geçici olarak permissive moda alıp audit.log‘ları inceleyerek sorunu çözmeye çalışın.
* SELinux performans düşürür mü?
Çok küçük bir performans düşüşü olabilir, ancak modern donanımlarda bu genellikle ihmal edilebilir düzeydedir ve sağladığı güvenlik faydalarına kıyasla kabul edilebilir.
* Hangi dağıtımlar SELinux kullanır?
Red Hat Enterprise Linux (RHEL), CentOS, Fedora gibi Red Hat tabanlı dağıtımlarda varsayılan olarak etkin ve sıkı bir şekilde entegre edilmiştir. Debian ve Ubuntu gibi diğer dağıtımlar da SELinux’u destekler, ancak genellikle varsayılan olarak AppArmor gibi başka bir MAC sistemi veya hiçbiri etkin değildir.
* SELinux problemleri nasıl çözerim?
audit.log dosyasını kontrol edin, sealert -a /var/log/audit/audit.log komutunu kullanarak sorunları analiz edin ve önerilen çözümleri uygulayın (boolean’ları değiştirme, dosya bağlamlarını ayarlama). Gerekirse, geçici olarak permissive moda geçerek hata ayıklama yapabilirsiniz.
* SELinux ile AppArmor arasındaki fark nedir?
Her ikisi de birer MAC sistemidir.
* SELinux: Tip tabanlıdır. Her dosya, süreç ve port bir “tip” ile etiketlenir ve politika bu tipler arasındaki etkileşimleri kontrol eder. Daha karmaşık ve güçlüdür, ancak öğrenme eğrisi daha diktir.
* AppArmor: Yol tabanlıdır. Uygulamaların dosya sistemi üzerindeki belirli yollara erişimini kontrol eder. Genellikle daha basit ve yönetimi kolaydır, ancak SELinux kadar kapsamlı olmayabilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.