Logread, czyli system logowania w OpenWRT

Spis treści

Każdy szanujący się system, nawet ten najmniejszy na bazie OpenWRT, musi posiadać mechanizm logowania komunikatów. Logi routera to bardzo ważna rzecz. Jeśli coś dolega naszemu małemu przyjacielowi, to jest niemal pewne, że właśnie wśród tych wiadomości znajdziemy przyczynę problemów. Każda usługa systemowa działająca na routerze przesyła logi, które są zbierane przez demon logowania. W Chaos Calmer odpowiadają za to logd oraz logread . Standardowa konfiguracja logów w OpenWRT nie jest raczej skomplikowana ale niewiele osób wie, że logi routera można zapisywać w pliku lub przesłać je przez sieć do innego hosta. W tym wpisie postaramy się właśnie zrealizować te dwa zadania.

Odczytywanie logów za pomocą logread

Standardowo po instalacji OpenWRT, wszystkie komunikaty systemowe są gromadzone w pamięci routera. Dlatego też, za każdym razem, gdy router zostanie uruchomiony ponownie, wszelkie informacje o przeszłych zdarzeniach są wymazane. Utrudnia to trochę analizę problemów, zwłaszcza w przypadku, gdy nie możemy z jakiegoś powodu zdalnie się dostać do urządzenia. Niemniej jednak, tego typu zdarzenia są raczej rzadkie, dlatego też przyjrzyjmy się nieco bliżej narzędziu logread . Logujemy się zatem na router i w terminalu wpisujemy polecenie logread :

logread-openwrt-komunikaty-log

Wyżej mamy szereg komunikatów, które zostały zwrócone przez działające na routerze usługi. Oczywiście log uzyskany w taki sposób jest dość obszerny ale bez problemu może go przefiltrować przy pomocy polecenia grep :

logread-openwrt-komunikaty-log-filtr

Każdy komunikat zawiera datę zalogowanej wiadomości Sat Apr 16 , czyli w tym przypadku sobota, 16 kwietnia. Dalej mamy dokładny czas 08:29:29 . Następnie mamy rok 2016 chyba. Dziwny zapis. W każdym razie już w oparciu o te informacje możemy przeszukiwać log. Dalej mamy obiekt i poziom logowania daemon.info . Wszystkie możliwe kombinacje są wyszczególnione tutaj. Potem mamy właściwą nazwę usługi oraz jej numer PID dnsmasq-dhcp[1134] . No i oczywiście na końcu jest komunikat, który wysłała usługa.

Logowanie komunikatów do pliku

Zwykle domowe routery nie udostępniają żadnych usług w sieci i nie są otwarte na świat, bo nie mają stałego zewnętrznego adresu IP. Jeśli jednak obawiamy się o bezpieczeństwo naszego routera czy sieci, to powinniśmy włączyć zapisywanie logów do pliku. Niemniej jednak, routery średnio się nadają, by ciągle zapisywać dane u nich na flash'u. Raz, że mają go niewiele, a dwa, że bardzo szybko nam ten flash padnie przy takim użytkowaniu. Dlatego też, jeśli rozważamy wdrożenie logowania, które ma przetrwać proces restartu routera, to najlepiej zaopatrzyć się w niewielki pendrive i wykonać na nim extroot'a. Taki mechanizm logowania jest do skonfigurowania przez plik /etc/config/system . Poniżej znajdują się wpisy, które trzeba do tego pliku dodać:

config system
      ...
      option log_type 'file'
      option log_file '/mnt/log/messages'
      option log_size '64'

Przy pomocy opcji log_type mówimy routerowi, że życzymy sobie zapisywać logi do pliku. Lokalizacja tego pliku jest określona w opcji log_file . Z kolei log_size odpowiada za rozmiar tego pliku, w KiB. Zapisujemy plik i w terminalu wydajemy to poniższe polecenie:

# /etc/init.d/log restart

Od tego momentu logi powinny wędrować również do wskazanego wyżej pliku. W dalszym ciągu logi możemy odczytywać przy pomocy logread .

Zdalne logowanie wiadomości

Istnieje także możliwość przesłania logów przez sieć do określonego hosta. Do końca nie wiem czy takie logi można przesłać do maszyn mających na pokładzie windowsa. Niemniej jednak bez problemu ten mechanizm współpracuje z linux'ami. Dlatego też ograniczę się do opisania konfiguracji w oparciu właśnie o ten system operacyjny, jako że go używam.

Przede wszystkim, potrzebna nam jest maszyna, która będzie miała zainstalowany na swoim pokładzie serwer logów. Obecnie większość dystrybucji linux'a korzysta z initu systemd. Jego logger, tj. journal, nie będzie współpracował z OpenWRT. Potrzebne zatem będzie nam kompatybilne oprogramowanie. Na szczęście nic nie stoi na przeszkodzie, by doinstalować sobie pakiet rsyslog . To on będzie odpowiedzialny za odbieranie zdalnych komunikatów. Niemniej jednak, by był w stanie to zrobić, musimy edytować plik /etc/rsyslog.conf i dopisać w nim tę poniższą konfigurację:

$ModLoad imtcp
$InputTCPServerRun 514
$InputTCPServerStreamDriverPermittedPeer 192.168.1.1

Dodatkowo przyda nam się również rozdział logów z routera i zapisanie ich w osobnym pliku:

if $fromhost-ip startswith "192.168.1.1" then -/var/log/home-network.log
& stop

Teraz wracamy na router w celu skonfigurowania demona logread . Otwieramy plik /etc/config/system i w przypadku, gdy mamy skonfigurowane logowanie do pliku, to musimy wykomentować te powyżej opisane opcje. Na ich miejsce dodajemy te poniższe:

config system
...
      option log_ip     '192.168.1.150'
      option log_port   '514'
      option log_proto  'tcp'
      option log_prefix 'router '

Trzeba mieć na uwadze, że te logi przesyłane za pomocą tego mechanizmu są w formie niezaszyfrowanej. Standardowa konfiguracja OpenWRT nie daje możliwości zaszyfrowania przesyłanych logów. Niemniej jednak, szyfrowanie logów jest możliwe. Wyżej jednak mamy cztery opcje, którymi musimy się zająć. Serwer, który ma przechowywać logi określamy w log_ip . Standardowy port dla rsyslog to 514 . Dopisujemy go zatem w opcji log_port . Wybieramy protokół TCP w log_proto . Na końcu w opcji log_prefix mamy prefiks, który będzie dołączany do wiadomości, tak by szło w łatwy sposób odróżnić komunikaty generowane przez system od tych, które pochodzą z OpenWRT na routerze. Zapisujemy plik i ponownie restartujemy skrypt /etc/init.d/log :

# /etc/init.d/log restart

Od tego momentu, komunikaty powinny być przesyłane przez sieć. Poniżej jest fotka dowodząca, że tak jest w istocie:

logread-rsyslog-openwrt-komunikaty-log-siec

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.