Аудит безопасности Linux

В данной статье представлены рекомендации по проверке защищенности серверных операционных систем Linux (по материалам ISACA Journal). В ходе аудита необходимо проверить следующие вопросы:

  • обеспечение физической безопасности;
  • использование USB-устройств;
  • защита GRUB;
  • разбивка диска на разделы;
  • директория /boot;
  • учетные записи;
  • парольная политика;
  • удаленное подключение к серверу;
  • программное обеспечение;
  • настройки сети;
  • Cron;
  • SELinux;
  • NTP-сервер;
  • журналы регистрации событий.

Необходимо отметить, что комплексный аудит операционных систем, также должен включать проверки:

  • управления доступом,
  • прав пользователей,
  • подозрительной активности,
  • отсутствия уязвимостей,
  • управления изменениями.

ОБЕСПЕЧЕНИЕ ФИЗИЧЕСКОЙ БЕЗОПАСНОСТИ

Обеспечить физическую безопасность актива – первоочередная задача. Аудитор должен убедиться, что в системе установлен надежный пароль на BIOS, настроен запрет в BIOS на загрузку с CD/DVD-дисков, внешних устройств. Необходимо убедиться, что GRUB также защищен надежным паролем.

ИСПОЛЬЗОВАНИЕ USB-УСТРОЙСТВ

В ходе аудита, это также важно изучить и/или отключить возможность использования USB устройств. Для снижения риска утечки данных и распространения вредоносного ПО, пользователи должны быть ограничены в использовании USB-устройств.

ЗАЩИТА GRUB

Для защиты GRUB, администратору необходимо использовать шифрование пароля в MD5 формат:

[root@host-1~]# grub-md5-crypt

После выполнения команды, администратору необходимо открыть файл /boot/grub/menu.lst или /boot/grub/grub.conf и добавить MD5-пароль:

[root@ host-1 ~]# vi /boot/grub/menu.lst

или
[root@ host-1 ~]# vi /boot/grub/grub.conf

Вновь созданный MD5-пароль может быть добавлен в конфигурационный файл GRUB.

РАЗБИВКА ДИСКА НА РАЗДЕЛЫ

Разделение жесткого диска на разделы является важным вопросом в обеспечении безопасности системы. Аудитор должен изучить и оценить структуру разделов в проверяемой системе. Администратор может группировать или разделить данные между различными разделами. Аудитору необходимо проверить, что приложения третьих сторон установлены в отдельной файловой системе.

ДИРЕКТОРИЯ /BOOT

В ходе аудита, необходимо проверить состояние каталога /boot. В Linux, ядро и связанные с ним файлы размещены в каталоге /boot. Необходимо убедиться, что к данной директории разрешен доступ только на чтение, что предотвращает несанкционированное изменение важных файлов в системе. Для проверки откройте файл /etc/fstab и проверьте конфигурацию:

# vi /etc/fstab

В файле должна присутствовать строка:

LABEL=/boot   /boot   ext2   defaults,ro   1 2

УЧЕТНЫЕ ЗАПИСИ

Список пользователей

Список пользователей хранится в файле /etc/passwdfile. Для получения списка пользователей можно использовать следующий скрипт:

#!/bin/bash
# userslistinthesystem.sh

# count and Lists existing “real” users in the system.

echo
echo “[*] Existing users (sorted alphabetically):”
echo
grep ‘/bin/bash’ /etc/passwd | grep -v ‘root’ | cut -f1
-d’:’ | sort
echo

echo -n “[*] Number of real users found: “
grep ‘/bin/bash’ /etc/passwd | grep -v ‘root’ | wc -l
echo

Активность пользователей в системе

В ходе аудита, необходимо проверить, что системы настроены на использование psacct или acct. Приложения работают в фоновом режиме и отслеживают деятельность каждого пользователя в системе, а также потребляемые пользователем ресурсы. Для проверки деятельности пользователей в системе можно использовать следующий скрипт:

#!/usr/bin/envksh
last -Fa|awk ‘
   /wtmp begins/ { next; }
   /still logged in/ { next; }
   $0 == reboot { next; }

