background image

bezpieczeństwo

SELinux – bardziej bezpieczny Linux

52

luty 2007

bezpieczeństwo

SELinux – bardziej bezpieczny Linux

53

www.lpmagazine.org

   

 a

ut

or

zy

@

lpm

ag

az

ine

.o

rg

SELinux – bardziej 

bezpieczny Linux

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.

Marek Sawerwain

teoretycznego punktu widzenia może sie wy-
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  modyfikacji  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  modyfikować  istniejące  oprogramowanie.  Jeśli, 
dany program wymaga specjalnych uprawnień, wystar-

background image

bezpieczeństwo

SELinux – bardziej bezpieczny Linux

52

luty 2007

bezpieczeństwo

SELinux – bardziej bezpieczny Linux

53

www.lpmagazine.org

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  specyficznych 
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 konfiguracji 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.

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-
fikacji, 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  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-
ficznej  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 definiowania 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.

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.

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 1. 

Ogólny schemat systemu SELinux, 

przedstawia podział na trzy części, użytkowników, 
role i typy

Rysunek 2. 

Dokładniejsze przedstawienie struktury nowych rozwiązań dostępnych w SELinuxie

background image

54

luty 2007

bezpieczeństwo

SELinux – bardziej bezpieczny Linux

55

www.lpmagazine.org

bezpieczeństwo

SELinux – bardziej bezpieczny Linux

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):

user_u:system_r:unconfined_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

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 

traktowany 

java_exec_t

.  W  podobny  spo-

sób możemy sprawdzić kontekst bezpieczeń-
stwa dla procesów poleceniem 

ps -eZ

:

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:unconfined_t 2515 
tty2 00:00:00 bash
root:system_r:unconfined_t:System
Low-SystemHigh 2544 tty1 00:00:00 ps

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:unconfined_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-

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  konfiguracyjnych. 
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. 

Konfiguracja SELinuxa za pomocą narzędzia graficznego w dystrybucji Fedora Core 6

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 firmę Secure Com-
puting Corportaion
 którą finansowo 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.

Historia projektu SELinux

background image

54

luty 2007

bezpieczeństwo

SELinux – bardziej bezpieczny Linux

55

www.lpmagazine.org

bezpieczeństwo

SELinux – bardziej bezpieczny Linux

wykonywać  czynności  administracyjne,  więc 
przełączamy się do roli o nazwie 

sysadm_r

:

newrole -r sysadm_r

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.:

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:

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:

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, 
definiując w szczegółowy sposób rolę dla użyt-
kownika:

role user_r types { user_t 
user_firefox_t user_irc_t };

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-

miać tylko obiekty związane z przeglądarką 
internetową 

user_firefox_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 definiując od-
powiednie typy.

Informacje o typach plików są zgromadzo-

ne w pliku file_context oraz w plikach o rozsze-
rzeniu *.fc. Dobrym przykładem może być opis 
katalogu domowego np.:

/home system_u:object_r:home_root_t

Natomiast poszczególne pliki mogą być okre-
ślone jako:

/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:

/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:file { 
create read write getattr setattr 
link unlink rename };

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 modyfikować 
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:

allow httpd_suexec_t self:unix_stream_
socket create_socket_perms;

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-

wanie  systemy  pliku  za  pomocą  polecenia 
o postaci np.:

make -C /etc/selinux/policy relabel

W ten sposób, poszczególne pliki w systemie 
otrzymają zdefiniowane przez nas nowe ty-
py. To polecenie, podobnie jak load również 
może zabrać sporo czasu.

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  konfiguracja 
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? 

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

O Autorze

•  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

W Sieci