Мониторинг FreeBSD сервера с отправкой отчета на email

25 февраля 2009
Просмотров: 18048Обсудить
Рубрика: Администрирование -> FreeBSD

Задача : мониторинг FreeBSD сервера.

Под словом "мониторинг" я понимаю несколько критических вещей, связанных с безопасностью и работоспособностью сервера.

Статья пишется только для некоторых моментов, интересных и нужных лично мне, но, тем ни мение, может служить шаблоном для любых нужд.

"Моменты":

  1. Мониторинг свободного места на сервере (общая статистика и размер конкретного каталога)
  2. Прослеживание удачных логинов по SSH протоколу
  3. Прослеживание удачных логинов по FTP протоколу

Для решения задачи я написал (а точнее переделал ;) ) достаточно простой скрит, код которого будет приведен вконце статьи. Пока же рассмотрим детали.

1. Инфа по дискам

#show disk info (free space and so on)
if [ "$DISKSPACE" = "yes" ]
then
echo "File System state:"
echo
eval df -c
delimit
# if wont se some dir size - use this
echo `du -hs /usr/local/www/mySite.com/`
delimit
echo ==========================================================
fi

Для вывода общей инфы используется команда df -c. Ключ -с "требует" показать вконце общую сумму.

Так же меня интересует общий размер, занимаемый моим сайтом. Для этого используем du -hs dir. Ключ -h будет показывать вывод в удобочитаемом виде (размер будет показываться не в байтах а с "М", "G" и т.д.). -s  будет показывать размер конкретного файла (если его не указать, будет выводиться инфа для дерева файлов и каталогов, принадлежащих данной директории)

2) Мониторинг удачных логинов по SSH

Сервер можно сколько угодно защищать, но пока сам не увидишь, что никто, кроме тебя, не логинился, спокоен не будешь. Конечно можно регулярно просматривтаь лог файл на предмет удачных заходов (неудачные попытки залогинится смотреть нету смысла, их будет очень много), но согласитесь, намного удобней и приятней читать отчет в виде мыла ;)

#show succesful login over ssh
if [ "$SSHLOGINS" = "yes" ]
then
echo "Successful unknown ligins over SSH protocol:"
echo
eval cat /var/log/auth.log | grep -i accepted | grep -v "10.10.10.10"
echo =========================================================
fi

Видим, что основа - оформление, и полезных вещей делает только одна строка ;). Меня интересовали только удачные заходы, поэтому я использовал "| grep -i accepted" . Ключ -і сделает греп нечувствительным к регистру. С другой стоорны, мне не интересны мои попытки залогинится, я о них и так знаю (хотя в целях безопасности можно было б оставить (вдруг кто-то под вашим IP логинился ...)), поэтому исключим мой IP-адресс из выборки: | grep -v "10.10.10.10" . Ключ -v даст инверсию - исключит строки, в которых найдет совпадения регулярному выражению.

3) Мониторинг удачных логинов по FTP

С ФТП ситуация где-то та же, что и с ССХ, правда логинов , которые мы будем исключать - будет больше ;). В качестве фтп сервера я использую proftpd, поэтому в качестве лог файла будем использовать лог ошибок proftpd:

#show successful login over ftp (proftpd)
if [ "$FTPLOGINS" = "yes" ]
then
echo "Successful unknown logins over FTP protocol - proftpd:"
echo
eval cat /var/log/proftpd-error.log | grep successful | grep -v "login1:" | grep -v "login2:" | grep -v "login3:"
echo =========================================================
fi

Абсолютно так же можно отслеживать заходы какого-нить пользователя (например посмотреть как работают с сервером работнички , если их работа связана с фтп ;))

Теперь самое интересное - собственно создание и настройка скрипта.

1) Создаем файл

touch /usr/local/sbin/serverMonitoring

2) Делаем его испольняемым

chmod +x /usr/local/sbin/serverMonitoring

3) Вбиваем в него слежующие строчки :

