NFsec Logo

Zapomniany klawisz SysRq

29/05/2010 w Administracja, Bezpieczeństwo Brak komentarzy.  (artykuł nr 261, ilość słów: 1711)

J

eśli pracujemy na developerskiej maszynie nad rozwojem jądra systemu lub sterowników urządzeń wspieranych przez jądro, lub nawet uruchamiamy testowy kod, który prawdopodobnie spowoduje tzw. błąd kernel panic – możemy wykorzystać poniżej przedstawione rozwiązanie, które przydaje się w przypadkach kiedy nasza maszyna z jakieś przyczyny zawiesza się, zamieniając się w nagromadzony stos części komputerowych (sposób ten jest bezużyteczny, gdy jądro zupełnie zamknie się na świat, pozostaje wówczas tylko twardy reset). Poprzez kombinację odpowiednich klawiszy możemy przeprowadzić synchronizację systemu plików oraz przemontować go w tryb tylko do odczytu. W ten sposób poprzez restart komputera unikniemy utraty danych oraz sesji programu fsck.

Do poprawnego zadziałania wspomnianego sposobu, niezbędne jest wkompilowanie w jądro systemu (opcja ta jest zaimplementowana od wersji 2.1.x i wyższych) funkcji “Magic SysRq key” (CONFIG_MAGIC_SYSRQ) – znajduje się ona w sekcji “Kernel hacking” (Kernel debugging). Po uruchomieniu systemu z jądrem obsługującym SysRq key, sprawdzamy, czy dodana przez nas funkcja jest standardowo włączona:

cat /proc/sys/kernel/sysrq

Jeśli powyższe polecenie zwróci nam wartość “0”, pozostaje ręczne włączenie obsługi klawisza SysRq np. poprzez dodanie do /etc/rc.d/rc.local wpisu:

echo -e "Włączam funkcję klawisza SysRq\n"
echo "1" > /proc/sys/kernel/sysrq

Dla innych dystrybucji korzystających z mechanizmu sysctl do pliku /etc/sysctl.conf należy dodać wpis:

kernel.sysrq = 1

Po aktywowaniu funkcji Magic SysRq key podczas nagłych awarii pracy systemu jesteśmy już w stanie używać kombinacji klawiszy umożliwiających nam jego uratowanie w przypadku zawieszenia. Kombinacje klawiszy używanych na każdej z platform komputerowych są trochę inne, i tak dla poszczególnych platform są to:

x86 - ALT+PrtSc+[klawisz komendy]
Laptopy - Alt+(Fn+PrtSc)+[klawisz komendy]
SPARC - ALT+STOP+[klawisz komendy]
Konsola szeregowa - ALT+Break+[klawisz komendy]
PowerPC - ALT+PrtSc (lub F13)+[klawisz komendy]
Na wszystkich - komenda: echo t > /proc/sysrq-trigger

