5 Декабря, 2016

Скрипты экспресс аудита безопасности для Linux (ITGC)

Иван Пискунов
Большинство таких корпоративных  и многокомпонентных систем как SAP, Oracle DB используют в своей платформе операционную систему базирующийся на Linux. В виду этого к ним обращено такое пристальное внимание со стороны ИТ-аудиторов. Сегодня в статье мы представим вашему вниманию несколько бесплатных инструментов представленных в виде скриптов и использующих штатные механизмы ОС для провидения экспресс аудита конфигурации  безопасности.

Ниже описанные системные команды и скрипты применяемые для экспресс аудита опций безопасности систем ОС Linux базируются на рекомендациях по проверке защищенности  опубликованными сообществом ISACA в руководстве UNIX/LINUX Operating System Security Audit/Assurance Program .
1.Проверка учетных записей

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

  1. bin/bash
  2. # userslistinthesystem.sh
  3. # count and Lists existing “real” users in the system.
  4. echo
  5. echo “[*] Existing users (sorted alphabetically):”
  6. echo
  7. grep ‘/bin/bash’ /etc/passwd | grep -v ‘root’ | cut -f1
  8. -d’:’ | sort
  9. echo
  10. echo -n “[*] Number of real users found: “
  11. grep ‘/bin/bash’ /etc/passwd | grep -v ‘root’ | wc -l
  12. echo
1.2 Вывести список заблокированных учетных записей
В ходе аудита, необходимо проверить список заблокированных и разблокированных пользователей (accountName). Для этого подойдет следующая команда:
  1. #!/bin/bash
  2. echo
  3. # passwd –s accountName
