Написал скрипт, можно повесить его в крон, чтобы владельцу сервера приходил алерт письмом при обнаружении небезопасных паролей (подразумевается что администратор сервера не заводит учетные записи на сервере в обход панели 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 патчем.