Linux sistemlerinde sık sık karşılaşılan bir durum vardır:
- Yeni bir uygulama kurarsınız.
- Servisi başlatırsınız.
- Çalışmaz…
- Loglara bakarsınız: “Permission denied” veya “Access denied by SELinux.”
- İlk refleks:
setenforce 0ya davi /etc/selinux/config → SELINUX=disabled
Bu davranış kısa vadede sorunları çözer gibi görünse de aslında sistemi saldırılara açık hale getirir. Çünkü SELinux, Linux’un sunduğu en güçlü güvenlik mekanizmalarından biridir. Onu kapatmak yerine anlamak, hem güvenlik hem de sistem kararlılığı açısından kritik önemdedir.
SELinux’un Temel Mantığı
SELinux (Security-Enhanced Linux), klasik Linux izin sisteminden farklı olarak Zorunlu Erişim Kontrolü (Mandatory Access Control – MAC) uygular.
- Normal Linux izinleri: Kullanıcı, grup ve diğerleri → Kim erişebilir?
- SELinux: Context tabanlı denetim → Hangi işlem hangi dosyaya nasıl erişebilir?
SELinux Context Nedir?
Her dosya, dizin ve process bir etiket (context) ile işaretlenir. Bu context üç parçadan oluşur:
Örneğin:
system_u:object_r:httpd_sys_content_t:s0
- user → SELinux kullanıcısı (system_u gibi)
- role → Rol (object_r gibi)
- type → Asıl belirleyici etiket (ör. httpd_sys_content_t)
- level → Güvenlik seviyesi (s0 gibi)
Asıl kritik kısım type (tip/etiket)’tir. Çünkü policy kuralları bu alan üzerinden tanımlanır.
Örnek:
- Apache (
httpd) sadecehttpd_sys_content_ttipine sahip dosyaları okuyabilir. - Eğer bir dizin
default_tetiketiyle işaretliyse, Apache o dizine asla erişemez.
SELinux Modları: Çalışma Biçimleri
SELinux üç farklı modda çalışır:
- Enforcing (Önerilen)
- Kurallar aktif, ihlaller engellenir.
- Log tutulur.
- Permissive (Debug için)
- Kurallar uygulanmaz, sadece log tutulur.
- Hataları analiz etmek için idealdir.
- Disabled (Tehlikeli)
- SELinux tamamen kapalıdır.
- Güvenlik politikaları uygulanmaz.
Mod Kontrolü
getenforce
sestatus
Mod Değiştirme
- Geçici (yeniden başlatmaya kadar):
setenforce 0 # Permissive setenforce 1 # Enforcing - Kalıcı:
vi /etc/selinux/config SELINUX=enforcing
SELinux Sorunlarını Teşhis Etme
Bir servis çalışmıyorsa ve loglarda anlamlı bir şey yoksa, ilk iş SELinux loglarını incelemek olmalı.
sudo ausearch -m AVC,USER_AVC -ts recent
-m AVC,USER_AVC→ Erişim engellemeleri (Access Vector Cache)-ts recent→ Son olayları getirir
Burada hangi process’in, hangi dosya/dizine erişiminin reddedildiğini görebilirsiniz.
Ek olarak, engellemenin sebebini anlamak için:
ausearch -m AVC -ts recent | audit2why
Gerçek Hayat Senaryosu: Apache ile Yeni DocumentRoot
1. Yeni Dizin ve Dosya
sudo mkdir -p /data/web
echo "SELinux policy test sayfası" | sudo tee /data/web/index.html
2. Apache Konfigürasyonunu Değiştir
sudo sed -i 's|DocumentRoot "/var/www/html"|DocumentRoot "/data/web"|' /etc/httpd/conf/httpd.conf
sudo sed -i 's|<Directory "/var/www/html">|<Directory "/data/web">|' /etc/httpd/conf/httpd.conf
sudo systemctl restart httpd
3. Erişim Testi
curl -I http://localhost/index.html
Sonuç:
HTTP/1.1 403 Forbidden
Sorun SELinux context uyuşmazlığı.
Çözüm Adımları
4. Engellemeyi Doğrula
ausearch -m AVC,USER_AVC -ts recent
5. Policy Modülü Oluştur
ausearch -m AVC -ts recent > /tmp/selinux_denied.log
audit2allow -M custom_httpd -i /tmp/selinux_denied.log
6. Policy Modülünü Yükle
semodule -i custom_httpd.pp
7. Doğru Context Ataması
semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"
restorecon -Rv /data/web
Artık Apache, /data/web altındaki dosyalara erişebilecek.
Ekstra Araçlar
- semanage → Kalıcı context tanımlamaları için
semanage fcontext -l | grep httpd - restorecon → Yanlış context’i düzeltmek için
restorecon -Rv /data/web - audit2why → Engellemelerin nedenlerini açıklar
- semodule -r → Yanlış oluşturulan policy modüllerini kaldırır
- Port Etiketleme
Apache farklı bir port dinleyecekse SELinux’a bunu bildirmelisiniz:semanage port -a -t http_port_t -p tcp 8080 - Geçici vs Kalıcı Çözümler
chconile context atarsanız, reboot sonrası kaybolur.semanage fcontext+restoreconkullanırsanız kalıcı olur.
- Kendi Modülünüzü Geliştirme
Bir uygulamanın farklı kaynaklara sürekli ihtiyaç duyduğunu görüyorsanız, özel bir SELinux policy modülü geliştirmek en doğru çözümdür.