SELinux - współpraca z netfilter'em

Mon 06 September 2010 by admin

Kolejny wpis z SELinux'em w tytule, tym razem przybliżę moduł SECMARK dla netfilter'a i jego możliwości w kształtowaniu polityk bezpieczeństwa.

Projektując naszą aplikację sieciową nie sposób przejść obojętnie obok zagadnień filtracji ruchu sieciowego jaki do niej trafia. Realizować to można na wiele sposobów, najprościej podejściem czysto ,,administracyjnym'' TCP Wrappers bądź też netfilterem. Ten drugi sposób w połączeniu z SELinux'em daje ciekawe możliwości, bo wyobraźmy sobie sytuację, w której nasza aplikacja nasłuchuje na porcie powyżej >1024 (czyli zwykły użytkownik może się przybindować do takiego portu), przy pomocy netfiltera przepuszczamy do niej ruch tylko z wybranej podsieci. Aplikacja jednak jest podatna na atak, który skutecznie przeprowadzony jest stanie ,,wyłączyć'' ją, w jej miejsce atakujący uruchamia własną spreparowaną aplikację nasłuchującą na tym samym porcie i tym sposobem uzyskuje dostęp do poufnych informacji. Pewnie scenariusz ma małe szanse na powodzenie, ale dobrze posłuży jako materiał w stylu jak można inaczej bezpieczniej.

Naszą aplikacją niech będzie serwer np. serwer ftp, dowiadujemy się, że na port na którym serwer ten nasłuchuje, przyjmuje następująco oznaczone pakiety:

# sesearch --allow  -s ftpd_t | grep packet
 allow ftpd_t dns_client_packet_t : packet { send recv } ;
 allow ftpd_t unlabeled_t : packet { send recv } ;
 allow ftpd_t ftp_server_packet_t : packet { send recv } ;
...

wystarczy zatem poinstruować netfilter'a aby przy określonych regułach oznaczał pakiety:

iptables -A INPUT -t mangle -p tcp --dport 21 -j SECMARK

--selctx system_u:object_r:ftp_server_packet_t:s0

manipulacje etykietami podobnie jak chociażby przy oznaczaniu ruch do kształtowania wykonujemy w tabeli mangle.  Gdyby jednak zamarzyło się nam oznaczyć ruch inaczej (np. foo_packet_t) wówczas musimy dopisać stosowny moduł polityki  i zawrzeć w nim:

policy_module(foo,1.0.1)

require {
 type ftpd_t;
 type iptables_t;
}

type foo_packet_t;

allow ftpd_t foo_packet_t : packet { send recv };
allow iptables_t foo_packet_t:packet relabelto;

Ostatnia reguła wymagana jest dla samego netfilter'a tak, aby mógł oznaczyć wybrane pakiety.

Podsumowując okazuje się, że w przefiltrowanym ruchu przy pomocy iptables możemy dodatkowo w prosty sposób dookreślić dokładnie aplikację do, której on zmierza, zabezpieczając system chociażby przed omówionym wcześniej zagrożeniem.



Comments