Gentoo Logo

1.  Wprowadzenie

Aby wychwycić wszystkie ostrzeżenia i błędy wskazujące na próby ataku należy włączyć dodatkowe usługi logowania. Włamywacze zwykle skanują i wypróbowują system przed atakiem.

Ważną rzeczą jest również to, by logi były łatwe w zarządzaniu i przeglądaniu. Gentoo podczas instalacji umożliwia wybranie jednego z trzech programów logujących.

1.  Logowanie za pomocą syslogd

Syslogd jest najpopularniejszym programem logującym dla systemów Linux i Unix. Nie daje możliwości rotowania logów. Można to sobie jednak zrekompensować używając programu /usr/sbin/logrotate, warto dopisać go np. w demonie cron (plik konfiguracyjny logrotate to /etc/logrotate.conf). Częstotliwość rotacji logów będzie uzależniona od obciążenia systemu.

Poniżej znajduje się standardowy plik syslog.conf do którego wprowadzono kilka pożytecznych zmian. Odkomentowano linie dotyczące crona i tty oraz dodano opcję wysyłania logów na zdalny serwer. Żeby jeszcze bardziej zwiększyć bezpieczeństwo, można skonfigurować program tak, aby zapisywał logi w dwóch różnych miejscach.

Listing 1.1: /etc/syslog.conf

#  /etc/syslog.conf      Configuration file for syslogd.
#
#                       For more information see syslog.conf(5)
#                       manpage.
#                       This is from Debian, we are using it for now
#                       Daniel Robbins, 5/15/99

#
# First some standard logfiles.  Log by facility.
#

auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
cron.*                         /var/log/cron.log
daemon.*                        -/var/log/daemon.log
kern.*                          -/var/log/kern.log
lpr.*                           -/var/log/lpr.log
mail.*                          /var/log/mail.log
user.*                          -/var/log/user.log
uucp.*                          -/var/log/uucp.log
local6.debug                    /var/log/imapd.log

#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info                       -/var/log/mail.info
mail.warn                       -/var/log/mail.warn
mail.err                        /var/log/mail.err

# Logging for INN news system
#
news.crit                       /var/log/news/news.crit
news.err                        /var/log/news/news.err
news.notice                     -/var/log/news/news.notice

#
# Some `catch-all' logfiles.
#
*.=debug;\
        auth,authpriv.none;\
        news.none;mail.none     -/var/log/debug
*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none          -/var/log/messages

#
# Emergencies and alerts are sent to everybody logged in.
#
*.emerg                         *
*.=alert                        *

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
daemon,mail.*;\
       news.=crit;news.=err;news.=notice;\
       *.=debug;*.=info;\
       *.=notice;*.=warn       /dev/tty8

#Setup a remote logging server
*.*                        @logserver

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
#
#    $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
#      busy site..
#
#daemon.*,mail.*;\
#       news.crit;news.err;news.notice;\
#       *.=debug;*.=info;\
#       *.=notice;*.=warn       |/dev/xconsole

local2.*                --/var/log/ppp.log

Włamywacze zwykle próbują zatrzeć po sobie ślady poprzez wyedytowanie lub skasowanie logów. Można im to utrudnić ustawiając zdalne logowanie na innych komputerach. Więcej informacji o syslogd znajduje się w man syslog.

1.  Metalog

Metalog Franka Dennisa nie ma możliwości logowania na zdalnym serwerze. Ma za to sporą przewagę jeśli chodzi o elastyczność i wydajność logowania. Może logować nazwę programu, priorytet i wiele innych informacji. Daje możliwość korzystania z wyrażeń regularnych oraz uruchamiania skryptów w przypadku wystąpienia w logu określonego ciągu znaków. Bardzo przydaje się to do błyskawicznego wykonywania niezbędnych działań w przypadku gdy dzieje się coś złego.

Zwykle wystarcza domyślna konfiguracja. Aby być powiadamianym e-mailem za każdym razem gdy wystąpi błąd przy wpisywaniu hasła można użyć jednego z następujących skryptów:

Dla postfix:

Listing 1.1: /usr/local/sbin/mail_pwd_failures.sh for postfix

#! /bin/sh
echo "$3" | mail -s "Warning (program : $2)" root

Dla netqmail:

Listing 1.1: /usr/local/sbin/mail_pwd_failures.sh for netqmail

#!/bin/sh
echo "To: root
Subject:Failure (Warning: $2)
$3
" | /var/qmail/bin/qmail-inject -f root

Aby skrypt zadziałał należy mu nadać prawa wykonywalności poprzez wpisanie /bin/chmod +x /usr/local/sbin/mail_pwd_failures.sh.

Następnie należy odkomentować linię "Password failures" w pliku /etc/metalog/metalog.conf:

Listing 1.1: /etc/metalog/metalog.conf

command  = "/usr/local/sbin/mail_pwd_failures.sh"

1.  Syslog-ng

Syslog-ng posiada te same funkcje co syslog i metalog, jednak z małymi różnicami. Może filtrować wiadomości zależnie od poziomu i zawartości (jak metalog), umożliwia zdalne logowanie (jak syslog), dobrze współpracuje z rozmaitymi plikami, tak jak syslogd (nawet ze strumieniami z Solarisa) potrafi wyświetlać logi na tty, wykonywać programy i może pełnić funkcję serwera logów. Jest najlepszym dostępnym programem tego typu i jakby tego było mało posiada jeszcze najszersze możliwości konfiguracyjne.

