Протоколирование: анализ логов.
Метки: ACL
Понедельник, 1 марта 2010 г.
Просмотров: 915
Подписаться на комментарии по RSS
Многие администраторы часто вообще игнорируют логи, считая их почему-то ненужными. Наоборот, логи позволяют пролить свет на все события, которые происходят в системе. Рекомендуется просматривать логи хотя бы два раза в день. Если система работает ночью, каждое утро нужно просматривать логи, потому что очень много взломов происходит как раз в это время - когда администратор отдыхает.
Защита /var/log
Практически все файлы логов находятся в каталоге /var/log. Первым делом крекер, получивший права root, попытается скрыть следы своего присутствия, модифицировав файлы логов.
Если используется ACL, можно сделать файлы в каталоге /var/log досягаемыми только для добавления данных. Но в конкретном случае, к сожалению, больше нельзя будет применять программу logrotate, выполняющую ротацию логов: данной программе можно удалять файлы из каталога /var/log.
Наиболее безопасное решение - отключить logrotate, учитывая объемы современных жестких дисков, ничего страшного с системой не случится.
Syslog - демон протоколирования.
Демон syslog применяется как раз для самого протоколирования. Рассмотрим пример его конфигурационного файла /etc/syslog.conf, взятого из Mandrake Linux 10.
# Различные записи
auth,authpriv.* /var/log/auth.log
# . *;auth,authpriv.none -/var/log/syslog
user.* -/var/log/user.log
# Протоколировать все (кроме почты), уровень info или выше
# Не протоколировать приватные аутентификационные сообщения! *.info;mail.none;;news.none;authpriv.none -/var/log/messages
Сообщения authpriv протоколировать в /var/log/secure authpriv.* /var/log/secure
Протоколирование почты
mail.=debug;mail.=info;mail.=notice -/var/log/mail/info
mail.=warn -/var/log/mail/warnings
mail.err
# Протоколирование Cron
cron.=debug;cron.=info;cron.=notice -/var/log/cron/info
cron.=warn -/var/log/cron/warnings
cron.err -/var/log/cron/errors
# Протоколирование ядра
kern.=debug;kern.=info;kern.=notice -/var/log/kernel/info
kern.=warn -/var/log/kernel/warnings
kern.err /var/log/kernel/errors
# Протоколирование lpr
lpr.=debug;lpr.=info;lpr.=notice
-/var/log/lpr/info
lpr.=warn -/var/log/lpr/warnings
lpr.err -/var/log/lpr/errors
# Протоколирование новостей
news.=debug;news.=info;news.=notice -/var/log/news/news.notice
news.=crit -/var/log/news/news.crit
news.=err -/var/log/news/news.err
# Протоколирование демонов
daemon.=debug;daemon.=info;daemon.=notice -/var/log/daemons/info
daemon,=warn -/var/log/daemons/warnings
daemon.err -/var/log/daemons/errors
Все получают критические сообщения (о чрезвычайных ситуациях) *.emerg *
# Ошибки почты и новостей уровня err и выше сохранять в отдельном файле
uucp,news.crit -/var/log/spooler
# Сохранять загрузочные сообщения в boot.log lосаl7
.* -/var/log/boot.log
# Объяснения от конфигураторов Linux Mandrake
locall.*
Как можно заметить, файл конфигурации состоит из двух полей: селектора и действия. Селектор - это объект протоколирования и файл, в который будут записываться сообщения, порождаемые этим объектом.
Для каждого объекта надо указать один из уровней протоколирования, к примеру debug, info, notice, warn, err. Первые три относятся к информационным сообщениям. Уровень warn - это предупреждения, a err - ошибки. Есть специальные сообщения - критические. Обычно они выводятся прямо на консоль.
Как для обозначения объектов, так и для обозначения уровней протоколирования нужно применять символ *, который обозначает все объекты или все уровни. К примеру, надо записывать все сообщения демонов в файл /var/log/daemons, тогда можно использовать такую конструкцию:
daemon.* /var/log/daemons
Допустимыми являются следующие объекты: auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, syslog, user, uucp, local0 - lосаl7. Уровни протоколирования: debug, info, notice, warning, err, crit, alert и emrg.
Действие - это просто имя файла, в который надо произвести запись (знак «-» означает, что после записи в файл можно не вызывать sync(), так как это может отрицательно сказаться на производительности). Вместо файла можно указать и другой объект (терминал, имя пользователя или удаленный узел), которому будет отправлено сообщение. Например:
# отправить все сообщения типа err и выше пользователям root и pete *.err root, pete
Отправить протоколы удаленному узлу:
auth.*; authpriv.* 0 10.10.0.7
Чтобы удаленный компьютер получил syslog-сообщения, на нем должен быть запущен syslogd с опцией -r.
Отправка сообщений на удаленный компьютер - это превосходное решение - ведь хакер не сможет их удалить. Но еще лучше отправлять их на принтер: удалить их будет невозможно (если, конечно, крекер не сделает это, физически находясь за принтером):
auth.*; authpriv.*; daemon.warn; *.crit; /dev/lp0
После того, как были произведены все необходимые изменения, надо перезапустить syslog (kill -HUP).
/var/log/wtmp
В данном файле содержится информация о том, кто и когда входил в систему и выходил из нее. Для просмотра данного файла применяется несколько утилит (это двоичный файл, поэтому человек его не может просмотреть как обычно).
Первая утилита - who. Она отображает, кто в данный момент зарегистрирован в системе. Опция -n позволяет показать время простоя:
# who -n
root vc/1 Jul 27 13:56 . 1853
den vc/2 Jul 27 13:57 . 1854
lenka vc/3 Jul 27 13:57 . 1855
Who еще может показать время последней перезагрузки системы (who -b) и время от последнего изменения времени (who -t).
Вторая утилита - last - отображает список пользователей, которые входили в систему с момента создания файла wtmp:
# last
lenka vc/3 Wed Jul 27 13:57 still logged in
den vc/2 Wed Jul 27 13:57 still logged in
root vc/1 Wed Jul 27 13:56 still logged in
reboot system boot 2.6.23 Jul 7 11:26 (00:01)
den :0 Thu Jul 21 15:20 - down (00:00)
den :0 Thu Jul 21 15:20 - 12:37 (00:00)
Можно также просмотреть, когда входил в систему определенный пользователь, для этого нужно указать имя пользователя в качестве параметра:
# last den
den vc/2 Wed Jul 27 13:57 still logged in
den :0 Thu Jul 21 15:20 - down (00:00)
den :0 Thu Jul 21 15:20 - 15:20 (00:00)
den :0 Thu Jul 21 12:08 - down (00:00)
Когда система перезагружается, регистрируется псевдопользователь reboot, что очень удобно. Узнать, когда система перезагружалась, очень просто:
# last reboot
reboot system boot 2.6.3-7mdk Wed Jul 27 13:56 (00:02)
reboot system boot 2.6.3-7mdk Thu Jul 21 14:55 (00:24)
reboot system boot 2.6.3-7mdk Thu Jul 21 12:05 (00:03)