National Security Agency (NSA) tarafından geliştirilmiş güvenlik sistemi olan SElinux ( Security Enhanced Linux ) sistemini inceleyeceğiz. 1999 yılında Asekeri projeler için geliştirilip 2.6 kernel ıyla Linux işletim sistemlerine dahil edilmiştir.SElinux uygulama erişim kontrolü ve objelere erişimi kontrolünü kontrol eden bir güvenlik yapısıdır.
Linux işletim sistemlerinde standart olarak gelen DACs( Discretionary Access Controls ) isteğe bağlı kontrol varken SElinux la birlik te MACs ( Mandatory Access Controls ) zorunlu kontrol gelmiştir. SElinux Macs yapısından dolayı genellikle kapatılmaktadır ama fazladan güvenliğin kimseye zararı olmadığını düşündüğüm için selinux konusu açalım istedim.
SElinux’ un 3 modu bulunmaktadır.
Enforcing ( MACs ) à Policy ler aktif haldedir.
Permissive ( MACs / DACs ) àİzleme moduna geçer log tutar kontrol için kullanılır
Disabled ( DACs ) à Devre dışı bırakır
Red Hat türevli dağıtımlarda 6.0 öncesi sürümlerinde kurulum sırasında Selinux devre dışı bırakılabiliyordu. 6.0 ve sonrası sürümlerde ise SElinux kurulumdan kaldırılmış enforcing modda gelmektedir. İsterseniz kurulum bittik ten sonra disabled edebilirsiniz.
Birden fazla komutla çalışıp çalışmadığını kontrol edebiliri. /etc/selinux/config dosyasını istediğiniz bir editörle açıp bakabilirsiniz. Enforcing mod ve disabled modları arasındaki geçişlerde sistemi yeniden başlatmamız gerekmektedir. Enforcing mod ve permissive mod lar arasındaki geçişlerde sistemi yeniden başlatmamız gerek yoktur.
SElinux mount edilmemiş olsaydı eğer Sestatus komutunun çıktısında disabled görürdük. SElinux mount edildiği için aşağıdaki gibi ayrıntılı bilgilere ulaşabilirsiniz. Sestatus komutuna benzer bir komutta getenforce komutudur.
Enforcing ve permissive mod lar arasında geçişlerde işletim sistemini yeniden başlatmamıza gerek olmadığını belirtmiştik. Setenforce 0 yazarsak permissive mod a geçmiş oluruz. Örnekte SElinux mount fakat current mode permissive olduğunu görebilirsiniz. Setenforce 1 yaparsanız enforcing moda geçecektir.
Her kullanıcın ve dosyaların güvenlik ayarları vardır bunların kontrolü için görüntülediğiniz komutların sonuna Z eklerseniz güvenlik ayarlarını sizlere gösterecektir.
Dosyalar üzerinde çalışmaya başlayabiliriz. http servisini çalıştırdıktan sonra /var/www/html dosyasının altına bir index.html dosyası oluşturup içerisinide birkaç bir şey yazdım.
İndex.html in güvelik ayarlarına baktığımızda tip olarak httpd_sys_content olduğunu görebilirsiniz. Sorunsuz bir şekilde index.html dosyasının görüntülenmesini beklemekteyim.
İnternet Explorer dan deneme yaptığımız da index html e yazmış olduğumuz yazı görüntülenmiş oldu.
Dosya güvenlik tip lerinde değişiklik yapalım. Güvenlik tiplerini 3 bölümde görebilirsiniz U ( kullanıcı ) , R ( role ) ve T ( tip ) . Bunlarda değişiklik yapabilmek için chcon komutunu kullanmanız gerekmektedir.
Chcon –t dosya tipinde değişiklik yapacağım user_home_t kullanıcının home klasörü olduğunu belirtiyorum ve bu tipi hangi dosyaya uygulamak istiyor isem onu ekliyorum.
Ve az önce eriştiğimiz index dosyamıza artık izin hatası alarak erişimimiz kısıtlanmış oluyor.
SElinux la ilgili loglara 2 yerden bakabilirsiniz. /var/log/messages ve /var/log/audit/audit.log.
Audit loga baktığımızda denied hatasının açıklamalarını inceleyerek neden dolayı denied yediğinizi bulabilirsiniz.
http servisinin de loglarına bakabilirsiniz. /var/log/httpd/error.log altında dosya erişim hakkı olmadığının logunu düşmüş.
Dosyanın tipini değiştirdim sonra hangi tipi almam gerektiğini hatırlamıyorum bunun için ise resterecon komutunu kullanabilirsiniz. Resterecon dan sonra dosyanın yerini gösterdiğiniz zaman oradaki dosyanın tipini ilk haline düzeltecektir.
Farklı bir kullanım yoluda sebool larla değişiklik yapmaktadır. Dosyanın tipini user_home çektikten sonra sayfaya erişim sağlayamayağım. Getsebool la httpd_enable_homedirs baktığım zaman off durumdadır. Setsebool la httpd_enable_homedirs on yaparsam enforcing modda olduğu halde homedirs a bakmayacaktır. Sayfayı kontrol ettiğimde user home olmasına rağmen sayfaya erişim sağlayabilirim.
Setsebool la değiştirdiğimiz işlemler kalıcı hale getirmek için –P kullanmamız gerekmektedir. Aksi halde komutu yazdıktan sonra sistemi yeniden başlattığımızda eski halini alacaktır.
Çok fazla sebool bulunmaktadır. Bunları get komutuyla listeleyebilirsiniz. Çalışma yapacağınız sebool için aramayı kısaltmak adına grep komutunu kullanabilirsiniz.
SElinux dosyalara , kullanıcılar ve port lara da müdahale edebilmektedir. Port numaralarında değişiklik yapmak için semanage komutunu kullanıyoruz.
Semanage port –l komutu bize kullanılan portların listesini getirecektir. Aramalarınızı daraltmak istiyorsanız grep komutunu kullanınız.
Semanage port –l | grep http gibi.
http servisinin portunda değişiklik yapmak istiyorum. /etc/httpd/config/httpd.conf dosyasında listen dinlenen portu değiştiriyorum. Port numarasını 1453 yapıp dosyayı kaydediyorum.
Bu port uda selinux tanımlamak için semanage port –a add http_port_t –p protocol tcp 1453 yazıyorum ve biraz bekledikten sonra port list le eklemiş mi emin olmak için bakıyorum.
Dışardan erişimlerde 80 portunu kapatıp eklemiş olduğum 1453 portunu yönlendirmesini de yapabilirim. 1453 portu üzerinden index.html sayfama ulaşımı kontrol ediyorum ve başarılı =)
Eklemiş olduğum portlarıda kaldırabilirim –a add yazdığım yere –d delete yazarak silme işlemini gerçekleştiriyorum.
Bu kadar işlemlerle kim uğraşacak kapat şu SElinux u diyebilirsiniz ( haksız da bulmam sizi) . Kapatmak için 2 yöntemi vardır bunlardan birisi mount etmemesini sağlamak bir diğeri kolay olanı. /etc/selinux/config altındaki SELINUX=disabled yapmak ve mount olmuş olan selinux devre dışı kalması için sistemi yeniden başlatmaktır.
Çok karmaşık bir yapısı vardır SElinux un. Alışmasının kolay olmadığını biliyorum ama sisteminizi bir kere ayarladıktan sonra çok fazla değiştirmeyeceğiniz için önceden disabled edip geçmeyin birazcık da olsa uğraşın derim.