SELinux politika ihlallerini tetiklemenin bir yolu var mı?


12

SELinux'un temel çalışmalarını inceliyorum ve inkar etmeyi tetiklemenin yararlı olacağını düşünüyorum. Test makinem CentOS 7 çalıştırıyor, herhangi bir ekstra hizmet olmadan temel bir sunucu kurulumu ve 'Zorlama' durumunu gösteriyor. Bu yüzden / root'u dünya tarafından okunabilir hale getirmenin ve ayrıcalıklı olmayan bir kullanıcı olarak oradan dosyaları okumaya çalışmanın hile yapacağını hissettim. Ama şans yok! Herkes hızlı testler önerebilir mi? Yollara erişmeye veya bağlantı noktalarını açmaya vb.

İdeal olarak ben bir DAC kısıtlı olmaz, basit bir kabuk komutları arıyorum, ama bir MAC fark ve inkar. Bu nedenle ısmarlama programları derlemek veya bunu başarmak için belirli hizmetleri (web sunucusu gibi) yüklemek istemiyorum. SELinux'u çalışırken görmek için genel ve net bir yol sağladığı için bu değerlidir.

Ben bir testin bir parçası olarak varsayılan olarak daha az kısıtlayıcı yapmak için DAC (yani dosya sistemi izinleri) değiştirme ile ilgili hiçbir sorunum yok.


1
+1, koruyucu sistemlerinizi nasıl çalıştıracaklarını bilmek, böylece çalıştıklarını doğrulamak için hayati ve çoğu zaman kaçırılan bir adımdır.
gowenfawr

Unix & Linux SE'ye ait olduğu için bu konuyu konu dışı olarak kapatmak için oy kullanıyorum.
Mark

Yanıtlar:


3

SELinux'un üçüncü taraf / kendi geliştiricinizin kodu için hata tespitindeki yardımcı programını göstermek için bir bellek koruma testi ( burada ilk kod örneğini değiştirmek ):

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main (void) {
  // open file read-write, get a memory-mapped pointer with private access, write permission
  int fd = open ("file_to_test", O_RDWR);
  char *p = mmap (NULL, 42, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);

  p[0] = 'a';   // put something

  // Update protection mode; SELinux response depends on sebool: allow_execmod
  int r = mprotect (p, 42, PROT_READ | PROT_EXEC);

  // Display mprotect result
  printf ("mprotect = %d\n", r);

  close(fd);
  return 0;
}
Derleme ve varsayılanı göster (yakalanmadı)
$ echo "test data" > file_to_test
$ gcc execmod.c 

$ ./a.out 
mprotect = 0

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
<no events of interest were found>

Sorunu yakalamak için booleanları değiştirin:

$ sudo getsebool allow_execmod
allow_execmod --> on

$ sudo setsebool allow_execmod 0
$ ./a.out 
mprotect = -1

$ sudo aureport -a

AVC Report
========================================================
# date time comm subj syscall class permission obj event
========================================================
1. 04/30/2015 12:26:41 a.out unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 10 file execmod unconfined_u:object_r:user_home_t:s0 denied 3612

Bu kesinlikle yararlı ve iyi belgelenmiş (+1), ancak ben bir programcı değilim ve kodu gerçekten anlamıyorum. İdeal olarak, SELinux'un kabuk, netcat, telnet vb.
Düşünceli

Kod parçalarını kendim aramak zorunda kaldım. Aşağıya bir bash testi eklediğiniz için memnunum. CentOS7'de Snort ve postfix (belki de dovecot) hatalarını dışarıda bıraktım, çünkü bunlar paketler, yüklemek için daha fazla iş, daha sonra düzeltilebilir ve sadece daha fazla yapılandırma. Zaten bu şekilde gidiyorsanız, politika oluşturma uygulamaları için yararlıdır.
ɯͽbρɯͽ

3

