2007.02_SELinux – bardziej bezpieczny Linux_[Bezpieczenstwo].pdf

(505 KB) Pobierz
332767023 UNPDF
bezpieczeństwo
SELinux – bardziej bezpieczny Linux
SELinux – bardziej
Marek Sawerwain
Czy system Linux oraz inne systemy uniksowe są bezpiecznymi systemami. Jeśli w odpowiedzi,
uwzględnimy np.: tylko samo jadro systemu to istotnie tak jest. Jest to bezpośrednia konsekwencja
faktu iż, wielu programistów szczególnie, w przypadku systemów o otwartym kodzie źródłowym,
każdego dnia stara sie naprawiać istniejące błędy, a liczna społeczność użytkowników owe błędy
wyłapuje. Co ogólnie poprawia szeroko rozumiane bezpieczeństwo.
dawać, że trzy podstawowe prawa systemów
uniksowych: prawo czytania, zapisywania
oraz prawo wykonywania (tzw. prawa rwx )
odpowiednio zastosowane, mogą wystarczyć do stwo-
rzenia środowiska, które będzie bezpieczne i nie narazi
na utratę danych użytkowników tego środowiska.
Jednak z drugiej strony, system operacyjny dla zwy-
kłego użytkownika to nie tylko jadro systemu, lecz cały ze-
staw aplikacji stosowanych w codziennej pracy. Niestety,
wiele aplikacji posiada istotne uchybienia, co może naru-
szać bezpieczeństwo całego systemu. Źle napisana aplika-
cja sieciowa, uruchomiona nawet na poziomie konta zwy-
kłego użytkownika, może być źródłem wielu kłopotów.
I niestety, nie pomogą tu prawa dostępu bądź odpowied-
nia hierarchia użytkowników. Czy istnieje zatem sposób,
aby np.: zablokować uruchamianie pewnych programów,
jednak nie odbierając samych praw. Odpowiedź jest natu-
ralnie twierdząca, a jest nim zestaw specjalnych rozszerzeń
o nazwie SELinux. Sposób działania tego systemu można
porównać do ściany ogniowej, lecz tym razem jest to zapo-
ra dla aplikacji.
Czym jest SELinux ?
Najkrócej o projekcie SELinux można powiedzieć iż jest
to „łatka” na standardowe jądro Linuxa. W jądrze, funk-
cjonuje bowiem mechanizm o nazwie Linux Security Mo-
dule (w skrócie LSM) , czyli jest to część jądra Linuxa która
oferuje możliwość implementacji różnych dodatkowych
mechanizmów bezpieczeństwa. SELinux jest elementem
który pojawia się właśnie jako moduł LSM. Jednak, naj-
nowsze jądra z serii 2.6.x oferują już na stałe mechani-
zmy SELinuxa, toteż od tej serii jąder SELinux jest natu-
ralną częścią jądra Linuxa. Obecnie, w większości waż-
niejszych dystrybucji przedstawiane mechanizmy są już
obecne.
Jednak, oprócz samych modyikacji jądra, istotnym
elementem są nowe wersje programów, które korzystają
z możliwości SELinuxa. Szczególnie ważne są kluczo-
we programy dla bezpieczeństwa systemu jak ssh, ls, ps
czy np: login. Te programy zostały dopasowane do no-
wych zabezpieczeń. Choć warto dopowiedzieć iż nowe
rozszerzenia zostały tak opracowane, iż nie ma potrze-
by aby modyikować istniejące oprogramowanie. Jeśli,
dany program wymaga specjalnych uprawnień, wystar-
52
luty 2007
bezpieczny Linux
Z teoretycznego punktu widzenia może sie wy-
332767023.030.png 332767023.031.png 332767023.032.png
 