Poniżej znajduje się standardowy plik konfiguracyjny na który naniesiono kilka drobnych poprawek.

Listing 1.1: /etc/syslog-ng/syslog-ng.conf

options { chain_hostnames(off); sync(0); };

#source where to read log
source src { unix-stream("/dev/log"); internal(); };
source kernsrc { file("/proc/kmsg"); };

#define destinations
destination authlog { file("/var/log/auth.log"); };
destination syslog { file("/var/log/syslog"); };
destination cron { file("/var/log/cron.log"); };
destination daemon { file("/var/log/daemon.log"); };
destination kern { file("/var/log/kern.log"); };
destination lpr { file("/var/log/lpr.log"); };
destination user { file("/var/log/user.log"); };
destination mail { file("/var/log/mail.log"); };

destination mailinfo { file("/var/log/mail.info"); };
destination mailwarn { file("/var/log/mail.warn"); };
destination mailerr { file("/var/log/mail.err"); };

destination newscrit { file("/var/log/news/news.crit"); };
destination newserr { file("/var/log/news/news.err"); };
destination newsnotice { file("/var/log/news/news.notice"); };

destination debug { file("/var/log/debug"); };
destination messages { file("/var/log/messages"); };
destination console { usertty("root"); };
destination console_all { file("/dev/tty12"); };
destination xconsole { pipe("/dev/xconsole"); };

#create filters
filter f_authpriv { facility(auth, authpriv); };
filter f_syslog { not facility(authpriv, mail); };
filter f_cron { facility(cron); };
filter f_daemon { facility(daemon); };
filter f_kern { facility(kern); };
filter f_lpr { facility(lpr); };
filter f_mail { facility(mail); };
filter f_user { facility(user); };
filter f_debug { not facility(auth, authpriv, news, mail); };
filter f_messages { level(info..warn)
        and not facility(auth, authpriv, mail, news); };
filter f_emergency { level(emerg); };

filter f_info { level(info); };
filter f_notice { level(notice); };
filter f_warn { level(warn); };
filter f_crit { level(crit); };
filter f_err { level(err); };
filter f_failed { match("failed"); };
filter f_denied { match("denied"); };

#connect filter and destination
log { source(src); filter(f_authpriv); destination(authlog); };
log { source(src); filter(f_syslog); destination(syslog); };
log { source(src); filter(f_cron); destination(cron); };
log { source(src); filter(f_daemon); destination(daemon); };
log { source(kernsrc); filter(f_kern); destination(kern); };
log { source(src); filter(f_lpr); destination(lpr); };
log { source(src); filter(f_mail); destination(mail); };
log { source(src); filter(f_user); destination(user); };
log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); };
log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); };
log { source(src); filter(f_mail); filter(f_err); destination(mailerr); };

log { source(src); filter(f_debug); destination(debug); };
log { source(src); filter(f_messages); destination(messages); };
log { source(src); filter(f_emergency); destination(console); };

#default log
log { source(src); destination(console_all); };

Konfiguracja syslog-ng jest dość łatwa, ale z powodu ogromnych rozmiarów całego pliku łatwo przegapić coś ważnego. Autor wciąż obiecuje dodatkowe opcje, jak na przykład szyfrowanie, uwierzytelnianie, kompresja czy kontrola MAC (Mandatory Access Control). Z tymi opcjami program będzie idealnym narzędziem do logowania ruchu sieciowego, bo uniemożliwi włamywaczom szpiegowanie logów.

Ogromną zaletą syslog-ng jest również to, że nie musi być uruchamiany z prawami roota.

1.  Analiza logów przy pomocy logcheck.

Oczywiście uniemożliwienie dostępu do logów to tylko połowiczne zwycięstwo. Aplikacje takie jak logcheck znacznie ułatwiają ich codzienną analizę. Logcheck to skrypt powiązany z plikiem binarnym o nazwie logtail, który jest zwykle uruchamiany z demona cron i dzięki zestawowi prostych reguł sprawdza logi pod kątem występowania podejrzanych wyrażeń. Jeśli coś takiego wystąpi wysyła e-mail na skrzynkę roota.

Logchek i logtail są częścią pakietu app-admin/logsentry.

Do filtrowania ważnych wpisów w logach logcheck używa informacji z czterech plików. Te pliki to logcheck.hacking, który zawiera znane wiadomości opisujące atak, logcheck.violations, który zawiera wzory naruszeń bezpieczeństwa, logcheck.violations.ignore z informacjami pozwalającymi na zdefiniowanie często występujących, omyłkowo branych za ataki wpisów w logach oraz logcheck.ignore, który pozwala na ich zignorowanie.

Ostrzeżenie: Nigdy nie należy zostawiać pliku logcheck.violations.ignore pustego. Logcheck używa programu grep do analizy logów, a niektóre jego wersje mogą nie zadziałać poprawnie w takim wypadku i wszystkie naruszenia ochrony zostaną zignorowane.

Zaktualizowano 25 listopada 2005

Oryginalna wersja tego dokumentu została po raz ostatni zaktualizowana 2 kwietnia 2010. Jeśli chcesz pomóc w aktualizacji tego dokumentu do najnowszej wersji, skontaktuj się z Łukaszem Damentko, koordynatorem polskiego projektu tłumaczeń dokumentacji Gentoo.

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.