Xauth i xhost na straży bezpieczeństwa Xserver'a

Spis treści

Na debianie Xserver domyślnie ma wyłączoną możliwość nasłuchiwania połączeń zdalnych. Chodzi oczywiście o kwestie bezpieczeństwa, bo przecie nie od dziś wiadomo, że akurat to oprogramowanie jest dziurawe jak sito i nikt rozsądny nie chciałby instalować go na swoim serwerze. Należałoby jednak rozgraniczyć wykorzystywanie podatności jakiegoś oprogramowania od możliwości wejścia z nim w interakcję. Jakby nie patrzeć, sam Xserver posiada co najmniej trzy mechanizmy ochrony, a do tego dochodzą jeszcze reguły iptables , czy też pliki /etc/hosts.allow i /etc/hosts.deny . Prawdopodobnie jest ich jeszcze kilka ale te najczęściej wykorzystywane mechanizmy gdy pojawia się słowo Xserver, to -nolisten tcp (domyślnie aktywowany), xhost oraz xauth . Pierwszy z nich wyklucza się z pozostałymi i to tym dwóm ostatnim przyjrzymy bliżej w tym wpisie.

Mechanizmy xhost oraz xauth w żaden sposób nie zabezpieczają informacji przesyłanych do Xserver'a. Wobec czego, całą komunikację można bez problemu podsłuchać. Stwarza to zagrożenie przechwycenia nie tylko obrazu wyświetlanego na monitorze ale także danych dotyczących myszy i przyciskanych klawiszy na klawiaturze.

Mechanizm xhost

Każdy menadżer logowania, jak i sam startx mają domyślnie ustawioną opcję -nolisten tcp . W przypadku gdy ją usuniemy i proces X zostanie uruchomiony z opcją -listen tcp , to Xserver zacznie nasłuchiwać na porcie TCP 6000. Niemniej jednak, komunikacja z Xserver'em nie będzie dalej możliwa. Pakiety sieciowe będą, co prawda, trafiać do niego ale żadne połączenie nigdy nie zostanie ustanowione, a to za sprawą polityki jaką ustawia mechanizm xhost , którą to możemy podejrzeć wpisując w terminalu to poniższe polecenie:

$ xhost
access control enabled, only authorized clients can connect
SI:localuser:morfik

Komunikat informuje nas, że dostęp jest filtrowany oraz, że tylko autoryzowani klienci mogą uzyskać połączenie. Na liście jest tylko jeden klient, którym jest lokalny użytkownik systemu morfik . Każda inna osoba, która by się spróbowała połączyć z tym Xservere'm, nie uzyska połączenia.

Problem z xhost polega na tym, że możemy określać za jego pomocą jedynie adresy IP lub domeny, z których połączenia mogą być akceptowane. Ten mechanizm miał rację bytu w zamierzchłych czasach, gdzie było nie wiele komputerów i każdy miał przypisany określony adres IP. Obecnie, przy szerokim wykorzystaniu technologi NAT, bardzo wielu ludzi ma ten sam adres IP i w ich przypadku możemy zezwolić im wszystkim na dostęp albo też im go odmówić. Generalnie rzecz biorąc, xhost nie powinien być wykorzystywany w internecie.

Nic jednak nie stoi na przeszkodzie by korzystać z niego w przypadku bezpiecznych sieci lokalnych lub też kontenerów LXC lub innych sposobów wirtualizacji. W każdym z tych powyższych przypadków musimy nauczyć Xserver, które połączenia ma akceptować. Najprościej jest posłużyć się znakami + i - , przykładowo:

$ xhost +192.168.10.20
$ xhost -192.168.10.20

