Linux'ta SELinux veya AppArmor ile Zorunlu Erişim Denetiminin Uygulanması


Standart ugo/rwx izinleri ve erişim kontrol listelerinin sınırlamalarını aşmak ve bunların sağladığı güvenlik mekanizmalarını artırmak için, Amerika Birleşik Devletleri Ulusal Güvenlik Ajansı (NSA) esnek bir tasarladı. Diğer şeylerin yanı sıra, süreçlerin Sistem nesnelerine (dosyalar, dizinler, ağ bağlantı noktaları vb.) mümkün olan en az izinle erişin veya bunlar üzerinde diğer işlemleri gerçekleştirin ve yine de bu modelde daha sonra yapılan değişikliklere izin verin.

Bir diğer popüler ve yaygın olarak kullanılan MAC ise AppArmor'dur ve SELinux tarafından sağlanan özelliklere ek olarak sistemin "öğrenmesine olanak tanıyan bir öğrenme modu içerir. güçlü> ”belirli bir uygulamanın nasıl davrandığını ve güvenli uygulama kullanımı için profilleri yapılandırarak sınırları belirlemektir.

CentOS 7'de, SELinux çekirdeğin kendisine dahil edilmiştir ve varsayılan olarak Zorlama modunda etkinleştirilmiştir (bununla ilgili daha fazla bilgi bir sonraki bölümde yer almaktadır), AppArmor kullanan openSUSE ve Ubuntu'nun aksine.

Bu yazıda SELinux ve AppArmor'un temellerini ve seçtiğiniz dağıtıma bağlı olarak bu araçlardan birini kendi yararınıza nasıl kullanabileceğinizi açıklayacağız.

SELinux'a Giriş ve CentOS 7'de Nasıl Kullanılacağı

Güvenliği Geliştirilmiş Linux iki farklı şekilde çalışabilir:

  1. Zorunluluk: SELinux, güvenlik motorunu kontrol eden bir dizi yönerge olan SELinux politika kurallarına dayalı olarak erişimi reddeder.
  2. İzin Veren: SELinux erişimi reddetmez, ancak zorlama modunda çalıştırıldığında reddedilecek eylemler için reddetmeler günlüğe kaydedilir.

SELinux da devre dışı bırakılabilir. Kendisi bir çalışma modu olmasa da yine de bir seçenektir. Ancak bu aracın nasıl kullanılacağını öğrenmek, onu görmezden gelmekten daha iyidir. Aklında bulunsun!

Geçerli SELinux modunu görüntülemek için getenforce'u kullanın. Çalışma modunu değiştirmek istiyorsanız setenforce 0 (bunu İzin Veren olarak ayarlamak için) veya setenforce 1 (Enforcing) kullanın. güçlü>).

Bu değişiklik yeniden başlatma durumunda hayatta kalamayacağından, /etc/selinux/config dosyasını düzenlemeniz ve SELINUX değişkenini ikisinden birine ayarlamanız gerekecektir: Yeniden başlatmalarda kalıcılık sağlamak için enforcing, permissive veya disabled:

Ek olarak, eğer getenforce Devre Dışı değerini döndürürse, /etc/selinux/config'i istediğiniz çalışma moduyla düzenlemeniz ve yeniden başlatmanız gerekecektir. Aksi takdirde, çalışma modunu setenforce ile ayarlayamazsınız (veya değiştiremezsiniz).

setenforce'un tipik kullanımlarından biri, bir uygulamada sorun gidermek için SELinux modları (zorlayıcı'dan izin veren'e veya tam tersi) arasında geçiş yapmaktır. hatalı davranıyor veya beklendiği gibi çalışmıyor. SELinux'u İzin Veren moduna ayarladıktan sonra çalışırsa, bir SELinux izin sorunuyla karşı karşıya olduğunuzdan emin olabilirsiniz.

Büyük olasılıkla SELinux ile uğraşmak zorunda kalacağımız iki klasik durum:

  1. Bir arka plan programının dinlediği varsayılan bağlantı noktasını değiştirme.
  2. /var/www/html dışındaki bir sanal ana makine için DocumentRoot yönergesini ayarlama.

Aşağıdaki örnekleri kullanarak bu iki duruma bir göz atalım.

ÖRNEK 1: sshd arka plan programı için varsayılan bağlantı noktasını değiştirme

