Logujemy logowania i nie tylko cz.II – biblioteka snoopy
Napisał: Patryk Krawaczyński
10/04/2016 w Bezpieczeństwo Brak komentarzy. (artykuł nr 517, ilość słów: 375)
W
poprzedniej części zaprezentowałem, jak prosto za pomocą PAM możemy przesyłać informację o logowaniu się na uprzywilejowane konto root. W tej części zajmiemy się prawie permanentną inwigilacją poleceń wydawanych przez administratora i zwykłych użytkowników systemu. Wykorzystamy do tego bibliotekę snoopy.
Zacznijmy od instalacji i konfiguracji biblioteki snoopy. Poniższe przykłady będą wykonywane na serwerze opartym na systemie Ubuntu 14.04 LTS:
apt-get install -y build-essential socat wget -O snoopy-install.sh https://github.com/a2o/snoopy/raw/install/doc/install/bin/snoopy-install.sh chmod 755 snoopy-install.sh ./snoopy-install.sh stable
Po instalacji musimy zmienić parę standardowych ustawień w pliku /etc/snoopy.ini:
message_format = '{"datetime": "%{datetime}", "hostname": "%{hostname}", \ "user": { "login": "%{login}", "username": "%{username}", "uid": "%{uid}", \ "tty": "%{tty}" }, "command": { "cwd": "%{cwd}", "filename": "%{filename}", \ "cmdline": "%{cmdline}", "pid": "%{pid}", "ppid": "%{ppid}", "rootproc": "%{rpname}", \ "executedAS": "username: %{eusername} - uid: %{euid}" } }' syslog_facility = LOCAL7 syslog_ident = "snoopy"
W ten sposób zadbamy o to, że będziemy w stanie przefiltrować wiadomości przesyłane przez bibliotekę snoopy w rsyslog’u i zapisywać je w wybranym pliku w formacie json:
{ "datetime":"2016-04-10T22:49:23+0200", "hostname":"darkstar", "user":{ "login":"agresor", "username":"agresor", "uid":"1000", "tty":"/dev/pts/2" }, "command":{ "cwd":"/home/agresor", "filename":"/usr/bin/uptime", "cmdline":"uptime", "pid":"2209", "ppid":"2173", "rootproc":"sshd", "executedAS":"username: agresor - uid: 1000" } }
Filtrowanie wiadomości wymaga dodania do konfiguracji rsyslogd
dodatkowego pliku konfiguracji – /etc/rsyslog.d/10-snoopy.conf:
$template Snoopy,"%msg:2:$%\n" $ActionFileDefaultTemplate Snoopy if $syslogfacility-text == 'local7' and $programname == 'snoopy' then /var/log/commands.log & ~
oraz stworzenia i zabezpieczenia pliku /var/log/commands.log:
touch /var/log/commands.log chmod 640 /var/log/commands.log chown syslog:adm /var/log/commands.log service rsyslog restart
Od tego momentu wszystkie polecenia wydawane przez użytkowników systemu będą logowane do w/w pliku. Możemy zastosować również filtrowanie (filter_chain = "only_uid:0"
), jeśli chcemy śledzić poczynania wybranych użytkowników. Ponownie wybrany format json umożliwia nam bardzo proste przesyłanie wiadomości do wybranego systemu agregującego tego typu wiadomości np. ElasticSearch.
Więcej informacji: Snoopy Logger