Pierwsza linijka zezwala hostowi o adresie 192.168.10.20 na podłączenie do Xserver'a. Po wpisaniu drugiej, to prawo zostanie mu odebrane. To w zasadzie cała funkcjonalność xhost . Dodawanie hostów ma tylko efekt w czasie trwania sesji graficznej. Po zresetowaniu Xserver'a trzeba ponownie dodać pożądane hosty do białej listy. Jeśli jakiś host ma łączyć się z naszym Xserver'em cały czas, to trzeba będzie dodać taki wpis do autostartu środowiska graficznego. Więcej informacji można znaleźć w manualu xhost .

Mechanizm xauth

Innym rozwiązaniem i przy tym o wiele bezpieczniejszym są ciasteczka Xserver'a trzymane z reguły w katalogu użytkownika w pliku ~/.Xauthority . Mechanizm xauth różni się poprzednika tym, że nie operuje na adresach IP czy domenach, przynajmniej nie tak jak robił to xhost . Zamiast tego, generowana jest informacja, na podstawie której klient może zostać wpuszczony przy podłączeniu do zdalnego Xserver'a. Dane w takim ciasteczku mogą zostać wydobyte na serwerze i przesłane, np. przy pomocy ssh, do klienta i tam dołączone do jego pliku ~/.Xauthority .

By skorzystać z tego mechanizmu, musimy wygenerować ciasteczko oraz odpalić proces X z opcją -auth "$HOME/.Xauthority" . Najprościej to zrobić edytując plik /etc/X11/xinit/xserverrc i umieszczając w nim ten poniższy wpis:

exec /usr/bin/X -auth "$HOME/.Xauthority" -listen tcp "$@"

Jeśli korzystamy z graficznego menadżera logowania, to edycja powyższego pliku raczej nic nam nie da. Każdy menadżer logowania ma swoje opcje i to on podnosi proces X . Może mu również podać określone parametry. Dla przykładu, poniżej jest plik konfiguracyjny LightDM, /etc/lightdm/lightdm.conf :

xserver-command=X -auth "$HOME/.Xauthority" -listen tcp
xserver-allow-tcp=true

Po tym jak ustawimy parametr odpowiedzialny za ciasteczko, Xserver będzie akceptował jedynie połączenia od tych klientów, którzy posiadają pewne informacje autoryzacyjne. Ważne jest przy tym, by taki klient miał zainstalowany w swoim systemie pakiet xauth . Zawiera on bowiem narzędzia, które operują na tych ciasteczkach.

W przypadku gdybyśmy nie mieli jeszcze tego ciasteczka (pliku $HOME/.Xauthority ), możemy utworzyć je ręcznie:

$ mcookie|sed -e 's/^/add :0 . /'|xauth -q

Jednak to, że go nie mamy jest mało prawdopodobne, bo program startujący Xserver, czy to startx , czy też DM, tworzą ten plik automatycznie. Jedyny problem przed jakim teraz stoimy, to przesłanie informacji autoryzujących połączenie do Xserver'a na drugą maszynę. Jak wspomniałem wyżej, możemy to zrobić przy pomocy ssh:

$ xauth extract - morfikownia.mhouse.lh:0.0 | ssh -x morfik@192.168.10.20 xauth merge -

Fraza morfikownia.mhouse.lh to domena zdalnego Xserver'a. Można zamiast niej określić adres IP. Z kolei :0.0 określa z którego ekranu zamierzamy korzystać.

W przypadku korzystania z LightDM, xauth extract - morfikownia.mhouse.lh:0.0 zwraca komunikat: "No matches found, authority file "-" not written". Nie wiem czemu tak się dzieje, bo na sesji odpalonej za pomocą startx , wszystko działa jak należy. Alternatywą może być skorzystanie ze zmiennej $DISPLAY i przesłanie ciasteczka w ten poniższy sposób:

$ xauth extract - $DISPLAY | ssh -x morfik@192.168.10.20 xauth merge -

Jeśli ciasteczko zostało pomyślnie przesłane, na maszynie zdalnej powinniśmy być je w stanie podejrzeć:

$ xauth list
morfikownia.mhouse.lh:0  MIT-MAGIC-COOKIE-1  a578170842011b9f496ab3d8d91456bc
Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.