Çoğu sistem yöneticisinin sunucularını güvence altına almak için yaptığı ilk şeylerden biri, çoğunlukla bağlantı noktası tarayıcılarını ve harici saldırganları caydırmak için SSH arka plan programının dinlediği bağlantı noktasını değiştirmektir. Bunu yapmak için /etc/ssh/sshd_config dosyasındaki Port yönergesini ve ardından yeni port numarasını aşağıdaki gibi kullanırız (bu durumda 9999 bağlantı noktasını kullanacağız):


Port 9999

Hizmeti yeniden başlatmayı denedikten ve durumunu kontrol ettikten sonra başlatılamayacağını göreceğiz:


systemctl restart sshd
systemctl status sshd

/var/log/audit/audit.log'a göz atarsak, sshd'nin 9999 bağlantı noktasında başlamasının engellendiğini görürüz. SELinux tarafından, çünkü bu, JBoss Management hizmeti için ayrılmış bir bağlantı noktasıdır (SELinux günlük iletileri, kolayca bulunabilmeleri için “AVC” kelimesini içerir) diğer mesajlardan tespit edilmiştir):


cat /var/log/audit/audit.log | grep AVC | tail -1

Bu noktada çoğu kişi muhtemelen SELinux'u devre dışı bırakacaktır ancak biz bunu yapmayacağız. SELinux ve sshd'nin farklı bir portta dinlemesinin uyum içinde yaşamasının bir yolu olduğunu göreceğiz. policycoreutils-python paketinin kurulu ve çalıştırıldığından emin olun:


yum install policycoreutils-python

SELinux'un sshd'nin dinlenmesine izin verdiği bağlantı noktalarının listesini görüntülemek için. Aşağıdaki resimde 9999 bağlantı noktasının başka bir hizmet için ayrıldığını ve bu nedenle şimdilik onu başka bir hizmeti çalıştırmak için kullanamayacağımızı da görebiliriz:


semanage port -l | grep ssh

Elbette SSH için başka bir bağlantı noktası seçebiliriz, ancak bu belirli makineyi JBoss ile ilgili herhangi bir hizmet için kullanmamıza gerek kalmayacağından eminsek, mevcut SELinux kuralını değiştirebilir ve bunun yerine bu bağlantı noktasını SSH'ye atayabiliriz:


semanage port -m -t ssh_port_t -p tcp 9999

Bundan sonra, bağlantı noktasının doğru şekilde atanıp atanmadığını kontrol etmek için ilk semanage komutunu veya -lC seçeneklerini (özel listenin kısaltması) kullanabiliriz:


semanage port -lC
semanage port -l | grep ssh

Artık SSH'yi yeniden başlatabilir ve 9999 bağlantı noktasını kullanarak hizmete bağlanabiliriz. Bu değişikliğin yeniden başlatmadan sonra hayatta kalacağını unutmayın.

ÖRNEK 2: Sanal ana bilgisayar için /var/www/html dışında bir DocumentRoot seçme

/var/www/html dışında bir dizini DocumentRoot olarak kullanarak bir Apache sanal ana bilgisayarı kurmanız gerekiyorsa (örneğin, /websrv/sites) /gabriel/public_html):


DocumentRoot “/websrv/sites/gabriel/public_html”

index.html, Apache'nin erişemediği default_t SELinux türüyle etiketlendiğinden Apache, içeriği sunmayı reddedecektir:


wget http://localhost/index.html
ls -lZ /websrv/sites/gabriel/public_html/index.html

Önceki örnekte olduğu gibi, bunun gerçekten SELinux ile ilgili bir sorun olduğunu doğrulamak için aşağıdaki komutu kullanabilirsiniz:


cat /var/log/audit/audit.log | grep AVC | tail -1

/websrv/sites/gabriel/public_html etiketini yinelemeli olarak httpd_sys_content_t olarak değiştirmek için şunları yapın:


semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

Yukarıdaki komut Apache'ye bu dizine ve içeriğine salt okunur erişim izni verecektir.

Son olarak, politikayı uygulamak (ve etiket değişikliğinin hemen etkili olmasını sağlamak) için şunları yapın:


restorecon -R -v /websrv/sites/gabriel/public_html

Artık dizine erişebilmeniz gerekir:


wget http://localhost/index.html

SELinux hakkında daha fazla bilgi için Fedora 22 SELinux ve Yönetici kılavuzuna bakın.