SELinux Policy Yönetimi ve Üretim Ortamlarında Sorun Giderme Kılavuzu

 · 

SELinux Policy Yönetimi ve Üretim Ortamlarında Sorun Giderme Kılavuzu

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 1

SELinux 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.pp

Bu 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.log

Bu 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 Enforcing modunda 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_t gibi bir tip tanımlayabilirsiniz.
  • Düzenli Denetim ve İzleme: SELinux olaylarını (AVC hataları) 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_data

Yukarı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.

← Blog Listesine Dön