#!/bin/sh
# Email Address to send mail to? (user@domain.com)
MAILADDR="email@address.com.ua"
BACKUPDIR="/tmp"
DISKSPACE="yes"
SSHLOGINS="yes"
FTPLOGINS="yes"
#=====================================================================
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/mysql/bin
DATE=`date +%Y-%m-%d_%Hh%Mm`                            # Datestamp e.g 2002-09-21
LOGFILE=$BACKUPDIR/INFO-`date +%N`.log          # Logfile Name
LOGERR=$BACKUPDIR/ERRORS-`date +%N`.log         # Logfile Name
# IO redirection for logging.
touch $LOGFILE
exec 6>&1           # Link file descriptor #6 with stdout.
# Saves stdout.
exec > $LOGFILE     # stdout replaced with file $LOGFILE.
touch $LOGERR
exec 7>&2           # Link file descriptor #7 with stderr.
# Saves stderr.
exec 2> $LOGERR     # stderr replaced with file $LOGERR.
delimit() {
echo ----------------------------------------------------------------------
echo
}
echo Monitoring Info
echo http://yaap.newway.com.ua/
echo ======================================================================
echo
#show disk info (free space and so on)
if [ "$DISKSPACE" = "yes" ]
then
echo "File System state:"
echo
eval df -c
delimit
# if wont se some dir size - use this
#echo `du -hs /usr/local/www/mySite.com/`
#delimit
echo ==========================================================
fi
#show succesful login over ssh
if [ "$SSHLOGINS" = "yes" ]
then
echo "Successful unknown ligins over SSH protocol:"
echo
eval cat /var/log/auth.log | grep -i accepted | grep -v "10.10.10.10"
echo =========================================================
fi
#show successful login over ftp (proftpd)
if [ "$FTPLOGINS" = "yes" ]
then
echo "Successful unknown logins over FTP protocol - proftpd:"
echo
eval cat /var/log/proftpd-error.log | grep successful | grep -v "login1:" | grep -v "login2:" | grep -v "login3:"
echo =========================================================
fi
#Clean up IO redirection
exec 1>&6 6>&-      # Restore stdout and close file descriptor #6.
exec 1>&7 7>&-      # Restore stdout and close file descriptor #7.
cat "$LOGFILE" | mail -s "Server monitoring info  - $DATE" $MAILADDR
if [ -s "$LOGERR" ]
then
cat "$LOGERR" | mail -s "ERRORS REPORTED: Server monitoring info  - $DATE" $MAILADDR
fi
if [ -s "$LOGERR" ]
then
STATUS=1
else
STATUS=0
fi
# Clean up Logfile
eval rm -f "$LOGFILE"
eval rm -f "$LOGERR"
exit $STATUS

4)   -для заточки скрипта "под себя" внесите изменения в настройки

MAILADDR="email@address.com.ua"              # мыло, на которое следует отправлять отчет
BACKUPDIR="/tmp"                                             # директория, в которую будут падать временные файлы логов
DISKSPACE="yes"                                                # Показывать в отчете информацию о дисках
SSHLOGINS="yes"                                                # Показывать в отчете информацию о логинах по SSH
FTPLOGINS="yes"                                                # Показывать в отчете информацию о логинах по FTP

Для коректной работы следует внести некоторые изменения и в сам скрипт (например вписать свой ип адресс и свои логины пользователей, для исключения из выборки + , если есть желание использовать, вписать свою директорию для подсчета занимаемого размера)

5) Ну и самое интересное, без чего ИМХО все это не стояло б затрат - автоматизация выполнения в указаное время ;)

Для этого отредактируйте файл /etc/crontab  и добавьте вконец следующие строки:

## Monitoring server state every day in 4:35
35      4       *       *       *       root    /usr/local/sbin/serverMonitoring

Т.е. скрипт будет запускатьса ежедневно в 4:35 утра, чтоб вы , как только проснетесь, смогли "прконтролировать все" ;)

Надеюсь кому нить будет полезно ;)

Коментарии и аргументированная критика приветствуется.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
Метки: ,


Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)