Autor del tema
#0
SELinux'in Temel Mantığı ve Önemi
SELinux (Security-Enhanced Linux), Linux çekirdeğine entegre edilmiş, zorunlu erişim kontrolü (MAC) sağlayan bir güvenlik mekanizmasıdır. Klasik Linux izin sistemi (DAC – Discretionary Access Control) kullanıcıların kendi dosyaları üzerindeki erişimi belirlemesine izin verirken, SELinux çok daha detaylı ve katı kurallar koyar. Bu sistem, herhangi bir sürecin veya kullanıcının, kaynaklara (dosyalar, soketler, portlar vb.) nasıl erişebileceğini merkezi bir politika ile tanımlar. Bu sayede, kötü niyetli bir yazılım veya sistem zafiyeti durumunda bile, saldırganın erişimi önceden tanımlanmış kurallarla sınırlanır ve sistemin genel güvenliği önemli ölçüde artırılır. Başka bir deyişle, SELinux, sistemin derinliklerinde bir güvenlik duvarı görevi görür.
SELinux Modları Arasında Geçiş Yapmak
SELinux üç ana modda çalışabilir: zorunlu (enforcing), izin verici (permissive) ve devre dışı (disabled). Zorunlu mod, SELinux politikalarını aktif olarak uygular ve ihlalleri engeller. İzin verici mod ise, politikaları uygulamaz ancak tüm ihlalleri loglar; bu, yeni bir politika geliştirirken veya sorun giderirken oldukça kullanışlıdır. Devre dışı modda ise SELinux tamamen kapalıdır ve hiçbir güvenlik kontrolü sağlamaz. `getenforce` komutu mevcut modu gösterirken, `setenforce 0` (permissive için) ve `setenforce 1` (enforcing için) komutları modlar arasında geçiş yapmayı sağlar. Kalıcı bir değişiklik için `/etc/selinux/config` dosyası düzenlenmelidir. Bu nedenle, bir servis veya uygulama kurulurken genellikle permissive moda geçmek, sorunları tespit edip gidermek için iyi bir başlangıç noktasıdır.
Dosya ve Dizinler İçin SELinux Bağlamları
SELinux'in temelini güvenlik bağlamları (security contexts) oluşturur. Her dosya, dizin, süreç ve hatta port, bir SELinux bağlamı ile etiketlenir. Bu bağlamlar, `user:role:type:level` şeklinde ifade edilir, ancak en yaygın olarak `type` alanı kullanılır. Örneğin, bir web sunucusu dosyası `httpd_sys_content_t` tipiyle etiketlenirken, bir veritabanı dosyası `mysqld_db_t` tipiyle etiketlenebilir. `ls -Z` komutu, dosya ve dizinlerin mevcut SELinux bağlamlarını gösterir. Bağlamları manuel olarak değiştirmek için `chcon` komutu kullanılır; ancak kalıcı değişiklikler için `semanage fcontext` ve ardından `restorecon` komutları tercih edilmelidir. Aksi takdirde, dosya sistemi yeniden etiketlendiğinde veya bir RPM güncellemesinde manuel değişiklikler kaybolabilir.
SELinux Politikalarını Anlamak ve Yorumlamak
SELinux politikaları, sistemdeki tüm kaynaklara kimin, neye, nasıl erişebileceğini belirleyen kurallar bütünüdür. Bu politikalar, genellikle modüller halinde yüklenir ve her modül, belirli bir uygulama veya servis için kurallar içerir. Politikaları yorumlamak, bir sürecin neden belirli bir kaynağa erişemediğini anlamak için kritik öneme sahiptir. Örneğin, bir web sunucusu Apache kullanıyorsa, SELinux politikası Apache sürecine (`httpd_t`) `httpd_sys_content_t` etiketine sahip dosyalara okuma erişimi verir. Eğer web dizininizdeki bir dosya yanlışlıkla `unlabeled_t` olarak etiketlenirse, Apache bu dosyaya erişemez ve hata verir. Politikalar oldukça karmaşık olabilir; bu nedenle, genellikle `audit.log` kayıtlarını inceleyerek politika ihlallerini tespit etmek ve buna uygun çözümler üretmek gerekir.
Özel Servisler ve Portlar İçin SELinux Ayarları
Varsayılan SELinux politikaları, bilinen servislerin standart portlarda çalışmasına izin verir. Ancak, bir servisi standart dışı bir portta çalıştırmak istediğinizde veya özel bir servis yapılandırdığınızda, SELinux devreye girerek bu erişimi engelleyebilir. Bu gibi durumlarda, `semanage port` komutunu kullanarak SELinux'a yeni bir port tanımlamak gerekir. Örneğin, `semanage port -a -t http_port_t -p tcp 8080` komutu, 8080 numaralı TCP portunu HTTP servisi için izinli hale getirir. Ek olarak, SELinux'ta "boolean" adı verilen, belirli özelliklerin açılıp kapatılmasını sağlayan ayarlar bulunur. `getsebool -a` komutu tüm boolean'ları listelerken, `setsebool -P httpd_can_network_connect on` gibi komutlarla belirli bir boolean'ı kalıcı olarak açmak mümkündür.
SELinux Hata Ayıklama ve Log Analizi
SELinux ile ilgili sorunlarla karşılaşıldığında, sistemin `/var/log/audit/audit.log` dosyasını incelemek ilk adımdır. Bu log dosyası, SELinux tarafından engellenen her eylemi detaylı bir şekilde kaydeder. `ausearch -c httpd` veya `grep "denied" /var/log/audit/audit.log` gibi komutlarla ilgili ihlalleri filtrelemek mümkündür. `sealert` aracı, audit loglarındaki karmaşık SELinux ihlallerini daha okunabilir bir formata dönüştürür ve genellikle sorunu çözmek için öneriler sunar. Sonuç olarak, bu logları düzenli olarak kontrol etmek, sisteminizdeki olası güvenlik açıklarını veya hatalı yapılandırmaları erken aşamada tespit etmenizi sağlar. Yanlış bir politika kuralı, bir uygulamanın çalışmasını tamamen durdurabilir; bu nedenle hata ayıklama yetenekleri çok değerlidir.
Gelişmiş SELinux Yapılandırma İpuçları
Gelişmiş SELinux yapılandırmaları, genellikle özel ihtiyaçlara göre politika modülleri oluşturmayı veya mevcut politikaları detaylıca özelleştirmeyi içerir. `audit2allow` aracı, SELinux hata ayıklamasında ve özel politika modülleri oluşturmada oldukça güçlüdür. Bu araç, `audit.log` dosyasındaki "denied" mesajlarını okur ve bu ihlallere izin verecek SELinux kurallarını otomatik olarak oluşturur. Örneğin, `grep "denied" /var/log/audit/audit.log | audit2allow -M myapp` komutu, `myapp.te` ve `myapp.pp` adında iki dosya oluşturur. `.te` dosyası, yeni kuralları içerir ve `semodule -i myapp.pp` komutu ile sisteme yüklenerek politika güncellenir. Bu yöntem, özelleştirilmiş güvenlik ihtiyaçları olan karmaşık uygulamalar için kritik bir esneklik sağlar ve gereksiz politika genişletmelerinden kaçınmaya yardımcı olur.