SELinux to potężne narzędzie pozwalające zabezpieczyć serwer linuksowy.
Policy jest ładowane do jądra systemu i w jądrze systemu jest sprawdzane.
Tryby pracy SElinux
disabled – system SElinux jest wyłączony
permissive – SElinux pisze ostrzeżenia o przekroczeniu polityki bezpieczeństwa ale zezwala na wykonanie zadania
enforcing – SElinux blokuje wszystkie niedozwolone działania.
Polityki pracy SElinux
strict – SELinux chroni cały system
targeted – SElinux chroni wybrane elementy systemu
Kontekst, tożsamosc, status i typ
Kontekst posiada składnię: tożsamość:status:typ.
[root@localhost conf]# ls -Z -rw-r--r-- root root system_u:object_r:httpd_config_t httpd.conf -rw-r--r-- root root system_u:object_r:httpd_config_t magic
W przypadku pracy z systemem MLS (Multi Level Security) kontekst posiada składnię: tożsamość:status:typ:czulosc (ang. sensitivity,
domyślnie s0).
Standardowo:
- Typ kończy się na t (np. httpd_config_t)
- Status kończy się na r (np. object_r)
- Tożsamość kończy się na u (np system_u)
Użytkownicy
Domyślne tożsamość
Domyślną tożsamością użytkownika jest user_u a jedyny status, do jakiego będzie ma dostęp, to user_r.
Kontekst dla użytkownika można sprawdzić korzystając z polecenia id (tylko bieżący użytkownik)
24:/usr/src/selinux-policy-refpolicy-src# id uid=0(root) gid=0(root) grupy=0(root),1555(domadmin) context=user_u:system_r:unconfined_t:s0
Zmiana bieżącej roli (tożsamości)
[ziutus@kickstart_test12 ~]$ newrole -r sysadm_r Password: [ziutus@kickstart_test12 ~]$ id uid=500(ziutus) gid=500(ziutus) groups=500(ziutus) context=staff_u:sysadm_r:sysadm_t:s0-s15:c0.c1023
Modyfikacja przynależności użytkownika do określonego kontekstu
Należy wykonać dwa kroki, najpierw określić jaki kontest a następnie poprawić pliki z jego katalogu domowego, aby mógł się on zalogować
semanage login -a -s staff_u ziutus restorecon -R -F /home/ziutus
Zarządzanie kontekstem i modułami policy
chcon – change security context
restorecon – restore file(s) default SELinux security contexts
semodule – Manage SELinux policy modules.
Przegląd konfiguracji
getsebool
polecenie getsebool z parametrem -a pokazuje wszystkie ustawienia związane z zmiennymi typu bool (czyli prawda lub falsz). jezeli chcemy sprawdzić ustawienia tylko jednej wartości, możemy podać ją jako parametr.
24:/var/log# getsebool ypserv_disable_trans ypserv_disable_trans --> off
getenforce
Polecenie getenforcepozwala sprawdzić tryb, w którym pracuje selinux.
24:/var/log# getenforce Enforcing
selinuxenabled
Narzędzie do wykorzystania w skryptach które zwraca „prawda” lub „fałsz” w zależności czy selinux jest włączony czy wyłączony.
matchpathcon
Polecenie matchpathcon pozwala określić kontekst dla danego pliku.
debian:~# matchpathcon /etc/passwd /etc/passwd system_u:object_r:etc_t:s0
dodatkowo można użyć narzędzi:
getfattr
policyvers
24:/var/log# policyvers 20
sestatus
24:/var/log# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: permissive
Policy version: 20
Policy from config file: refpolicy-targeted
Praca z logami
audit2why pozwala okreslic dlaczego SELinux odmówił dostępu
przykład użycia:
audit2why < /var/log/messages
audit2allow - generate policy allow rules from logs of denied operations
Narzędzia monitorujące pracę SELinux
avcstat - Display SELinux AVC statistics
debian:~# avcstat lookups hits misses allocs reclaims frees 1869921 1869029 892 1749 368 1243
sestatus - SELinux status tool
Zmiana ustawien SELinux
semanage – SELinux Policy Management tool
chcon – change security context
fixfiles – fix file security contexts (his script is primarily used to correct the security context database (extended attributes) on filesystems).
setsebool
togglesebool
setenforce – modify the mode SELinux is running in
restorecon – set file security contexts.
setfiles – set file security contexts.
load_policy – load a new policy into the kernel
chcat – change file security category
Tworzenie nowej polityki SELinux
checkpolicy – SELinux policy compiler
checkmodule –
semodule_package
Inne narzedzia
newrole – run a shell with a new role
run_init – run an init script in the proper context
Konfiguratory SELinux
seedit (nierozwijany)
http://seedit.sourceforge.net/
slide
http://oss.tresys.com/projects/slide
Selinux w dystrybucjach
MLS w CentOS 6
1. Instalacja pakietu polityki mls (Multi Level Security)
yum install selinux-policy-mls
2. Zmiana SELINUXTYPE=mls w /etc/selinux/config
3. Wyłączenie trybu enforce
~]# setenforce 0 ~]# getenforce Permissive
4. Relabeling systemu plików (jako że mamy nową politykę)
Tworzymu plik /.autorelabel
touch /.autorelabel
i restartujemy system.
5. Poprawiamy ustawienia dla katalogu /root i katalogów domowych
~]# genhomedircon ~]# restorecon -R -v /root /home
6. sprawdzmay logi czy występują jakieś błedy (/var/log/audit/audit.log)
7. Edytujemy /etc/selinux/config i zmieniamy tryb na enforcing.
8. Ostatni reboot.
Debian
Najpierw należy zainstalować niezbędne pakiety. Dokonany tego wykonując polecenie wajig install selinux-policy-refpolicy-strict.
debian:~# wajig install selinux-policy-refpolicy-strict
Następnie każdemu plikowi, katalogowi, urządzenia itp należy nadać kontekst. Dokonamy tego przy pomocy komendy fixfiles relabel.
debian:~# fixfiles relabel
Files in the /tmp directory may be labeled incorrectly, this command
can remove all files in /tmp. If you choose to remove files from /tmp,
a reboot will be required after completion.
Do you wish to clean out the /tmp directory [N]?
/sbin/setfiles: labeling files under /
matchpathcon_filespec_eval: hash table stats: 21020 elements, 19185/65536 buckets used, longest chain length 2
/sbin/setfiles: labeling files under /boot
matchpathcon_filespec_eval: hash table stats: 18 elements, 18/65536 buckets used, longest chain length 1
/sbin/setfiles: Done.
Następnie włączamy SELinux podczas startu systemu, zrobimy to przez modyfikacje parametrów startowych systemu (edycja pliku /etc/selinux/config)
Usługi i SELinux
startowanie/zatrzymywanie/odpytywanie usług w CentOS 5/6
run_init service nfs start
SELinux i Apache
chcon -vR --type=httpd_sys_content_t /data/www/second/
semanage fcontext -a -e /var/www /srv/www restorecon -R -v /srv/www semanage fcontext -a -t httpd_sys_content_t "/data/www/second(/.*)" restorecon -R -v /data/www/second/
selinux i ftp
Dostęp do katalogów domowych
setsebool -P ftp_home_dir 1
selinux i samba
Samba i dostęp do katalogów domowych
setsebool -P samba_enable_home_dirs 1
SELinux i nfs
nfs i dostęp do katalogów domowych
setsebool -P use_nfs_home_dirs 1
Ciekawe narzędzia
setroubleshoot
Poprawiając polityki bezpieczeństwa natknąłem się na ciekawe narzędzie o nazwie setroubleshoot.
Instalacja jest prosta:
yum install setroubleshoot /etc/init.d/rsyslog restart /etc/init.d/auditd restart sealert -a /var/log/audit/audit.log
Efekt pracy programu na przykładzie jednego komunikatu:
Summary: SELinux is preventing httpd (httpd_t) "name_bind" to "Unknown" (httpd_t). Detailed Description: SELinux denied access requested by httpd. It is not expected that this access is required by httpd and this access may signal an intrusion attempt. It is also possible that the specific version or configuration of the application is causing it to require additional access. Allowing Access: You can generate a local policy module to allow this access - see FAQ (http://fedora.redhat.com/docs/selinux-faq-fc5/#id2961385) Or you can disable SELinux protection altogether. Disabling SELinux protection is not recommended. Please file a bug report (http://bugzilla.redhat.com/bugzilla/enter_bug.cgi) against this package. Additional Information: Source Context system_u:system_r:httpd_t Target Context system_u:object_r:httpd_t Target Objects None [ tcp_socket ] Source httpd Source Path /usr/sbin/httpd Port 80 Host "Unknown" Source RPM Packages httpd-2.2.3-43.el5.centos.3 Target RPM Packages Policy RPM selinux-policy-2.4.6-279.el5_5.1 Selinux Enabled True Policy Type strict MLS Enabled True Enforcing Mode Enforcing Plugin Name catchall Host Name centos.server.localnet Platform Linux centos.server.localnet 2.6.18-194.3.1.el5 #1 SMP Thu May 13 13:09:10 EDT 2010 i686 i686 Alert Count 6 First Seen Fri Oct 1 21:31:40 2010 Last Seen Fri Oct 1 21:37:40 2010 Local ID b5f4e8ef-6325-4ccb-ae7f-c898462b77df Line Numbers 17, 18, 19, 20, 23, 24, 25, 26, 37, 38, 39, 40 Raw Audit Messages type=AVC msg=audit(1285961860.699:19487): avc: denied { name_bind } for pid=8616 comm="httpd" src=80 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_t:s0 tclass=tcp_socket type=SYSCALL msg=audit(1285961860.699:19487): arch=40000003 syscall=102 success=no exit=-13 a0=2 a1=bfa2ec80 a2=186988 a3=8917858 items=0 ppid=8615 pid=8616 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=3181 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
Katalog typowych problemów
Brak możliwości logowania po SSH po skopiowaniu kluczy lokalnie
Przy kopiowaniu kluczy lokalnie kontekst nie jest zmieniany, należy więc ustawić poprawny kontekst:
[root@linux2 log]# restorecon -FRvv /root/.ssh
restorecon reset /root/.ssh context unconfined_u:object_r:admin_home_t:s0->system_u:object_r:ssh_home_t:s0
restorecon reset /root/.ssh/known_hosts context unconfined_u:object_r:admin_home_t:s0->system_u:object_r:ssh_home_t:s0
restorecon reset /root/.ssh/authorized_keys context unconfined_u:object_r:admin_home_t:s0->system_u:object_r:ssh_home_t:s0
SELinux – w której dystrybucji jest najłatwiej zaimplementować?
Niby SELinux jest ten sam zawsze ale jednak w jednych dystrybucjach jest łatwiej go ustawić, w innych trudniej.
Prosty przykład:
1. Ubuntu
ktos@ubuntu:~# man -k selinux | wc -l 34
2. CentOS
[root@centos sysconfig]# man -k selinux | wc -l 56
Gdzie jest różnica? Na przykład w stronach pomocy, mogających ustawić usługi:
[root@centos sysconfig]# man -k _selinux ftpd_selinux (8) - Security-Enhanced Linux policy for ftp daemons httpd_selinux (8) - Security Enhanced Linux Policy for the httpd daemon kerberos_selinux (8) - Security Enhanced Linux Policy for Kerberos named_selinux (8) - Security Enhanced Linux Policy for the Internet Name server (named) daemon nfs_selinux (8) - Security Enhanced Linux Policy for NFS pam_selinux (8) - PAM module to set the default security context rsync_selinux (8) - Security Enhanced Linux Policy for the rsync daemon samba_selinux (8) - Security Enhanced Linux Policy for Samba ypbind_selinux (8) - Security Enhanced Linux Policy for NIS
CentOS ma także narzędzia wspomagające konfiugrację jak system-config-security lub system-config-selinux…
Linki w Internecie
Linki do oficjalnych stron dystrybucji poświęconych SELinux
Linki do oficjalnych stron dystrybucyjnych poświęconych SELinux:
- Fedora Core (http://fedoraproject.org/wiki/SELinux
- Gentoo (https://www.gentoo.org/proj/pl/hardened/selinux/selinux-handbook.xml
- Debian (https://wiki.debian.org/SELinux))
- Ubuntu (https://wiki.ubuntu.com/SELinux)
Ciekawe artykuły
http://james-morris.livejournal.com/2005/09/16/ MLS and MCS
http://www.lurking-grue.org/gettingstarted_newselinuxHOWTO.html – Getting Started with SE Linux HOWTO: the new SE Linux
Todo
Konfiguracja kontekstu z serwera (sprawdzić)
w pliku semange.conf jest informacja o możliwości posiadania zdalnego serwera polityk. (sprawdzić jak to może działać)