NF > 0 {
   if( NR > 1 )
printf( “\n” );

printf( “ User:\t%s\n”, $1 ); # user
printf( “ Start:\t%s %s %s %s\n”, $3, $4, $5, $6 );
     if( $9 == “down” )
printf( “ End:\tshutdown\n” );
     else
printf( “ End:\t%s %s %s %s\n”, $9, $10, $11, $12 );

     if( substr( $NF, 1, 1 ) == “(“ )
     {
     t = $NF;
     h = “localhost”;
     }
     else
     {
     t = $(NF-1);
     h = $NF;
     }

gsub( “[()]”, “”, t );
printf( “ Time On:\t%s\n”, t );
printf( “Remote Host:\t%s\n”, h );
}‘

Заблокированные/разблокированные учетные записи

В ходе аудита, необходимо проверить список заблокированных и разблокированных пользователей. Для этого может использоваться следующая команда:

# passwd –s accountName

Статистика по пользователям

Организации должны контролировать деятельность пользователей в системе. Аудитор должен убедиться, что команда ac включена в системе, для обзора деятельности пользователей:

# ac

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

# ac -d

Для вывода информации, о продолжительности (в часах) подключения пользователя «user»:

# ac user

ПАРОЛЬНАЯ ПОЛИТИКА

Учетные записи с пустым паролем

В ходе аудита, необходимо убедиться в отсутствии в системе учетных записей, позволяющих войти в систему без ввода пароля. Для этого можно использовать следующую команду:

# cat /etc/shadow | awk -F: ‘($2==””){print $1}’

Сложность пароля

В ходе аудита, необходимо проверить настройки сложности/надежности пароля, чтобы снизить риск реализации атаки на пароль пользователя перебором или подбором по словарю. Для установки требования использовать надежные пароли необходимо использовать подключаемые модули аутентификации (PAM).

Аудитор может открыть следующий файл в текстовом редакторе:

# vi /etc/pam.d/system-auth

Срок действия пароля

В ходе аудита, необходимо проверить настройки истечения срока действия пароля пользователей. В системах Linux, файл /etc/shadow хранит пароли пользователей в зашифрованном формате. Чтобы проверить срок действия пароля пользователя, можно использовать команду change. Эта команда выводит подробную информацию сроке действия пароля, а также о дате его последнего изменения.

Следующая команда может быть использована для просмотра информации о «возрасте» паролей существующих пользователей:

#chage -l username

Для изменения срока истечения пароля конкретного пользователя можно использовать

#chage -M 60 username
#chage -M 60 -m 7 -W 7 userName

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

  • -M – максимальный срок действия в днях.
  • -m – минимальный срок действия в днях.
  • -W – настройка предупреждения в днях.

Использование повторяющихся паролей

В ходе аудита, необходимо проверить конфигурацию истории паролей в системе. Настройки должны соответствовать парольной политике в организации. Старый файл паролей находится в /etc/security/opasswd. Для проверки необходимо выполнить следующие шаги:

  • для RHEL: открыть файл ‘/etc/pam.d/system-auth‘:
    # vi /etc/pam.d/system-auth
  • для Ubuntu/Debian/Linux Mint: открыть файл ‘/etc/pam.d/common-password‘:
    # vi /etc/pam.d/common-password
  • Добавить следующую строку раздел ‘auth’:
    auth     sufficient     pam_unix.so likeauthnullok
  • Для запрета использовать последние шесть паролей добавьте следующую строку:
    Password    sufficient pam_unix.so nullokuse_authtok md5 shadow remember=6

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

УДАЛЕННОЕ ПОДКЛЮЧЕНИЕ К СЕРВЕРУ

Протоколы Telnet и Rlogin уязвимы, из-за передачи в незашифрованном виде пароля и данных во время удаленного доступа. В ходе аудита, должны быть проверены включенные службы удаленного подключения к серверу, должно использоваться безопасное подключение при помощи протокола Secure Shell (SSH), который использует технологию шифрования во время сеанса связи с сервером. Необходимо также проверить, что root login отключен, изменен SSH-порт по умолчанию, удаленный доступ разрешен только для конкретных авторизованных пользователей. Проверяемые настройки находятся в конфигурационном файле SSH:

# vi /etc/ssh/sshd_config

root login

В ходе аудита, аудитор должен проверить запрет удаленного входа в систему с правами root. Рекомендуется иметь отдельный login ID и/или использовать sudo.

SSH login

В ходе аудита, аудитор должен проверить беспарольный SSH логин. Как правило, системные администраторы используют эту функцию для запрограммированных резервных копий, передачи файлов и сценариев удаленного управления, потому что это позволяет администратору выполнять указанные задачи без ввода пароля.

DenyHosts и Fail2ban

В ходе аудита необходимо проверить настройки DenyHosts и Fail2ban. Это скрипты, используемые для мониторинга и анализа журналов доступа по SSH и защиты SSH сервера от перебора паролей. В этом сценарии, администратор может установить порог для предопределенных неудачных попыток с определенного IP адреса и может запретить соединение с конкретных IP-адресов.

Особенности DenyHosts:

  • сохраняет и отслеживает журналы из файла /var/log/secure, отметив, все успешные и неудачные попытки входа, и фильтрует их.
  • осуществляет мониторинг неудачных попыток входа
  • отправляет по электронной почте уведомление о заблокированных хостах и подозрительных попытках входа

Особенности Fail2ban:

  • Сохраняет и отслеживает журналы из файлов /var/log/secure и /var/log/auth.log, /var/log/pwdfail
  • высоко настраиваемый и многопоточный
  • следит за файлами журналов на регулярной основе

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ

Установленные пакеты/приложения

Рекомендуется устанавливать только необходимые пакеты. Администратор должен следовать стандартным критериям конфигурации, которые можно определить на основе рекомендаций по безопасной настойке (Center for Internet Security) и сканировать сервер, с использованием специальных средств, для проверки конфигурации. В ходе аудита, аудитор должен оценить и проверить установленные пакеты в проверяемой системе, для минимизации риска компрометации всей системы в случае компрометации уязвимого сервиса. Сервисы, исполняемые на 3 уровне, могут быть идентифицированы с помощью команды chkconfig:

# /sbin/chkconfig —list |grep ‘3:on’

Для определения всех пакетов, установленных в системе, используйте команду:

# sudo apt-get remove package-name

Следующий скрипт может использоваться для проверки сервисов, запущенных в системе:

#!/bin/bash
if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
echo “$service is running!!!”
else
/etc/init.d/$service start
Fi

Установленные обновления

В системы должны быть установлены последние обновления:

# yum updates
# yum check-update

НАСТРОЙКИ СЕТИ

Прослушиваемые порты

При помощи команды Netstat, можно просмотреть все открытые порты и связанные с ними команды. Пример скрипта:

# netstat–tulpn
A script for port scanning is:
    scan() {
      if [[ -z $1 || -z $2 ]]; then
       echo “Usage: $0 <host><port, ports, or port-range>”
       return
     fi

      local host=$1
      local ports=()
      case $2 in
      *-*)
       IFS=- read start end <<< “$2”
       for ((port=start; port <= end; port++)); do
        ports+=($port)
       done
       ;;
       *,*)
       IFS=, read -ra ports <<< “$2”
       ;;
       *)
       ports+=($2)
       ;;
