Extended Slackware

Uruchamianie programów graficznych jako inny użytkownik

Data dodania: Fri, 07 Oct 2005 23:13:45 +0200

Autor: dozzie

Wstęp

Artykuł pojawił się najpierw jako propozycja do FAQ na Forum Slackware, gdzie po paru uwagach został nieco rozbudowany. Artykuł, który czytasz, zawiera tą samą treść, co tam zamieszczony.

Skąd program kliencki wie, gdzie się ma wyświetlić?

Program graficzny (klient protokołu X11) odczytuje to ze zmiennej środowiskowej DISPLAY, która zawiera (opcjonalną) nazwę hosta, z którym należy się połączyć, numer serwera X11 oraz (opcjonalny) numer monitora, na którym ma się wyświetlić. Wygląda to jak albercik:1.0 albo :0. Przy logowaniu się do systemu programem login (logowanie na lokalnym terminalu) lub poleceniem su - zmienne środowiskowe są usuwane (wygląda na to, że w przypadku su jeszcze przed inicjalizacją biblioteki PAM, o ile ktoś z niej korzysta), więc trzeba zmienną DISPLAY ustawić ręcznie, choć inne metody nie muszą resetować tej zmiennej (sudo -s, su bez minusa).

Gdzie serwer sprawdza, czy użytkownik może się połączyć?

Zasadniczo serwer X11 najpierw sprawdza swoją listę dostępu, a jeśli nie znajdzie odpowiedniej regułki zezwalającej, żąda od procesu autoryzacji na podstawie sekretu, na przykład MIT-MAGIC-COOKIE-1.

Listę dostępu możemy wyświetlić poleceniem xhost. Bezpiecznym wynikiem jest

[dozzie@albercik dozzie]$ xhost
access control enabled, only authorized clients can connect

Jeśli zaś ujrzysz coś takiego:

[dozzie@albercik dozzie]$ xhost
access control disabled, clients can connect from any host

to znaczy, że najprawdopodobniej masz problem, bo ktokolwiek, kto jest w stanie wysłać dane do twojego X-serwera, może nawiązać sesję X11 i przechwytywać wszystkie zdarzenia zachodzące na serwerze, na przykład wciskane klawisze.

Wygenerowane sekrety są trzymane w binarnym pliku ~/.Xauthority (bądź wskazywanym przez zmienną XAUTHORITY) i można je wyświetlić poleceniem xauth list (xauth list $DISPLAY wyświetli tylko sekrety tylko dla aktualnie używanego X-serwera).

[dozzie@albercik dozzie]$ xauth list   
albercik/unix:0  MIT-MAGIC-COOKIE-1  b026324c6904b2a9cb4b88d6d61c81d1
albercik/unix:1  MIT-MAGIC-COOKIE-1  26ab0db90d72e28ad0ba1e22ee510510
localhost:0  MIT-MAGIC-COOKIE-1  6d7fce9fee471194aa8b5b6e47267f03
alpha:0  MIT-MAGIC-COOKIE-1  48a24b70a0b376535542b996af517398
albercik.pl:0  MIT-MAGIC-COOKIE-1  1dcca23355272056f04fe8bf20edfce0
[dozzie@albercik dozzie]$ xauth list $DISPLAY
albercik/unix:0  MIT-MAGIC-COOKIE-1  b026324c6904b2a9cb4b88d6d61c81d1
[dozzie@albercik dozzie]$ 

Nie muszę chyba wspominać, że ten plik nie powinien być odczytywalny przez nikogo poza właścicielem?

Sposoby zezwalania użytkownikom na połączenia

Najprostszym i najniebezpieczniejszym jest zezwolić całemu światu na połączenia: xhost +. Na to możemy sobie pozwolić jedynie w sieci w pełni zaufanej albo gdy X-serwer jest uruchomiony z opcją -nolisten tcp. Lokalni użytkownicy nadal mogą się łączyć z X-serwerem po gniazdach uniksowych.

