SELinux Policy Yönetimi ve Üretim Ortamlarında Sorun Giderme Kılavuzu
Sunucu güvenliğinde zorunlu erişim kontrolü (MAC) mekanizmalarının rolü yadsınamaz. SELinux (Security-Enhanced Linux), işletim sistemine ekstra bir güvenlik katmanı ekleyerek, geleneksel isteğe bağlı erişim kontrolünden (DAC) çok daha granüler yetkilendirme sağlar. Bu makale, SELinux politikalarını etkin bir şekilde yönetme ve üretim ortamlarında karşılaşılan sorunları profesyonelce giderme tekniklerini ele almaktadır.
SELinux Temelleri ve Çalışma Modları
SELinux, üç ana çalışma moduna sahiptir: Enforcing, Permissive ve Disabled. Üretim ortamlarında hedefimiz her zaman Enforcing modunda çalışmak olmalıdır. Ancak sorun giderme aşamasında Permissive moduna geçmek, izin hatalarını tespit etmede faydalı olabilir.
# Mevcut SELinux durumunu kontrol etme
sestatus
# SELinux'u Permissive moda alma (geçici)
setenforce 0
# SELinux'u Enforcing moda alma (geçici)
setenforce 1SELinux Policy Yönetimi Komutları
SELinux policy yönetiminde temel araçlar semanage, setsebool ve restorecon komutlarıdır. Bu komutlar, sistemin varsayılan güvenlik bağlamlarını esnetmek veya özelleştirmek için kullanılır.
semanage ile Özelleştirilmiş Kurallar
semanage, dosya bağlamları, port tanımları ve kullanıcı eşlemeleri gibi kalıcı SELinux kurallarını yönetmek için kullanılır. Bu komut ile yapılan değişiklikler yeniden başlatmalarda korunur.
Senaryo 1: Standart Dışı Portta Çalışan Nginx ve Özel İçerik Dizini
Bir üretim ortamında Nginx web sunucusu, standart 80 veya 443 portu yerine 8080 portunda çalışıyor ve içeriklerini `/data/web` dizininden sunuyor. Varsayılan SELinux politikası bu duruma izin vermeyecektir. Aşağıdaki komutlarla gerekli izinleri tanımlayabiliriz:
# Nginx'in 8080 TCP portunu dinlemesine izin verme
semanage port -a -t http_port_t -p tcp 8080
# /data/web dizinine ve altındaki tüm dosyalara httpd_sys_content_t bağlamını atama
semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"
# Atanan bağlamı dosya sistemine uygulama
restorecon -Rv /data/webİlk komut, http_port_t tipine 8080/tcp portunu ekleyerek Nginx'in bu portu kullanabilmesini sağlar. İkinci komut, `/data/web` dizini için kalıcı bir dosya bağlamı kuralı tanımlar. Son komut ise bu kuralı dosya sistemindeki gerçek dosyalara uygular.
setsebool ile Boolean Yönetimi
SELinux boolean'ları, sistem genelindeki belirli davranışları kontrol eden on/off anahtarlarıdır. Bunlar genellikle bir servisin ağa bağlanma, ev dizinlerine yazma gibi yeteneklerini ayarlar.
Senaryo 2: PHP Uygulamasının Uzak Veritabanına Bağlantı İzni
Bir PHP tabanlı web uygulaması, HTTPd servisi altında çalışırken uzak bir veritabanına (örneğin, AWS RDS) bağlanmaya çalışıyor. Varsayılan SELinux politikası, HTTPd'nin ağ üzerinden dışarıya bağlantı kurmasını engelleyebilir. Bu durumda httpd_can_network_connect boolean'ını etkinleştirmemiz gerekir:
# HTTPd ile ilgili boolean'ları listeleme
getsebool -a | grep httpd
# HTTPd'nin ağ üzerinden dışarıya bağlantı kurmasına izin verme ve kalıcı hale getirme
setsebool -P httpd_can_network_connect on-P anahtarı, değişikliğin kalıcı olmasını ve sistem yeniden başlatıldığında da geçerli kalmasını sağlar.
SELinux Sorun Giderme Teknikleri
SELinux, bir erişimi engellediğinde, bu olayı `/var/log/audit/audit.log` dosyasına kaydeder. Sorun gidermenin temelini bu log kayıtlarının analizi oluşturur.
audit.log Analizi ve Otomatik Kural Oluşturma
audit.log dosyasındaki AVC (Access Vector Cache) mesajları, SELinux'un engellediği erişim denemelerini gösterir. audit2allow aracı, bu log kayıtlarından otomatik olarak özel SELinux politikaları oluşturabilir.
Senaryo 3: Yeni Kurulan Python Uygulamasında Erişim Hatası
`/opt/myapp` altına yeni bir Python tabanlı arka uç uygulaması kuruldu. Uygulama, başlangıçta bir dosyaya yazmaya veya belirli bir soketi açmaya çalışırken izin hatası veriyor. Permissive moda alıp veya audit log'larını incelediğimizde AVC hataları görüyoruz.
# Python uygulamasının neden olduğu AVC hatalarını filtrele ve otomatik policy oluştur
grep 'python' /var/log/audit/audit.log | audit2allow -M pythonapp
# Oluşturulan policy dosyasını (pythonapp.pp) sisteme yükle
semodule -i pythonapp.ppBu işlem, Python uygulamasının ihtiyaç duyduğu izinleri içeren özel bir SELinux modülü oluşturur ve yükler. Ancak bu yaklaşım, uygulamanın gerçekten ihtiyaç duyduğu en az yetki prensibini ihlal edebileceği için dikkatle kullanılmalıdır. Genellikle mevcut tipleri genişletmek veya yeni tipler tanımlamak daha güvenli bir yaklaşımdır.
sealert ve setroubleshoot
setroubleshoot-server paketi, SELinux sorunlarını daha kullanıcı dostu bir şekilde raporlamak ve olası çözümler sunmak için kullanılır. sealert komutu, audit.log'daki hataları analiz eder ve insan tarafından okunabilir raporlar üretir.
# Audit logundaki hataları analiz et ve raporla
sealert -a /var/log/audit/audit.logBu araçlar, özellikle karmaşık hata mesajlarını anlamakta zorlandığınızda değerli bilgiler sağlar ve genellikle sorunu çözmek için doğrudan komut önerileri sunar.
Üretim Ortamları İçin SELinux En İyi Uygulamaları
SELinux'u üretimde yönetirken proaktif ve metodik bir yaklaşım sergilemek, güvenlik ve operasyonel verimlilik dengesini kurmanızı sağlar.
- Enforce Modunda Başlangıç: Yeni bir sistem veya uygulama devreye alırken SELinux'u doğrudan
Enforcingmodunda başlatmak ve gerekli izinleri kademeli olarak eklemek en güvenli yaklaşımdır. - Minimum Yetki Prensibi: Uygulamalara ve servislere yalnızca çalışması için kesinlikle gerekli olan izinleri verin. Geniş kapsamlı
audit2allowçıktılarını olduğu gibi uygulamaktan kaçının. - Özel Politikalar: Mevcut tipleri genişletmek veya yeni özel tipler tanımlamak, karmaşık uygulamalar için daha sürdürülebilir bir çözümdür. Örneğin, özel bir uygulama için
my_app_tgibi bir tip tanımlayabilirsiniz. - Düzenli Denetim ve İzleme: SELinux olaylarını (
AVChataları) düzenli olarak izleyin. Merkezi log yönetimi (SIEM) sistemleri ile entegrasyon, güvenlik ihlallerini veya yanlış yapılandırmaları hızla tespit etmenizi sağlar. - Test Ortamları: Yeni bir SELinux politikası değişikliğini veya uygulama dağıtımını her zaman kontrollü bir test ortamında doğrulayın.
Senaryo 4: Kubernetes Ortamında SELinux Uyumluluğu
Kubernetes gibi modern container orkestrasyon platformlarında, pod'ların veya container'ların belirli dosya sistemlerine veya ağ kaynaklarına erişmesi gerektiğinde SELinux kısıtlamaları ortaya çıkabilir. Genellikle `kubelet` veya container runtime'ın SELinux bağlamı altında çalışması ve pod'ların kendi bağlamlarını alması önemlidir. Ancak, özel bir depolama birimini bağlarken veya belirli bir dosya bağlamına ihtiyaç duyarken ek yapılandırmalar gerekebilir. Örneğin, bir pod'un persistent volume'a yazması gerektiğinde, bu volume'un doğru SELinux bağlamına sahip olması şarttır.
# Bir Kubernetes Persistent Volume (PV) için doğru SELinux bağlamını ayarlama (örnek)
# Bu genellikle PV sağlayıcısı veya initContainerlar aracılığıyla yapılır.
# Manuel olarak, eğer bir hostPath kullanılıyorsa:
chcon -R -t container_file_t /mnt/kubernetes_pv_dataYukarıdaki örnek, bir host yolu olarak kullanılan veri dizinine `container_file_t` bağlamını atar. Bu, container'ların bu dizine güvenli bir şekilde erişebilmesini sağlar. Kubernetes Security Context Constraint (SCC) veya Pod Security Standards (PSS) gibi özellikler, SELinux etiketlerinin pod'lar üzerinde nasıl uygulanacağını da kontrol edebilir.
SELinux, doğru yönetildiğinde bir sistemin güvenlik duruşunu önemli ölçüde güçlendiren güçlü bir araçtır. Politikaların anlaşılması, doğru araçların kullanılması ve proaktif sorun giderme yaklaşımları, karmaşık üretim ortamlarında bile SELinux'un tam potansiyelini kullanmanızı sağlar. Bu sayede, potansiyel güvenlik açıklarını azaltırken sistem istikrarını da koruyabilirsiniz.