esac
  for port in “${ports[@]}”; do
    alarm 1 “echo >/dev/tcp/$host/$port” &&
       echo “port $port is open” ||
       echo “port $port is closed”
  done
}

Межсетевой экран (iptables)

В ходе аудита, необходимо проверить конфигурацию брандмауэра Linux для предотвращения несанкционированного доступа. Для контроля трафика, в iptables должны быть созданы правила, которые будут фильтровать входящие, исходящие и пересылаемые пакеты с учетом IP адреса и номера TCP/UDP порта.

IPv6

В ходе аудита, необходимо проверить активацию и использование IPv6 в системе. Если никто не использует IPv6, он должен быть отключен, т.к. неиспользуемые службы создают уязвимости для системы. Для отключения IPv6 в конфигурационном файле сети необходимо добавить следующие строки:

# vi /etc/sysconfig/network

NETWORKING_IPV6=no
IPV6INIT=no

ICMP/broadcast запросы

В ходе аудита, необходимо проверить, что системы настроены на игнорирование ping и широковещательных запросов. Для этого убедитесь, что в файле “/etc/sysctl.conf” добавлены следующие строки:

# игнорировать ICMP запросы:
net.ipv4.icmp_echo_ignore_all = 1

# игнорировать широковещательные запросы:
net.ipv4.icmp_echo_ignore_broadcasts = 1