Nieco bezpieczniejsze od zezwolenia całemu światu jest zezwolenie na połączenia lokalne bądź z localhosta (jest to mniej więcej ten sam poziom bezpieczeństwa, co przy X-serwerze z opcją -nolisten tcp i zezwoleniem dla całego świata). Wbrew pozorom połączenia lokalne i połączenia z localhosta to nie jest to samo. W pierwszym przypadku połączenie odbywa się za pomocą gniazd uniksowych (tj. pliku typu socket) i zawartość zmiennej DISPLAY wygląda jak :0.0. Na takie połączenia możemy zezwolić poleceniem xhost +local: (typ adresu klienta X11 to local). W przypadku drugim mamy do czynienia z normalnym połączeniem TCP z adresem localhost i zawartość DISPLAY zawiera adres hosta, np. localhost:0.0 czy 127.0.0.1:0.0. Na takie połączenia zezwalamy poleceniem xhost +inet:localhost (typ adresu klienta X11 to inet, czyli IPv4). Typ inet jest domyślnym typem adresu, więc można go pominąć: xhost +localhost.

Znacznie lepszym wyjściem jest zezwolić na połączenia tylko określonej grupie bądź wręcz określonym użytkownikom. Te metody są oznaczone jako server interpreted i specyficzne dla konkretnej implementacji X-serwera, jednak X.Org 6.8.1 ze Slackware 10.1 ma je zaimplementowane. Jak można zezwolić grupie wheel na połączenia z naszym X-serwerem? Poleceniem xhost, a jakże. xhost +si:localgroup:wheel załatwi sprawę. Podobnie xhost +si:localuser:root zezwoli rootowi na połączenia z X-serwerem. Tu się pojawia uwaga: zgodnie z manualem, niektóre suidowane i sgidowane programy mogą zostać uznane przez X-serwer za użytkownika innego niż ten, który je uruchamia, w związku z tym uważaj z tymi ACL-kami.

Ostatnim mi znanym, i chyba najlepszym, rozwiązaniem jest posłużyć się sekretem. Jeśli chcesz uruchamiać programy graficzne jako root, to, jako root, masz prawo odczytu dowolnego pliku w systemie, więc wystarczy ustawić zmienną XAUTHORITY na ~user/.Xauthority, gdzie user to użytkownik, do którego należy sesja serwera X11. W pozostałych przypadkach musisz przekazać użytkownikowi, który ma mieć dostęp do ekranu, sekret. Jako użytkownik, do którego należy sesja X11 wypisz sekret dla bieżącego wyświetlacza:

[dozzie@albercik dozzie]$ xauth list $DISPLAY
albercik/unix:0  MIT-MAGIC-COOKIE-1  4aced9a93775ce0630c28e4896f864ee
[dozzie@albercik dozzie]$ 

Teraz jako użytkownik, który ma uzyskać dostęp do ekranu, wpisz xauth add albercik/unix:0 MIT-MAGIC-COOKIE-1 4aced9a93775ce0630c28e4896f864ee. Teraz, jeśli masz ustawioną zmienną DISPLAY, to programy graficzne powinny się uruchamiać.

Jeśli chcesz odebrać użytkownikowi możliwość używania danego ekranu, możesz zmienić sekret, na przykład generując zupełnie nowy: xauth generate $DISPLAY MIT-MAGIC-COOKIE-1 (albo w skrócie xauth generate $DISPLAY .). Musisz po tym restartować serwer X11.

Literatura

  • man X -- ogólne pojęcie o systemie okien X, w tym składnia nazw wyświetlaczy, lista metod autoryzacji, opcje użytkow (format zapisu kolorów, nazw czcionek, opis zasobów Xresources)
  • man Xsecurity -- opis działania metod autoryzacji użytkowników
  • man xhost -- manual programu zarządzającego listą kontroli dostępu
  • man xauth -- manual programu zarządzającego plikiem sekretów X11

Engine by Dozzie. Awful design by Dozzie.