1.3 Просмотр статистики по всем пользователям
  • Аудитор должен убедиться, что команда ac включена в системе, для обзора деятельности пользователей:
    1. #!/bin/bash
    2. # ac
    Для просмотра активности сеанса подключения пользователя с итогами за каждый день используйте команду:
    1. #!/bin/bash
    2. # ac -d
    Для вывода информации, об активности сеанса (в часах) подключения пользователя «user»:
    1. #!/bin/bash
    2. # ac user
    1.4  Просмотр активности пользователей
    Системные приложения psacct или acct работают в фоновом режиме и отслеживают активность каждого пользователя в системе, а также потребляемые им ресурсы. Для проверки активности пользователей  в системе запустите следующий скрипт:
    1. #!/usr/bin/envksh
    2. last -Fa|awk ‘
    3. /wtmp begins/ { next; }
    4. /still logged in/ { next; }
    5. $0 == reboot { next; }
    6. NF >  0 {
    7. if( NR > 1 )
    8. printf ( “
      ” );
    9. printf ( “ User:t%s
      ”, $1 ); # user
    10. printf ( “ Start:t%s %s %s %s
      ”, $3, $4, $5, $6 );
    11. if( $9 == “down” )
    12. printf ( “ End:tshutdown
      ” );
    13. else
    14. printf ( “ End:t%s %s %s %s
      ”, $9, $10, $11, $12 );
    15. if( substr ( $NF, 1, 1 ) == “(“ )
    16. {
    17. t = $NF;
    18. h = “localhost”;
    19. }
    20. else
    21. {
    22. t = $(NF-1);
    23. h = $NF;
    24. }
    25. gsub( “[()]”, “”, t );
    26. printf ( “ Time On:t%s
      ”, t );
    27. printf ( “Remote Host:t%s
      ”, h );
    28. }‘
  • 2. Проверка парольной политики

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

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

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

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

    2.3 Проверка срока действия пароля
    В ходе аудита, необходимо проверить настройку срока истечения действия пароля. Чтобы проверить срок действия пароля необходимо использовать команду change. Эта команда выводит подробную информацию сроке действия пароля, а также о дате его последнего изменения.
    Следующая команда служит для просмотра информации о «возрасте» паролей:

    #chage -l username

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

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

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

    2.4 Использование повторяющихся паролей
    Настройки авторизации в систему должны соответствовать парольной политике. Файл содержащий историю паролей находится в /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

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

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

    1. # vi /etc/ssh/sshd_config

    3.1 Вход в систему от имени суперпользователя (root login)

    В ходе аудита, аудитор должен проверить запрет удаленного входа в систему с правами суперпользователя root.

    # PermitRootLogin = yes
    3.2 Проверка служебного аккаунта SSH login

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

    Check your sshd_config settings (/etc/ssh/sshd_config) are correct one last time.

    # PermitRootLogin without-password

    # RSAAuthentication = yes

    # PubkeyAuthentication = yes

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

    Особенности DenyHosts:
    • сохраняет и отслеживает журналы из файла /var/log/secure, отметив, все успешные и неудачные попытки входа, и фильтрует их.
    • осуществляет мониторинг неудачных попыток входа
    • отправляет по электронной почте уведомление о заблокированных хостах и подозрительных попытках входа
    Особенности Fail2ban:
    • Сохраняет и отслеживает журналы из файлов /var/log/secure и /var/log/auth.log, /var/log/pwdfail
    • высоко настраиваемый и многопоточный
    • следит за файлами журналов на регулярной основе
    4. Проверка системных журналов
    В ходе аудита, необходимо убедиться, что запущен демон SysLog , а все значимые события происходящие в системе фиксируются в  журналах событий. В ходе аудита также необходимо убедится, что политика хранения журналов событий учитывает требования действующего законодательства и политики безопаности

    4.1 Журналы событий в 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 – информация, которая регистрируется во время загрузки системы

    5. Защита  системных файлов
    5.1 Защита загрузчика GRUB
    Для защиты системного загрузчика GRUB, администратору необходимо использовать шифрование пароля в MD5 формате:

    [root@machine~]# grub-md5-crypt

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

    или

    [root@machine~]# vi /boot/grub/grub.conf

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

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

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

    LABEL=/boot /boot ext2 defaults,ro 1 2
    5.3  Проверка открытых портов и активных  соединений
    Следующий скрипт может использоваться для проверки сервисов, запущенных в системе:
    #!/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

    Просмотр сетевых соединений

    # netstat -anop
    или
    # lsof -i(lsof -ni)
    или
    # iptraf

    Прослушиваемые порты
    При помощи команды 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 порта.


    # iptables -n -L -v --line-numbers

    ICMP/broadcast запросы

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

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

    5.4 Проверка установленных обновлений
    В системы должны быть установлены последние обновления:
    # yum updates
    # yum check-update

    6. Проверка автоматически выполняемых заданий CRON

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

    # echo ALL >>/etc/cron.deny

    7. Проверка форсированного режима безопасности 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

    Скрипт  LBSA для  проверки основных опций безопасности
    LBSA (Linux Basic Security Audit script) - это базовый скрипт аудита конфигурации безопасности Linux-систем. Скрипт должен быть запущен из командной строки с привилегиям root, или в идеале запускаться по расписанию на регулярной основе с помощью планировщика cron  для систематической проверки изменений конфигурации.
    Целью данного скрипта является экспресс аудит настроек безопасности и выгрузка отчета с описанием возможных параметров, которые могут быть изменены, чтобы обеспечить более высокую степень защищенности.  В случае же, если нет каких-либо рекомендаций по какой-то опции, скрипт просто выводит одну строчку с отработкой чека, а итоговое решение всегда остается за администратором. Прежде чем запускать проверку, разработчики настоятельно рекомендуют ознакомиться с руководством и изучить рекомендуемые разделы для получения дополнительной информации.


    В настоящее редакции (Version 1.0.49), скрипт сканирует следующий опции:
    • уязвимости в настройках учетных записей
    • уязвимости в настройках SSH
    • уязвимости во временных каталогах и каталогов файловой системы загруженной в оперативную память (например, в /tmp, /var/tmp  /dev/)
    • разрешения на файлы, состояние системных директорий
    • rконфигурацию сервисов DRBD и  Hearbeat
    и т.п.

    Скрипт довольно большой, поэтому мы не стали его помещать на страницу.
    Его можно скачать на официальной странице