Klawiszem SysRq w komputerach PC o architekturze x86 jest klawisz “Print Screen” (na niektórych klawiaturach widnieje podwójna etykieta: PrtSc oraz SysRq). SysRq jest klawiszem, którego obsługi w systemie Linux nie może przejąć żaden inny proces. Każde jego aktywowanie (a jest wywoływany poprzez jednoczesne przytrzymanie klawiszy ALT i PrtSc) jest przetwarzane na poziomie jądra. Użyty razem z innymi kombinacjami daje następujące efekty:

  • Alt+PrtScr+R (R’aw) – wyłącza tryb RAW klawiatury, przełączając go na XLATE. Wyłączenie trybu RAW jest bardzo pomocne, gdy serwer X lub svgalib się zawiesi. W ten sposób jesteśmy w stanie przesłać sygnał z kombinacji klawiszy Crtl+Alt+Del podczas zawieszonej sesji X.
  • Alt+PrtScr+K (sa’K) – Secure Access Key (SAK) – zabija wszystkie programy w aktualnej konsoli wirtualnej. Szczególnie przydatna kombinacja, gdy chcemy się upewnić, że na konsoli nie działa żaden koń trojański, który mógłby przechwycić nasze hasło podczas próby zalogowania się do systemu. Kombinacja ta zabije wszystkie programy na danej konsoli upewniając, że znak zachęty logowania do systemu będzie pochodził z programu uruchamianego z pozycji wpisu programu init. Innym wykorzystaniem tej kombinacji jest – System Attention Key – klawisz zwrócenia uwagi systemu, który używany jest podczas wyjścia z programu, który nie pozwala na przełączanie się między konsolami, np. ostateczne wyłączenie sesji X Window, gdy kombinacja klawiszy Ctrl+Alt+Backspace nie przynosi pożądanego efektu.
  • Alt+PrtScr+B (re’B’oot) – spowoduje natychmiastowe zresetowanie komputera, bez synchronizacji oraz odmontowania dysków. Kombinacja przydatna w przypadku, kiedy nie możemy dokonać zamknięcia systemu. Lecz przed jej użyciem należy skorzystać z klawiszy komend: S oraz U – bez tego grozi to uszkodzeniem systemu plików – ponieważ efekt tej kombinacji jest taki sam jak naciśnięci przycisku RESET na obudowie komputera.
  • Alt+PrtScr+O – (shut d’O’wn) – jeśli funkcja ta jest obsługiwana oraz skonfigurowania nastąpi wyłączenie systemu.
  • Alt+PrtScr+S – (‘S’ync) – spróbuje przeprowadzić synchronizację oraz odmontowanie wszystkich systemów plików. Bardzo dobra opcja, gdy system zamkną się w sobie, która pozwala na synchronizację dysków oraz uniknięcie utraty danych oraz sesji programu fsck. Podczas używania tej opcji należy zwrócić uwagę na ukazanie się komunikatu: “OK” lub “Done” po poprawnym przeprowadzeniu procesu, ponieważ w wypadku, gdy jądro zaliczyło nieskończoną pętle myśli komunikat taki może wcale się nie ukazać.
  • Alt+PrtScr+U (‘U’mount ) – spróbuje przemontować wszystkie zamontowane systemy plików w tryb tylko do odczytu. Kombinacja ta jest użyteczna w tych samych warunkach jak ‘S’ync. Tak samo jak w kombinacji powyżej należy poczekać na ukazanie się komunikatu: “OK” lub “Done”.
  • Alt+PrtScr+P (‘P’rint) – wyświetla aktualny stan rejestrów i flag procesora. Głównie przydatne podczas debugowaniu jądra systemu.
  • Alt+PrtScr+T (‘T’asks) – wyświetla listę aktualnych zadań systemowych oraz informacji o nich na konsolę.
  • Alt+PrtScr+M (‘M’emory) – wyświetla na konsoli informacje na temat pamięci.
  • Alt+PrtScr+V (‘V’oyager) – wyświetla informacje na temat architektury przetwarzania symetrycznego Voyager SMP na konsoli. Architektura Voyager SMP została zaprojektowana przez NCR w środku lat 80’tych, która miała być architekturą przetwarzania symetrycznego umieszczoną w chipsetach 486 Intela. Voyager został stworzony w trzech poziomach sofistyki architektonicznej: 3,4 oraz 5 – 1 i 2 nigdy nie wydostały się z prototypu. Patche na Linuksa obsługują tylko piąty poziom architektury Voyagera.
  • Alt+PrtScr+0 do 9 – ustawia poziom logowania na konsoli – kontrolując jakie komunikaty mają się pojawiać na konsoli (dla przykładu ‘0’ spowoduje wyświetlanie tylko wiadomości krytycznych pochodzących od jądra systemu). Bardzo przydatna opcja, gdy nasza konsola jest zalewana wiadomościami, których nie potrzebujemy lub nie chcemy. Ustawienie np. 0 poziomu spowoduje, że tylko bardzo ważne komunikaty będą ukazywane na konsoli (nadal będą logowane przez syslogd / klogd – jeśli tylko te będą jeszcze żywe).
  • Alt+PrtScr+E (t’E’rm) – wysyła sygnał TERM do wszystkich procesów, oprócz init, prosząc o ich samounicestwienie. Przydatna kombinacja w przypadku, gdy jakiś proces wymknie się nam spod kontroli i nie daje się zamknąć w dodatku powodując rozradzanie się innych procesów.
  • Alt+PrtScr+I (k’I’ll) – wysyła sygnał KILL do wszystkich procesów, oprócz init, wymuszając ich zabicie. Analogicznie jak w przypadku kombinacji z klawiszem “E”.
  • Alt+PrtScr+L (kil’L’) – wysyła sygnał KILL do wszystkich procesów, włączając w to init (po tej kombinacji system staje się niefunkcjonalny).
  • Alt+PrtScr+H (‘H’elp) – wyświetla ekran pomocy.

Jeśli z jakieś przyczyny kombinacja SysRq nam nie działa, prawdopodobnie jest to spowodowane tym, że niektóre klawiatury wysyłają różne skankody, niż wcześniej zdefiniowany kod 0x54. Aktualny kod klawisza SysRq możemy sprawdzić za pomocą polecenia:

cat /proc/sys/kernel/sysrq-key