CRON

Аудитор должен проверить кому разрешено и запрещено выполнять задания в cron. Доступ к cron контролируется c использованием файлов /etc/cron.allow и /etc/cron.deny. Чтобы запретить пользователю использовать cron, пользователь должен быть добавлен в cron.deny. Чтобы разрешить — в cron.allow. Чтобы запретить всем пользователям использовать cron, добавте строку ALL в файл cron.deny:

# echo ALL >>/etc/cron.deny

SELINUX

В ходе аудита важно проверить статус SELinux. Данный механизм должен быть включен в системе. Существует три режима SELinux:

  • Enforcing: политика SELinux включена принудительно. SELinux запрещает доступ, основываясь на правилах политики SELinux.
  • Permissive: политика SELinux не принудительна. SELinux не запрещает доступ, но запреты журнлируются как действия, которые были бы запрещены, если переключить политику в принудительный режим.
  • Disabled: SELinux отключен. Используются только дискретные правила DAC.

В ходе аудита, можно использовать следующий сценарий, чтобы проверить состояние SELinux или использовать команды system-configselinux, getenforce или sestatus:

ENABLED=`cat /selinux/enforce`
if [ “$ENABLED” == 1 ]; then
  echo “SELinux is enabled, disable? (yes/no):”
  read disable
  if [ $disable == “yes” ]; then
    echo “disabling selinux”
  setenforce 0
  fi
  fi

NTP-СЕРВЕР

В ходе аудита, необходимо проверить статус NTP сервера. Точность и синхронизация времени имеет важное значение для анализа событий. Чтобы проверить, настроен ли NTP на запуск при старте системы используйте команду:

~]$ chkconfig —list ntpd

По умолчанию, при установке NTP службы, она настроена на запуск при каждом запуске системы.

Чтобы проверить, работает ли NTP используйте:

~]$ ntpq -p

Для верификации текущего состояния NTP сервера используйте:

~]$ ntpstat

  • Вывод 0 показывает, что часы синхронизированы.
  • Вывод 1 показывает, что часы не синхронизированы.
  • Вывод 2 показывает, что часы состояние не определено.

ЖУРНАЛЫ РЕГИСТРАЦИИ СОБЫТИЙ

В ходе аудита, необходимо проверит журналы событий, а также периодичность / регулярность их анализа. Рекомендуется использовать централизованное хранение журналов событий на выделенном сервере. В ходе аудита также необходимо убедится, что политика хранения журналов событий учитывает требования действующего законодательства и регулятора.

Журналы событий в Linux:

  • /var/log/auth.log – журнал системы авторизации (логины и механизм проверки подлинности).
  • /var/log/dpkg.log – журнал установки/удаления пакетов с использованием dpkg.
  • /var/log/yum.log – журнал установки/удаления пакетов с использованием yum.
  • /var/log/faillog – журнал неудачных попыток входа в систему и их предельного числа для каждой учётной записи.
  • /var/log/kern.log – журнал ядра, (подробный лог сообщений от ядра Linux).
  • /var/log/maillog или /var/log/mail.log – журнал почтового сервера.
  • /var/log/wtmp – журнал входа в систему (время регистрации и продолжительность работы всех пользователей системы).
  • /var/run/utmp – сведения о пользователях, зарегистрированных в системе в настоящее время.
  • /var/log/lastlog – записи о предыдущих входах в систему.
  • /var/log/boot – информация, которая регистрируется во время загрузки системы.