Bu, CentOS 7'nin temel kurulumunda eşdeğer bir DAC'nin atlanabileceği bir MAC politikasını açıkça göstermektedir.

  1. Varsayılan olarak (yazma sırasında CentOS'ta) ayrıcalıksız olarak, sistem dışı kullanıcılar 'unconfined_u' rolü olarak oturum açar. Ancak sistemimizi, ayrıcalıksız kullanıcı 'alice' yerine 'user_u' rolüne yerleştirecek şekilde değiştirebiliriz. Varsayılan politikalar, bu rolü yalnızca az miktarda ek yapılandırma ile açıkça kısıtlamak için yapılabilir.

    [root]# echo "alice:user_u:s0-s0:c0.c1023" >> /etc/selinux/targeted/seusers
    
  2. Şimdi bu kullanıcıların ana dizinlerinde ve / tmp dosyalarında bulunan dosyaları yürütme yeteneklerini kapatın. Bir kez daha, varsayılan bu davranışa izin vermektir. Bu komutun tamamlanması biraz zaman alabilir .

    [root]# setsebool -P user_exec_content off
    
  3. Şimdi (ayrıcalıksız kullanıcımızla) giriş yapıp bu hareketsiz alanlardan birinde bir şeyler yapmaya çalışabiliriz. Gördüğünüz gibi reddedildi.

    [alice]$ cp /bin/ls /tmp/
    [alice]$ /tmp/ls
    -bash: /tmp/ls: Permission denied
    
  4. Son olarak, SELinux reddimizi görmek için AVC günlüğünü görüntüleyebiliriz.

    [root]# aureport -a
    
    AVC Report
    ========================================================
    # date time comm subj syscall class permission obj event
    ========================================================
    1. 02/05/15 21:08:33 bash user_u:user_r:user_t:s0 59 file execute user_u:object_r:user_tmp_t:s0 denied 693
    

Hey evet bu işe yarıyor! Özellikle bu "exec içerik yok" yaklaşımını tercih etmenizi seviyorum, çünkü bu kesinlikle yakalanmalı. İlk etapta yürütülebilir oluşturmayı önlemek için denetlemeyi tercih etme eğilimindeydim, ama bunu da seviyorum. Bir kullanım örneği: Yeni yazılım yüklemeyi zorlaştıran ortak bir bulut tabanlı hizmet kullanıyorum (paket yöneticilerini kullanmanız gerekiyor ve sudo yok), ancak çok az nokta var; oluşturma veya yürütmeyi engellemezler ve geliştirici ortamlarıdır ... bu yüzden ihtiyacım olan paketleri wget / scp ve derlerim . +1
ǝɲǝɲbρɯͽ

1

Politikalarınızı system-config-selinux'un Boolean sekmesinde (veya / etc / selinux / policy) değiştirmediyseniz, varsayılan ayar aşağıdakilere yanıt vermelidir (NB, daha derin bir dalış için setrofixot'u da yüklemek isteyebilirsiniz) :

mkdir -m 755 -p / install / ks

cp /root/anaconda-ks.cfg / install / ks

chmod 644 /install/ks/anaconda-ks.cfg

Ardından, web sunucunuzu yeniden başlatın ve web tarayıcınızla http: // localhost / ks dosyasına erişmeyi deneyin . Bir "Yasak" mesajı görmelisiniz. Kuyrukluyorsanız /var/log/audit/audit.logveya koşuyorsanız ausearch -m avc -ts recent, mesajı görebilmeniz gerekir:type=AVC msg=audit(1391277951.222:266): avc: denied { read } for pid=1731 comm="httpd" name="ks" dev=sda1 ino=22351 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined u:object r:default t:s0 tclass=dir

Daha sonra SELinux'u chcon -Rv --reference /var/www/html /install/ksdevre dışı bırakmak istemiyor ancak kaynağa erişebiliyorsanız, SELinux içeriğini değiştirebilirsiniz .

EDIT: üzgünüm, "bir web sunucusu değil" dediğini görmedim. chcon -u fake_u <filename>Sistem dosyasında ayrıcalıksız bir hesap kullanmayı deneyin .


Çalışmak için ikinci önerinizi alamadım (yeni oluşturulan bir kullanıcı kullanarak). Ayrıca, daha genel olan bir testi tercih ediyorum, DAC'ın izin vereceği bir MAC adımına bir örnek: SELinux'un SELinux etiketlemesindeki idari değişikliklere karşı ne kadar iyi koruyabileceğini test ediyor.
Düşünceli

0

iki küçük paket yükleyin - bağımlılık yok

  yum install -y vsftpd lftp

bir FTP sunucusu başlat

  systemctl start vsftpd

Kökün evinde dosya yarat

  touch ~/tux.tch

root'un evinden FTP dizinine geçin.
not: taşıyın, kopyalamayın, aksi takdirde dosyanın fcontext'i değişecektir

  mv ~/tux.tch /var/ftp/pub

FTP istemcisi olarak FTP sunucunuza giriş yapın ve yeni dosyaya erişmeyi deneyin.
not: sekme otomatik tamamlama burada çalışmaz

  lftp localhost
    ls pub/tux.tch
    exit

ham günlüklerdeki reddi görüntüleme

  grep AVC /var/log/audit/audit.log

veya setroubleshoot*yüklediyseniz

  grep sealert /var/log/messages
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.