Zazwyczaj powinna zostać zwrócona wartość 84. W tym przypadku należy uruchomić program: “showkey -s” w celu wyszukania prawidłowej sekwencji skankodu. Następnie należy uruchomić program: “setkeycodes [sekwencja] 84” w celu zdefiniowania sekwencji dla zwyczajnego kodu SysRq (84 jest liczbą dziesiętną dla 0x54). Jeśli przedefiniowanie zadziała, najlepiej umieścić je w jakimś skrypcie startującym (z programu showkey wychodzi się poprzez nie pisanie czegokolwiek przez dziesięć sekund).

Przykładowe skankody dla klawiatury AT:

F1 F2    `  1  2  3  4  5  6  7  8  9  0  -  =  \ BS   ESC NUML SCRL SYSR 
-----   ---------------------------------------------  ------------------
05 06   0E 16 1E 26 25 2E 36 3D 3E 46 45 4E 55 5D 66    76  77   7E   84

F3 F4   TAB   Q  W  E  R  T  Y  U  I  O  P  [  ]       Home Up  PgUp PrtSc
-----   -----------------------------------------      -------------------
04 0C    0D  15 1D 24 2D 2C 35 3C 43 44 4D 54 5B        6C  75   7D   7C

F5 F6   CNTL   A  S  D  F  G  H  J  K  L  ;  ' ENTER   Left  5  Right  -
-----   --------------------------------------------   ------------------
03 0B    14   1C 1B 23 28 34 33 38 42 4B 4C 52   5A     6B  73   74   7B

F7 F8   LSHFT    Z  X  C  V  B  N  M  ,  .  /  RSHFT   End  Dn  PgDn   +
-----   --------------------------------------------   ------------------
83 0A     12    1A 22 21 2A 32 31 3A 41 49 4A   59      69  72   7A   79

F9 F10  ALT                  SPC             CAPLOCK   Ins      Del
------  --------------------------------------------   -------------
01 09    11                   29               58       70       71

W przypadku, gdy nasza maszyna się zawiesi, a kombinacja Ctrl+Alt+Del (w trybie tekstowym dla sesji X Window jest to: Ctrl+Alt+Backspace) nie działa – najlepiej jest zabić wszystkie procesy na aktualnej konsoli kombinacją: Alt+PrtSc+K (w przypadku paranoicznego zachowania możemy używać tej kombinacji przed każdym logowaniem się do systemu), a następnie przeprowadzić bezpieczny restart komputera poprzez kolejno wydane kombinacje: R]aising E]lephants I]s S]o U]tterly B]onkers – powodująca kolejno wyłączenie klawiatury z czystego trybu, zakończenia wszystkich procesów za pomocą sygnału SIGTERM (oprócz init o PID 1), zabicia wszystkich procesów za pomocą sygnału SIGKILL (także oprócz init), zsynchronizowanie dysków, przemontowanie wszystkich systemów plików w tryb tylko do odczytu oraz ponowne uruchomienie komputera. Możemy również “skleić” klawisze Alt oraz SysRq za pomocą polecenia:

echo 1 > sysrq-sticky

Spowoduje to, odczytywanie całych kombinacji za pomocą pojedynczych klawiszy np. wówczas będzie wymagane wpisanie jedynie na klawiaturze słowa: reisub. Niestety, aby skorzystać z tej możliwości musimy posiadać możliwość przesłania za pomocą polecenia echo odpowiedniej wartości, co w przypadku zawieszenia się systemu bardzo często może być niemożliwe. Drugim sposobem, jeśli nie posiadamy bezpośredniego dostępu do klawiatury serwera lub terminala możemy wykorzystać system plików procfs do wykonania powyższych komend. Wystarczy, że przekażemy charakterystyczną końcową LITERĘ do /proc/sysrq-trigger:

echo o > /proc/sysrq-trigger

To jest równoznaczne wciśnięciem kombinacji klawiszy Alt+SysRq+o, która wyłącza komputer. Podobnie jak w przypadku kombinacji klawiszy Alt+Ctrl+Del, należy mieć również na uwadze względy bezpieczeństwa, ponieważ rozwiązanie to daje niebezpieczne możliwości manipulacji systemem każdemu, kto ma fizyczny dostęp do klawiatury lub konsoli serwera. Dlatego w środowiskach produkcyjnych klawisz SysRq powinien zostać wyłączony:

echo 0 > /proc/sys/kernel/sysrq

lub, co najmniej ograniczony do wybranego działania poprzez odpowiednie wartości np.:

echo 2 > /proc/sys/kernel/sysrq

Włącza jedynie kontrolę poziomu wyświetlania komunikatów na konsoli. Innymi dostępnymi wartościami są: 4, 8, 16, 32, 64, 128 oraz 256.

Więcej informacji: man showkey, loadkeys, /usr/src/kernel/linux/Documentation/sysrq.txt

Kategorie K a t e g o r i e : Administracja, Bezpieczeństwo

Tagi T a g i : , , , , , ,

Komentowanie tego wpisu jest zablokowane.