bezpieczeństwo
SELinux – bardziej bezpieczny Linux
Rysunek 1. Ogólny schemat systemu SELinux,
przedstawia podział na trzy części, użytkowników,
role i typy
W przypadku SELinuxa tylko administra-
tor systemu może określać nowe prawa do-
stępu. Jest to zupełnie odmienne podejście
w porównaniu do tradycyjnego rozwiązania,
gdzie każdy użytkownik może zarządzać
prawami, choć tylko we własnym otoczeniu.
W przypadku SELinuxa, tak nie jest, gdyż
prawa są przydzielane tylko przez admini-
stratora.
Drugim, wbrew pozorom nie zupełnie
nowym mechanizmem jest wprowadzenie
systemu kontroli opartego o role. System RB-
AC (jest to skrót od ang. Role Based Access Con-
trol ) oferuje możliwość przypisywania specy-
icznej roli poszczególnym użytkowników.
W taki sposób funkcjonuje standardowy me-
chanizm użytkowników, mamy przecież użyt-
kowników systemowych, standardowych czy
wręcz dedykowanych do pewnym wybra-
nych zadań np.: do obsługi serwera WWW.
Jednak, RBAC zmienia nieco ten schemat,
ponieważ prawa nie są przydzielane bezpo-
średnio do użytkowników lecz do ról. Co wię-
cej, w jednej chwili użytkownik, może peł-
nić tylko jedną rolę, co ogranicza potencjal-
ne szkody. Jest to naturalnie mniej wygod-
nie, ponieważ należy się przełączać pomię-
dzy rolami ale podnosi w znaczący sposób
bezpieczeństwo.
Uzyskanie dostępu do pewnej roli ozna-
cza iż użytkownik będzie korzystać z pew-
nych obiektów, czyli z plików, katalogów
oraz innych urządzeń. W roli, prawa są przy-
dzielone, jednak do pewnych typów. Naj-
ważniejszym ograniczeniem jest fakt iż tyl-
ko administrator może tworzyć nowe typy
i przydzielać je do obiektów. Ten mecha-
nizm nazywany jest najczęściej jako system
kontroli dostępu w ramach domeny. (ang.
Dynamically Typed Access Control – DTAC),
lepiej jednak mówić o tym systemie jako
o mechanizmie deiniowania reguł dostępo-
wych.
Choć ilość typów jest nieograniczona to
jednak nadmierna ilość różnych typów
wprowadza tylko dodatkowe zmieszanie,
więc najlepiej nie przesadzać z ilością ty-
pów. Tym bardziej iż w typowej instalacji
SELinux, istnieją nie setki ale tysiące tego
rodzaju reguł (zwykle około 100 000). Regu-
ły te pozwalają na bardzo precyzyjne okre-
ślanie, jakie szczegółowe prawa są przy-
dzielane do obiektów.
czy utworzyć odpowiednie zasady. Wspom-
niane zasady (ang. policy ) także są nieod-
łącznym elementem bezpieczeństwa. To one
decydują który użytkownik ma dostęp do
urządzeń czy plików. Domyślny, zbiór re-
guł zapewnia wysoki poziom bezpieczeń-
stwa. Naturalnie, administrator może zmie-
nić reguły bądź utworzyć nowe aby dopa-
sować system do własnych specyicznych
potrzeb.
Toteż zadaniem opisywanych rozsze-
rzeń jest zwiększenie bezpieczeństwa, po-
przez wprowadzenie nowych ograniczeń
bardziej szczegółowych niż typowe prawa
rwx . Użytkownicy są przypisywani do wcześ-
niej określonych ról. Pozwala to na wpro-
wadzanie ograniczeń w dostępie do urzą-
dzeń i plików. Co ważne SELinux rozsze-
rza istniejące prawa dostępu, co oznacza iż
w przypadku złej koniguracji nowych roz-
szerzeń, nie naruszamy istniejących typo-
wych mechanizmów bezpieczeństwa. Dla-
czego tak jest? Jak już to zostało powiedzia-
no, nowe prawa ograniczają istniejące, nie
są to bowiem zupełnie nowe prawa. To-
też, jeśli nastąpi naruszenie praw SELinu-
x'a, nadal w mocy pozostaną aktualne stan-
dardowe prawa Linuxa.
Odrobina szczegółów
Użytkownik który pracuje w danym sys-
temie, naraz może korzystać z tylko jednej
roli, naturalnie istnieje rola domyślna. W ra-
mach każdej roli, mamy dostęp tylko do wcześ-
niej określonych obiektów poprzez dome-
ny. Podobnie jak w przypadku roli możemy
znajdować się naraz tylko w jednej domenie.
Jednak, nasze rzeczywiste możliwości są wy-
znaczanie na podstawie typu obiektu na któ-
rym działamy, bowiem reguły o których była
mowa w poprzednim punkcie określą nam
możliwe interakcje pomiędzy domeną a ty-
pem obiektu. Najczęściej tworzone są nastę-
pujące reguły:
• określanie dopuszczalnych operacji jak
czytanie, pisanie, tworzenie,
• dopuszczalne zmiany roli,
• możliwe zmiany domeny,
• określenie automatycznych zmian do-
meny oraz roli w przypadku zajścia jakiś
konkretnych okoliczności.
Nieco teorii o nowych
rozszerzeniach
Najważniejszym elementem SELinuxa jest
wprowadzenie bardzo silnej kontroli dostę-
pu (ang. Mandatory Access Control – MAC).
Ogólnie mówiąc, jest to rozszerzenie stan-
dardowych mechanizmów praw dostępu do
plików oraz grup i użytkowników. Kontro-
la odbywa się na poziomie procesu który po-
wstał w wyniku działań użytkownika. Pro-
ces otrzymuje tzw. kontekst bezpieczeństwa,
Mechanizmy kontroli MAC sprawdzają rów-
nież kontekst bezpieczeństwa obiektu na
którym dany proces ma pracować. Po wery-
ikacji, czy dany proces z otrzymanym kon-
tekstem może wykonać czynności do któ-
rych został powołany następuje odmowa
lub zgoda na wykonanie zadania jakie re-
alizuje proces.
Istnieje jedna zasadnicza różnica pomię-
dzy mechanizmami MAC, a standardowy-
mi rozwiązaniami dostępnymi w Linuxie.
W SELinuxie każdy proces oraz użytkownik
posiada tzw. kontekst bezpieczeństwa. Ogól-
nie na kontekst składają się trzy elemen-
ty a są to: użytkownik:rola:domena . Jeśli,
Rysunek 2. Dokładniejsze przedstawienie struktury nowych rozwiązań dostępnych w SELinuxie
www.lpmagazine.org
53
332767023.001.png 332767023.002.png 332767023.003.png 332767023.004.png 332767023.005.png 332767023.006.png 332767023.007.png 332767023.008.png 332767023.009.png 332767023.010.png 332767023.011.png 332767023.012.png 332767023.013.png 332767023.014.png 332767023.015.png 332767023.016.png 332767023.017.png 332767023.018.png 332767023.019.png 332767023.020.png
 
