четверг, 15 сентября 2011 г.

Настройка оповещений о наличии небезопасных паролей на серверах с ISPmanager

Написал скрипт, можно повесить его в крон, чтобы владельцу сервера приходил алерт письмом при обнаружении небезопасных паролей (подразумевается что администратор сервера не заводит учетные записи на сервере в  обход панели ISPmanager)

#!/usr/bin/perl

$data = `unshadow /etc/passwd /etc/shadow`;
for $str ( split ( "\n", $data ) )
{
        @data = split(/\:/, $str);
        $data2 = `id @data[0] -Gn`;
                if ($data2 =~ m/mgrsecure/)
                {
                splice (@data, 3,1, 'mgrsecure')
                }
        $data3 = join(":", @data);
        open(file, ">> /root/.john/datafile");
        print file "$data3\n";
        close (file);
}
$command = `john -single -groups:mgrsecure /root/.john/datafile 2>/dev/null`;
for $str2 ( split ( "\n", $command ) )
{
        if ($str2 !~ m/password hash/)
        {
        @command = split(/\s+/, $str2);
        @command[1] =~ s/[\(\)]//g;
        push(@newcomm, ['Логин:', @command[1], 'Пароль:', @command[0]]);
        }
}
$command2 = `john -single -groups:-mgrsecure /root/.john/datafile 2>/dev/null`;
for $str3 ( split ( "\n", $command2 ) )
{
        if (($str3 !~ m/password hash/) && ($str3 !~ m/\(virtuser_\d+\)/))
        {
        @command2 = split(/\s+/, $str3);
        @command2[1] =~ s/[\(\)]//g;
        chomp($owner = `id @command2[1] -gn`);
        push(@command2, $owner);
        push(@newcomm2, ['Логин:', @command2[1], 'Пароль:', @command2[0], 'Владелец_аккаунта:', @command2[2]]);
        }
}
$command3 = `john -single /etc/dovecot/dovecot.passwd 2>/dev/null`;
for $str4 ( split ( "\n", $command3 ) )
{
        if ($str4 !~ m/password hash/)
        {
        @command3 = split(/\s+/, $str4);
        @command3[1] =~ s/[\(\)]//g;
        push(@newcomm3, ['Почтовый_ящик:', @command3[1], 'Пароль:', @command3[0]]);
        }
}

if (scalar@newcomm > 0)
{
unshift(@newcomm, ['']);
unshift(@newcomm, ['Пользователи ISPmanager:']);
unshift(@newcomm, ['']);
for ($row = 0; $row < scalar@newcomm; $row++)
{
open(file, ">> /root/.john/report");
        print file "$newcomm[$row][0] ";
        print file "$newcomm[$row][1] ";
        print file "$newcomm[$row][2] ";
        print file "$newcomm[$row][3]\n";
close (file);
}
}

if (scalar@newcomm2 > 0)
{
unshift(@newcomm2, ['']);
unshift(@newcomm2, ['FTP пользователи:']);
unshift(@newcomm2, ['']);
for ($row2 = 0; $row2 < scalar@newcomm2; $row2++)
{
open(file, ">> /root/.john/report");
        print file "$newcomm2[$row2][0] ";
        print file "$newcomm2[$row2][1] ";
        print file "$newcomm2[$row2][2] ";
        print file "$newcomm2[$row2][3] ";
        print file "$newcomm2[$row2][4] ";
        print file "$newcomm2[$row2][5]\n";
close (file);
}
}

if (scalar@newcomm3 > 0)
{
unshift(@newcomm3, ['']);
unshift(@newcomm3, ['Почтовые ящики:']);
unshift(@newcomm3, ['']);
for ($row3 = 0; $row3 < scalar@newcomm3; $row3++)
{
open(file, ">> /root/.john/report");
        print file "$newcomm3[$row3][0] ";
        print file "$newcomm3[$row3][1] ";
        print file "$newcomm3[$row3][2] ";
        print file "$newcomm3[$row3][3]\n";
close (file);
}
}

if (-e "/root/.john/report")
{
exec("echo -e 'Обнаружено использование небезопасных паролей. Пожалуйста, смените их на более надежные.\n' | \
cat - /root/.john/report | mail -s 'Отчет по безопасности сервера' $ARGV[0] & rm -f /root/.john/*");
}
else
{
exec("rm -f /root/.john/*");
}
Письмо будет выглядеть примерно вот так:
Обнаружено использование небезопасных паролей. Пожалуйста, смените их на более надежные.


Пользователи ISPmanager:

Логин: user_123 Пароль: user
Логин: smart_account Пароль: smart_account

FTP пользователи:

Логин: unsecure_ftp2 Пароль: unsecure Владелец_аккаунта: guest
Логин: unsecure_ftp Пароль: unsecure_ftp Владелец_аккаунта: sysadmin

Почтовые ящики:

Почтовый_ящик: box_02@local.lan Пароль: box_02
Почтовый_ящик: box_01@local.lan Пароль: box_01
Почтовый_ящик: mailbox@local.lan Пароль: mail
Установка
Устанавливаем JTR
apt-get install john
Вешаем в крон сам скрипт (параметром передаем в скрипт адрес почтового ящика администратора сервера, аккуратнее так как в письме будут фигурировать те самые некорректные пароли)
0 15 * * * password_checker.pl <email_адрес_администратора_сервера>
 На системах (Debian 6.0 (установленный с нуля, а не апгрейд с 5.0), последние версии Ubuntu), где пароли системных пользователей шифруются не md5, а sha512 (смотрим здесь /etc/pam.d/common-password), JTR установленный из штатного репозитория проверять безопасность паролей системных пользователей не сможет. Потребуется его сборка с Jumbo патчем.

Комментариев нет:

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