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 0 ya da vi /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) sadece httpd_sys_content_t tipine sahip dosyaları okuyabilir.
  • Eğer bir dizin default_t etiketiyle işaretliyse, Apache o dizine asla erişemez.

SELinux Modları: Çalışma Biçimleri

SELinux üç farklı modda çalışır:

  1. Enforcing (Önerilen)
    • Kurallar aktif, ihlaller engellenir.
    • Log tutulur.
  2. Permissive (Debug için)
    • Kurallar uygulanmaz, sadece log tutulur.
    • Hataları analiz etmek için idealdir.
  3. 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
    • chcon ile context atarsanız, reboot sonrası kaybolur.
    • semanage fcontext + restorecon kullanı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.