bezpieczeństwo
SELinux – bardziej bezpieczny Linux
je nazwa z klientami do sieci IRC. Plik wyko-
nywalny klienta IRC posiada także swój typ o
nazwie irc_exec_t , po uruchomieniu przez
użytkownika klienta IRC następuje zmiana
domeny w następujący sposób:
user:user_r:user_t
zmiana do
user:user_r:user_irc_t
Domena user_irc_t posiada liczne ogranicze-
nia, domyślnie w jej ramach program może za-
pisywać informacje do logów bądź korzystać
z podstawowych plików koniguracyjnych.
Ewentualne włamanie się przez klienta, nie za-
grozi nawet jego własnym plikom, ponieważ
klient IRC jest uruchamiany w innej domenie.
Odrobina praktyki
Gdy chcemy wprowadzić do systemu nadzo-
rowanego przez SELinux nowego użytkowni-
ka, to pierwszą czynnością jaką trzeba wyko-
nać, jest zmiana aktualnej roli użytkownika za
pomocą polecenia newrole . Ponieważ chcemy
Rysunek 3. Koniguracja SELinuxa za pomocą narzędzia graicznego w dystrybucji Fedora Core 6
Historia projektu SELinux
użytkownik o nazwie np.: dorota zaloguje
się do typowego systemu, gdzie istnieje SE-
Linux, to dorota zazwyczaj otrzyma nastę-
pujący kontekst: dorota:user_r:user_t ,
gdzie user_r to domyślna rola a user_t to
domyślna domena. Aktualny kontekst mo-
żemy sprawdzić za pomocą polecenia id
a jeszcze lepiej id -Z . W efekcie otrzymamy
następującą odpowiedź (np.: dla dystrybu-
cji Fedora Core 6):
traktowany java_exec_t . W podobny spo-
sób możemy sprawdzić kontekst bezpieczeń-
stwa dla procesów poleceniem ps -eZ :
Pierwsze rozwiązania jakie stały się podsta-
wą dla SELinux powstały już w roku 1992
dla jądra MACH, gdzie pojawiły się bardzo
rozbudowane mechanizmy kontroli dostę-
pu. Pierwsze publiczne udostępnienie kodu
nastąpiło w 2000 roku. Od roku 2003 SELi-
nux jest łączony z kodem jądra w wersji 2.6.
Dlatego, aktualnie SELinux jest silnie zin-
tegrowanym z jądrem, właśnie dla tej wer-
sji i jest rozwijany przez irmę Secure Com-
puting Corportaion którą inansowo od po-
czątku wspiera amerykańska agencja bez-
pieczeństwa narodowego (NSA – Natio-
nal Security Agency). SELinux jest dostęp-
ny w najnowszych dystrybucjach Fedo-
ra Core, specjalnej dystrybucji dla serwe-
rów Gentoo Hardend. SELinux oferuje tak-
że Debian oraz SuSE, istnieje także port dla
FreeBSD.
Choć można się doszukiwać w udo-
stępnieniu mechanizmów SELinuxa szero-
kiej społeczności, spiskowej teorii dziejów,
to jednak warto pamiętać iż Linux staje się
coraz bardziej popularny, i w grę wchodzą
aspekty ekonomiczne. Liczba strat jakie
powstają w wyniku błędnych zabezpieczeń
systemów komputerowych jest coraz więk-
sza, więc to ostatecznie zwykły rachunek
ekonomiczny przemawia za udostępnie-
niem SELinux społeczności OpenSource,
jak przecież wiadomo siła leży w grupie.
system_u:system_r:init_t 1 ?
00:00:00 init
system_u:system_r:kernel_t 2 ?
00:00:00 migration/0
system_u:system_r:udev_t:System
Low-SystemHigh 441 ? 00:00:00 udevd
system_u:system_r:xfs_t 2190 ?
00:00:00 xfs
system_u:system_r:getty_t 2368
tty4 00:00:00 mingetty
user_u:system_r:unconined_t 2515
tty2 00:00:00 bash
root:system_r:unconined_t:System
Low-SystemHigh 2544 tty1 00:00:00 ps
user_u:system_r:unconined_t
Jak widać mamy tu jeszcze większe ograni-
czenie, gdyż domyślnym określeniem użyt-
kownika dorota jest user_r .
Inne przykłady kontekstów są następu-
jące dla plików wykonywalnych po wykona-
niu ls -alZ :
-rwxr-xr-x root root system_u:
object_r:bin_t /usr/bin/gcalctool
-rwxr-xr-x root root system_u:
object_r:bin_t /usr/bin/gcc
-rwxr-xr-x root root system_u:
object_r:java_exec_t /usr/bin/
gcj-dbtool
Tym razem poszczególne usługi systemowe
mają przydzielone różne typy, mamy spe-
cjalny typ init_t dla pierwszego procesu
w systemie, a usługi działające na poziomie
jądra posiadają własne typy. Typowe proce-
sy użytkownika posiadają kontekst: user_u:
system_r:unconined_t .
Przykład typu dla Javy pokazuje iż od-
powiednie określenie typów i praw daje na
wiele możliwości w ochronie systemu. Przy-
kładem który zazwyczaj się pokazuje jest do-
mena user_irc_t . Stowarzyszona jak poda-
Na przykładzie tych plików widać iż kon-
tekst dla zwykłych typów kończy się typem
bin_t lecz program dla Javy jest specjalnie
54
luty 2007
332767023.021.png 332767023.022.png 332767023.023.png
 
