четверг, 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 патчем.

среда, 7 сентября 2011 г.

Журналируемые дисковые квоты

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

"quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown."

Включаем журналируемые квоты

Добавляем или меняем опции монтируемого раздела в /etc/fstab

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/mapper/srv--01-root /               ext3    errors=remount-ro,usrquota,grpquota 0       1

на следующие

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/mapper/srv--01-root /               ext3    errors=remount-ro,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0       1

после чего или просто перезагружаем сервер, либо выполняем

выключаем квоты

quotaoff -avug

останавливаем все службы

перемонтируем корень

mount -o remount /

проверяем квоты

quotacheck -avugm

включаем квоты

quotaon -avug

проверяем текущее состояние квот

repquota -avug

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

воскресенье, 4 сентября 2011 г.

Настройка оповещений о состоянии RAID массива mdadm

Прописываем в конфиг mdadm /etc/mdadm/mdadm.conf

MAILADDR sysadmin@company.lan

MAILFROM alert@server.lan

Перезагружаем демон mdadm если он загружен или запускаем, если он выключен

invoke-rc.d mdadm restart
invoke-rc.d mdadm start

Добавляем в автозагрузку, если mdadm еще там нет

update-rc.d mdadm defaults

Проверяем как работает, например на массиве который используется под своп (если своп в данный момент не используется) имитируем вылет диска

swapoff -a

mdadm /dev/md0 -f /dev/sda1
mdadm /dev/md0 -r /dev/sda1

смотрим по логам SMTP сервера факт ухода письма с сервера

Проверяем целевой почтовый ящик, придет письмо такого вида

This is an automatically generated mail message from mdadm
running on server

A Fail event had been detected on md device /dev/md0.

It could be related to component device /dev/sda1.

Faithfully yours, etc.

P.S. The /proc/mdstat file currently contains the following:

Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda3[0] sdc3[1]
     153918656 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdc2[1]
     264960 blocks [2/2] [UU]

md0 : active raid1 sda1[0](F) sdc1[1]
     2102464 blocks [2/1] [_U]

unused devices: <none>

Возвращаем диск обратно в массив

mdadm /dev/md0 -a /dev/sda1
swapon -a

Настройка параметров файловой системы Ext-3

На примере настройки автоматической проверки ФС при каждой загрузке ОС/монтировании ФС.

Вывод содержимого суперблоков ФС /dev/mapper/srv--01-root

root@srv-01:~# tune2fs -l /dev/mapper/srv--01-root
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          009e6e5b-1c22-49b2-9d69-3e04bfa3bb61
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              484800
Block count:              1937408
Reserved block count:     96870
Free blocks:              1516041
Free inodes:              419114
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      472
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8080
Inode blocks per group:   505
Filesystem created:       Thu Aug 18 00:45:22 2011
Last mount time:          Wed Aug 31 05:54:14 2011
Last write time:          Thu Aug 18 00:53:35 2011
Mount count:              8
Maximum mount count:      38
Last checked:             Thu Aug 18 00:45:22 2011
Check interval:           15552000 (6 months)
Next check after:         Mon Feb 13 23:45:22 2012
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
First orphan inode:       88888
Default directory hash:   half_md4
Directory Hash Seed:      c5b5d5cc-b79c-40ce-bfea-90778dcb6e33
Journal backup:           inode blocks

Включение автоматической проверки файловой система с помощью fsck при каждой загрузке ОС

tune2fs -c 1 /dev/mapper/srv--01-root
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to 1

Смотрим еще раз параметры ФС

tune2fs -l /dev/mapper/srv--01-root | grep -i mount
Last mounted on:          <not available>
Default mount options:    (none)
Last mount time:          Wed Aug 31 06:03:18 2011
Mount count:              9
Maximum mount count:      1

Т.е. если Maximum mount count становится равным или меньшим, чем Mount count происходит проверка ФС