Gentoo Hardened - często zadawane pytania
1.
Pytania
Ogólne
PaX
grsecurity
RSBAC
SELinux
2.
Pytania ogólne
Co to jest "toolchain"?
Termin "toolchain" odnosi się do zbioru pakietów oprogramowania, który jest
wykorzystywany do rozwijania i budowania aplikacji na konkretną architekturę
sprzętową. "Toolchain" o którym można usłyszeć na kanale IRC #gentoo-hardened,
składa się z GNU Compiler Collection (GCC), pakietu binutils oraz biblioteki GNU
C (glibc).
Z czego korzystać: grsecurity, RSBAC czy SELinux?
Odpowiedź na to pytanie jest wysoce subiektywna. Projekt Gentoo Hardened
wskazuje różne rozwiązania, natomiast wybór należy do użytkowników. Decyzja
wymaga analizy, którą - mamy nadzieję - ułatwi niniejsza dokumentacja. Jeśli
jednak rodzą się konkretne pytania dotyczące modelu bezpieczeństwa wprowadzanego
przez każde z rozwiązań, to zachęcamy do skorzystania z listy mailingowej oraz
do zadawania pytań odpowiednim deweloperom.
Czy jest możliwe jednoczesne korzystanie z grsecurity, SELinux oraz
PaX?
Tak, taka kombinacja jest możliwa gdyż PaX pracuje zarówno z grsecurity, RSBAC
jak i SELinux. Jedyny konflikt jaki może mieć miejsce ma swoje źródło w tym, że
możemy korzystać tylko z jednego systemu kontroli dostępu.
Czy należy dodać jakieś flagi do LDFLAGS/CFLAGS, aby włączyć kompilację z
PIE/SSP?
Nie. Obecny "toolchain" automatycznie dostarcza odpowiednik CFLAGS="-fPIE
-fstack-protector-all" LDFLAGS="-Wl,-z,now -Wl,-z,relro", poprzez pliki
specyfikacji GCC (ang. specfile). Jest to lepsze rozwiązanie niż flagi. W
przypadku, gdy korzystamy ze starszej wersji hardened-gcc musimy dodać
USE="hardened pic" do pliku /etc/make.conf, a następnie
wykonać aktualizację przy użyciu poleceń:
Listing 2.1: Instalacja toolchain w wersji hardened |
# emerge --oneshot binutils gcc virtual/libc
# emerge -e world
|
Uwaga:
Gentoo stosuje patche do GCC, które umożliwiają przekazanie pliku specyfikacji
poprzez zmienną środowiskową. Obecnie w Gentoo instalowanych jest kilka zestawów
plików specyfiakcji, co pozwala użytkownikom obsługiwanych architektur łatwo
włączać i wyłączać funkcjonalności toolchain. Użytkownicy końcowi mogą uzyskać
dostęp do plików specyfikacji wykorzystując narzędzie gcc-config.
|
Jak wyłączyć kompilację z PIE/SSP?
Możemy tego dokonać używając programu gcc-config:
Listing 2.2: Przykładowy wynik polecenia gcc-config -l |
# gcc-config -l
[1] i686-pc-linux-gnu-3.4.4 *
[2] i686-pc-linux-gnu-3.4.4-hardenednopie
[3] i686-pc-linux-gnu-3.4.4-hardenednopiessp
[4] i686-pc-linux-gnu-3.4.4-hardenednossp
[5] i686-pc-linux-gnu-3.4.4-vanilla
# gcc-config i686-pc-linux-gnu-3.4.4-hardenednossp
|
Możemy również zmienić nasze flagi CFLAGS:
Standardową opcję SSP dla budowania binariów można wyłączyć przez dodanie
-fno-stack-protector-all -fno-stack-protector do zmiennej CFLAGS.
Jeśli chcemy wyłączyć domyślną opcję PIE, to dodajemy -nopie do
naszej zmiennej CFLAGS.
Ważne:
Flaga -fno-pic nie powinna być używana, gdyż powoduje to generowanie kodu
non-PIC (opcja -fpic generuje kod niezależny od pozycji, tzn. wszystkie
statyczne adresy w obrębie kodu są otrzymywane z tzw. globalnej tablicy
wskaźników. Ustawienie -fno-pic powoduje, że globalna tablica wskaźników
nie jest wykorzystywana - przyp. tłum.). Powrót do standardowego zachowania GCC
uzyskujemy poprzez flagę -nopie.
|
Uwaga:
Jeśli dla każdego pakietu w Portage chcemy korzystać z osobnych ustawień
CFLAGS, to warto zapoznać się ze skryptem, przygotowanym przez solara, który
został stworzony do tego celu:
http://article.gmane.org/gmane.linux.gentoo.hardened/1204.
|
Proces budowy kernela zostaje przerwany i pojawia się błąd "error:
structure has no member named `curr_ip'", jak to naprawić?
Aby móc korzystać z PaX w pakiecie hardened-sources, musimy włączyć obsługę
grsecurity w kernelu. W przyszłej wersji powinno to zostać naprawione.
Dopiero poznaję Gentoo Hardened. Czy muszę zainstalować wszystko co zostało
wymienione na stronie projektu, by mieć Gentoo w wersji hardened?
Nie. Gentoo Harened jest zbiorem podprojektów, które mają wspólne założenia
odnośnie bezpieczeństwa. Wiele z nich może być zainstalowana wspólnie z innymi.
Niektóre powodują konflikty, jak np. kilka implementacji list kontroli dostępu
(ACL) oferowanych przez projekt Gentoo Hardened.
Dlaczego programy nie działają jeśli korzysta się z CFLAGS="-O3" i gcc
hardened?
W niektórych sytuacjach równoczesne używanie flagi -O3 i SSP (ang.
stack-smashing protector) powoduje problemy. Flaga -O3 nie jest
oficjalnie wspierana i dlatego zespół projektu Hardened odradza jej
wykorzystywanie. Raporty problemów, zgłaszane przez użytkowników korzystających
z CFLAGS="-O3", będą zamykane ze statusem INVALID/CANTFIX i/lub
ignorowane.
Co się stało z bootstrap-cascade.sh?
Stare wersje bootstrap.sh i bootstrap-2.6.sh stały się nieaktualne i zastąpiono
je przez bootstrap-cascade.sh. Następnie zmieniono nazwę skryptu
bootstrap-cascade.sh na bootstrap.sh.
Jak przełączyć się na profil hardened?
Listing 2.3: Ustawiamy make.profile |
# cd /etc
# rm make.profile
# ln -s ../usr/portage/profiles/hardened/x86 make.profile
# ln -s ../usr/portage/profiles/hardened/x86/2.6 make.profile
|
Po zmianie profilu należy przekompilować system korzystając z toolchain w wersji
hardened, tak by mieć spójny system podstawowy:
Listing 2.4: Przełączenie na toolchain w wersji hardened |
# emerge --oneshot binutils gcc virtual/libc
# emerge -e world
|
Jak należy debugować z gdb?
Pierwszym problemem jest fakt, że GDB nie jest w stanie określić symboli w PIE,
gdyż nie wie, że adresy w PIE są względne, a nie bezwzględne. Ujawnia się to,
gdy staramy się prześledzić działanie programu i widzimy ciąg linii ze znakami
'??' w miejscach, gdzie powinny znajdować się symbole.
Aby obejść ten problem, należy ostatni etap łączenia programu przeprowadzić z
opcją -nopie. Wszystkie wcześniejsze etapy mogą być przeprowadzane tak
jak zawsze z opcją -fPIE (jest to domyślny sposób w przypadku kompilatora
hardenend). W ten sposób plik wykonywalny jest jak najbardziej bliski
prawdziwemu obiektowi, jednak ostatnie dowiązanie tworzy regularny plik
wykonywalny. Flagę -nopie można dodać do zmiennej LDFLAGS, jeśli
budujemy pakiety przy pomocy emerge.
Innym sposobem rozwiązania tego problemu jest instalacja =sys-devel/gdb-6.3-r5,
paczka ta daje możliwość debugowania binarek zlinkowanych z -pie.
Drugą pułapką jest potencjalne uniemożliwienia przez PAX ustawienia punktów
kontrolnych GDB, zależnie od tego jak skonfigurowane jest jądro. Dotyczy
to również punktu kontrolnego ustawionego na funkcji main, którego potrzebujemy,
aby cokolwiek rozpocząć. Aby zapobiec takiemu działaniu PaX-a, plik wykonywalny,
który poddajemy debugowaniu musi posiadać flagi 'm' i 'x'. Flaga 'x' ustawiana
jest domyślnie, więc wystarczy wydać jedynie poniższe polecenie:
Listing 2.5: Ustawianie PaX-a do debugowania |
# /sbin/paxtcl -m foo
|
W tym momencie wszystko powinno być ustawione i gotowe do pracy. GDB
uruchamiamy w normalny sposób. Powodzenia w debugowaniu!
3.
Pytania dotyczące PaX
Jaki jest adres strony domowej PaX?
Strona domowa PaX znajduje się pod adresem http://pax.grsecurity.net.
Czy istnieje jakaś dokumentacja Gentoo dotycząca PaX?
Obecnie jedyną dokumentacją Gentoo dotyczącą PaX jest krótki przewodnik po
PaX, dostępny na stronie
http://www.gentoo.org/proj/pl/hardened/pax-quickstart.xml.
Bez przerwy pojawia się komunikat: "error while loading shared libraries: cannot
make segment writable for relocation: Permission denied". Co to oznacza?
Informacja o błędzie pojawia się wtedy, gdy włączymy CONFIG_PAX_NOELFRELOCS w
następujący sposób:
Listing 3.1: Opcje w menuconfig |
Non-executable page ->
[*] Disallow ELF text relocations
|
Jeśli korzystamy z "toolchain" w wersji hardened, to zazwyczaj podczas
kompilacji powstają biblioteki ELF z opcją PIC, nie zawierające relokacji sekcji
text (text jest jedną z sekcji pliku binarnego ELF - przyp. tłum.). Jednakże z
różnych powodów, niektóre biblioteki nadal zawierają relokacje tej sekcji (są to
najczęściej te, które zawierają nieprawidłowo obsługiwane fragmenty). Może to
stanowić lukę w zabezpieczeniach, gdyż potencjalny agresor może wykorzystać
biblioteki skompilowane z opcją non-PIC do wykonania swojego shellcode.
Biblioteki z opcją non-PIC mają także niepożądany wpływ na zużycie pamięci,
ponieważ podważają sens istnienia bibliotek współdzielonych.
Możemy pozbyć się tego błędu i pozwolić by program działał, lecz musimy
poświęcić bezpieczeństwo, pozwalając na generowanie kodu w trakcie działania
programu. Opcja PaX, która to umożliwia nazywa się MPROTECT. Należy wyłączyć
MPROTECT dla każdego pliku wykonywalnego, który korzysta z bibliotek
skompilowanych z non-PIC.
Aby sprawdzić, czy w naszym systemie znajdują się biblioteki zawierające
relokacje sekcji text, możemy wykorzystać program scanelf z pakietu
app-misc/pax-utils. Więcej informacji o używaniu pakietu pax-utils
znajdziemy w dokumencie Gentoo PaX Utilities Guide.
Uwaga:
Nowsze wersje sys-apps/portage (>=2.0.53) sprawdzają biblioteki pod
względem występowania relokacji sekcji text i wyświetlają ostrzeżenia lub nawet
przerywają proces budowania programu. Zachowanie Portage zależy od ustawień
zmiennej FEATURES w pliku /etc/make.conf.
|
Dlaczego Java nie działa z PaX?
Wirtualna maszyna Javy przy każdym uruchomieniu generuje znaczną ilość kodu, co
nie wpływa na PaX zbyt dobrze. Istnieją dwa rozwiązania problemu:
Listing 3.2: Instalacja chpax |
# emerge chpax
# /etc/init.d/chpax start
|
Jeśli już posiadamy program chpax, możemy wykonać polecenie:
Listing 3.3: Opcja chpax dla java |
# chpax -pemrxs /opt/*-jdk-*/{jre,}/bin/*
|
Obydwie opcje lekko modyfikują nagłówek ELF, tak by było możliwe ustawienia flag
PAX na binariach.
Uwaga:
Jeśli używamy PaX w połączeniu z dodatkowymi mechanizmami bezpieczeństwa, takimi
jak RSBAC, grsecurity lub SELinux, to powinniśmy zarządzać PaXem przy użyciu
dowiązań do funkcji kernela (ang. kernel hook), dostarczonych z każdą
implementacją.
|
Poniższą komendą można przy włączonym RSBAC poetykietować wszystkie pliki
Javy.
Listing 3.4: Opcje PaX dla Javy, przy włączonym RSBAC |
# for i in $(ls /opt/*(jdk|sdk)*/{jre,}/bin/*);do attr_set_file_dir FILE $i pax_flags pmerxs;done
|
4.
Pytania dotyczące grsecurity
Jaki jest adres strony domowej grsecurity?
Strona domowa grsecurity znajduje się pod adresem
http://www.grsecurity.net.
Czy istnieje jakaś dokumentacja Gentoo dotycząca grsecurity?
Najbardziej aktualną dokumentacją na temat grsecurity jest krótki przewodnik po
Grsecurity2, znajdujący się pod adresem
http://www.gentoo.org/proj/en/hardened/grsecurity.xml.
Czy można używać grsecurity z kernelami 2.6.8, 2.6.8.1 albo
2.6.9?
W związku ze znacznymi zmianami w kernelu 2.6.8, które uniemożliwiły obsługę
PaX, poprawki PaX i grsecurity dla wersji 2.6.8, 2.6.8.1 i 2.6.9 nie są
dostępne. Mimo istnienia eksperymentalnej poprawki na kernel 2.6.10, przed jej
użyciem należy zapoznać się z oficjalnym stanowiskiem zespołu tworzącego PaX
odnośnie serii 2.6:
http://forums.grsecurity.net./viewtopic.php?t=968.
5.
Pytania dotyczące RSBAC
Jaki jest adres strony domowej RSBAC?
Strona domowa RSBAC znajduje się pod adresem http://www.rsbac.org.
Czy istnieje jakaś dokumentacja Gentoo, dotycząca RSBAC?
Cała dokumentacja Gentoo dotycząca RSBAC znajduje się na stronie podprojektu
RSBAC, dostępnej pod adresem:
http://www.gentoo.org/proj/en/hardened/rsbac/index.xml
Ponadto podręcznik RSBAC, dostępny pod adresem
http://www.rsbac.org/documentation/rsbac_handbook, stanowi źródło
niezwiązanych bezpośrednio z Gentoo informacji o tym projekcie.
Jak można korzystać ze startowego dysku RAM, gdy posiadamy kernel
z włączonym RSBAC?
W kernelach z włączonym RSBAC, by używać startowego dysku RAM należy zaznaczyć
specjalną opcję, która zapobiega traktowaniu initrd jako głównego urządzenia
([ang.] root device).
Listing 5.1: Opcje w menuconfig |
General RSBAC options --->
[*] Delayed init for initial ramdisk
|
6.
Pytania dotyczące SELinux
Gdzie można znaleźć listę odpowiedzi na często zadawane pytania dotyczące
SELinux?
Odpowiedzi na często zadawane pytania dotyczące SELinux można znaleźć w Podręczniku
SELinux.
|