bezpieczeństwo
SELinux – bardziej bezpieczny Linux
wykonywać czynności administracyjne, więc
przełączamy się do roli o nazwie sysadm_r :
miać tylko obiekty związane z przeglądarką
internetową user_irefox_t oraz omawiany
już klient do sieci IRC user_irc_t . Tworząc
własne role, może ściśle przydzielać dostęp
do odpowiednich programów deiniując od-
powiednie typy.
Informacje o typach plików są zgromadzo-
ne w pliku ile_context oraz w plikach o rozsze-
rzeniu *.fc . Dobrym przykładem może być opis
katalogu domowego np.:
O Autorze
newrole -r sysadm_r
Autor zajmuje się tworzeniem oprogramo-
wania dla Linuksa oraz WIN32. Zaintereso-
wania: teoria języków programowania oraz
dobra literatura.
Kontakt z autorem: msawe@go.onet.pl
Zostaniemy poproszeni o podanie hasła dla
administratora. Następnie za pomocą dwóch
typowych poleceń adduser oraz passwd , two-
rzymy nowego użytkownika oraz określamy
jego domyślne hasło. W ten sposób, do syste-
mu został dodany nowy użytkownik. Jednak,
nie posiada on żadnych praw w SELinux'ie.
Dlatego, w pierwszej kolejności trzeba okre-
ślić jego rolę. Pliki związane z regułami mo-
gą znajdować się w wielu miejscach choć naj-
częściej są to katalogi /etc/security/selinux albo
/etc/selinux . Plik z informacjami o użytkow-
nikach może znajdować się np.: w katalogu
/etc/selinux/users . Należy, na samym końcu
dodać nową regułę np.:
wanie systemy pliku za pomocą polecenia
o postaci np.:
/home system_u:object_r:home_root_t
make -C /etc/selinux/policy relabel
Natomiast poszczególne pliki mogą być okre-
ślone jako:
W ten sposób, poszczególne pliki w systemie
otrzymają zdeiniowane przez nas nowe ty-
py. To polecenie, podobnie jak load również
może zabrać sporo czasu.
/home/[^/]+/.+ system_u:object_r:
user_home_t
Jeśli administratorowi systemu zależy na
większej prywatności może jawnie rozdzielić
typy na poszczególnych użytkowników:
Podsumowanie
Mam nadzieję iż udało się mi zachęcić do dal-
szych poszukiwań informacji na temat SE-
Linuxa. Projekt ten jest świetnym przykła-
dem iż Linux może być systemem o wyso-
kim stopniu bezpieczeństwa. Naturalnie, ten
artykuł to tylko wprowadzenie do tematyki
systemu SELinux. I wiele elementów zostało
pominiętych. Jednakże, w ramach uzupełnie-
nia, warto wspomnieć o teście, jaki przepro-
wadził jakiś czas temu Russel Coker. Udostęp-
nił on komputer z zainstalowanym SELinu-
xem, wraz ze standardowymi ustawieniami.
Udostępnił także hasło roota do tej maszyny,
jak się okazało nikt nic istotnego nie zdołał
zepsuć. Co jest znakomitym przykładem jako-
ści SELinuxa. Jego zaletą jest także zgodność
z normą POSIX.6 (system MAC jest przykła-
dem techniki zgodnej z tą normą). Wadą jest
niewątpliwie problematyczna koniguracja
szczególnie dla początkujących użytkowni-
ków, sprawia wiele kłopotów. Drugą istotną
wadą jest także obniżenie wydajności syste-
mu, szczególnie, jeśli zbiór reguł jest bardzo
rozbudowany. Jednak zalet jest więcej, dlatego
warto sprawdzić, czy nasza ulubiona dystry-
bucja zawiera wsparcie dla SELinuxa?
user dorota roles { user_r };
W ten sposób użytkownik dorota przez nowe
mechanizmy bezpieczeństwa będzie postrze-
gany jako typowy użytkownik. Jeśli chcemy
zwiększyć prawa użytkownika, poprzez do-
pisanie go do różnych ról pomiędzy którymi
może się on przełączać np.: chcemy dać możli-
wość administracji systemem to reguła przed-
stawia się bardzo prosto:
/home/dorota/[^/]+/.+ system_u:
object_r:user_dorota_home_t
Powracając do przykładu z klientem do sieci
irc możemy określić zachowanie się obiektów
które są plikami tymczasowymi:
allow user_irc_t irc_tmp_t:ile {
create read write getattr setattr
link unlink rename };
user dorota roles { user_r sysadm_r };
Użytkownik dorota może korzystać z dwóch
ról user_r bądź sysadm_r . Niestety, po wpro-
wadzeniu zmian do pliku /etc/selinux/users nie
są one domyślnie wprowadzane do systemu.
Należy za pomocą dodatkowego polecenia do-
konać kompilacji wszystkich reguł. W przy-
padku typowej instalacji nowych rozszerzeń
wykonujemy polecenie:
Taka deklaracja nazywana jest także wek-
torem dostępu, ponieważ określamy jakie
czynności mogą być wykonywane na danym
pliku. Oczywiście SELinux, pozwoli na przy-
dzielenie określonych praw jednemu określo-
nemu plikowi, które może działać w jednej
domenie. Nie ma przeszkód aby istniał tylko
jeden użytkownik który może modyikować
ten plik. Jednak, jak to już wcześniej powie-
dziono regułami zarządza administrator i to
tylko on może podjąć decyzję o takim postę-
powaniu.
Można przytoczyć jeszcze wiele przykła-
dów reguł np.: dla serwera Apache dostęp do
gniazdka sieciowego jest określony w nastę-
pujący sposób:
make -C /etc/selinux load
Ponieważ reguł jest wiele, więc kompilacja mo-
że zabrać sporo czasu. Możemy teraz dokład-
nie określić jakie programy mogą być urucha-
miane przez poszczególnych użytkowników,
deiniując w szczegółowy sposób rolę dla użyt-
kownika:
W Sieci
• Strona domowa NSA poświęcona
projektowi SELinux:
http://www.nsa.gov/selinux
• Lista najczęściej zadawanych pytań:
http://www.nsa.gov/selinux/info/
faq.cfm
• Podstawowe informacje o SELinuxie:
http://en.wikipedia.org/wiki/Selinux
role user_r types { user_t
user_irefox_t user_irc_t };
allow httpd_suexec_t self:unix_stream_
socket create_socket_perms;
Przydzielona rola user_r oznacza iż użyt-
kownik z tej roli może korzystać z obiektów
ogólnego typu user_t np.: pliki z doku-
mentami, ale z drugiej strony może urucha-
Ponieważ, obostrzenia na pliki są mimo
wszystko dodatkowym elementem w syste-
mie plików, wymienione rodzaje praw nie
są nadawane za pomocą standardowego po-
lecenia chmod , toteż niezbędne jest etykieto-
www.lpmagazine.org
55
332767023.024.png 332767023.025.png 332767023.026.png 332767023.027.png 332767023.028.png 332767023.029.png
 
Zgłoś jeśli naruszono regulamin