Pull to refresh

Базовая гигиена серверов Linux (часть 1)

Reading time8 min
Views21K
Original author: Vivek Gite

Всем привет! Для того, чтобы усилить безопасность серверов Linux привожу ниже советы, основой которых является публикация 40 Linux Server Hardening Security Tips [2023 edition] Вивека Гите. В приведенных инструкциях предполагается использование дистрибутив Linux на базе Ubuntu/Debian. Часть материала от автора я опускаю, так как публикация ориентированна на безопасность хостов Linux в инфраструктуре.

!!! Приведенные ниже рекомендации необходимо тестировать на совместимость с используемыми сервисами. Перед внедрением рекомендую провести тестирование на каждом отдельном типе сервера/приложения. !!!

  1. Шифруйте передаваемые данные

    По возможности, откажитесь от использования FTP, Telnet и Rlogin/Rsh, так как в большинстве сетевых конфигураций имена пользователей, пароли, команды и передаваемые файлы могут быть перехвачены любым пользователем в той же сети с помощью анализаторов сетевых пакетов. Используйте OpenSSH, SFTP или FTPS, которые добавляют шифрование с помощью TLS.

    Чтобы удалить NIS, rsh и другие устаревшие службы:

sudo apt-get --purge remove xinetd nis yp-tools tftpd atftpd tftpd-hpa telnetd rsh-server rsh-redone-server
  1. Минимизируйте установленное программное обеспечение, чтобы минимизировать уязвимости в Linux

    Избегайте установки ненужного программного обеспечения, чтобы избежать дополнительных уязвимостей. Используйте менеджер пакетов RPM, например apt-get и/или dpkg, чтобы просмотреть весь установленный набор пакетов программного обеспечения в системе.

dpkg --list
dpkg --info packageName
apt-get remove packageName
  1. Одна сетевая служба на каждую отдельную систему или экземпляр виртуальной машины

    Это позволит ограничить количество других служб, которые могут быть скомпрометированы. Например, если злоумышленник сможет успешно использовать такое программное обеспечение, как Apache Flow, он получит доступ ко всему серверу, включая другие службы, такие как MySQL/MariaDB/PGSql, сервер электронной почты и так далее. Если у вас мало железа, используйте виртуализацию для получения дополнительных инстансев.

  2. Поддерживайте актуальность ядра и программного обеспечения Linux

    Установка исправлений безопасности — важная часть обслуживания сервера Linux. Linux предоставляет все необходимые инструменты для обновления вашей системы, а также позволяет легко выполнять обновления между версиями. Все обновления безопасности следует проверять (тестировать) и применять как можно быстрее. Чтобы применить обновления воспользуйтесь командой

apt-get update && apt-get upgrade
  1. Используйте Linux Security Extensions

    Linux поставляется с различными исправлениями безопасности, которые можно использовать для защиты от неправильно настроенных или скомпрометированных программ. Если возможно, используйте SELinux и другие расширения безопасности Linux, чтобы обеспечить соблюдение ограничений для сети и других программ. Например, SELinux предоставляет различные политики безопасности для ядра Linux.

  2. Настройте мандатное управление доступом

    SELinux позволяет использовать мондатное управление доступом (MAC). В соответствии со стандартным дискреционным управлением доступа Linux (DAC) приложение или процесс, работающий от имени пользователя (UID или SUID), имеет разрешения пользователя на такие объекты, как файлы, сокеты и другие процессы. Запуск ядра MAC защищает систему от вредоносных или ошибочных приложений, которые могут повредить или уничтожить систему. См. официальную документацию Redhat, в которой объясняется настройка SELinux.

  3. Учетные записи пользователей Linux и строгая парольная политика

    Используйте команды useradd/usermod для создания и обслуживания учетных записей пользователей. Убедитесь, что у вас хорошая и надежная политика паролей. Например, хороший пароль состоит как минимум из 14 символов (здесь я поменял рекомендации от автора в 8 символов) и включает в себя сочетание букв, цифр, специальных символов, буквы верхних и нижних регистров и т. д.  Хорошей практикой является проверка паролей пользователей по словарям утекших хешей паролей.

    Обычно файлы конфигурации, связанные с паролем и аутентификацией, хранятся в  каталоге /etc/pam.d/ в системах на базе Debian. А политика паролей определяется в файле /etc/pam.d/common-password. Прежде чем вносить в него какие-либо изменения, на всякий случай сделайте резервную копию этого файла.

Чтобы установить минимальную длину пароля, отредактируйте файл:

sudo vi /etc/pam.d/common-password

Найдите следующую строку:

password [success=2 default=ignore] pam_unix.so obscure sha512

И добавьте в конце дополнительное слово:  minlen=14. Здесь я установил минимальную длину пароля 14.

password [success=2 default=ignore] pam_unix.so obscure sha512 minlen=14

Сохраните и закройте файл. Теперь пользователи не могут использовать пароль длиной менее 14 символов.

Подробнее о настройке сложности пароля можно посмотреть здесь.

  1. Настройте срок действия пароля

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

    В Linux есть еще один интересный файл - /etc/shadow. В этом файле хранится хешированная парольная фраза (или «хеш») для учетных записей пользователей Linux. Можно корректировать файл /etc/shadow в следующих полях

{userName}:{password}:{lastpasswdchanged}:{Minimum_days}:{Maximum_days}:{Warn}:{Inactive}:{Expire}:
  • Minimum_days - минимальное количество дней, необходимое между сменами пароля, т.е. количество дней, оставшихся до того, как пользователю будет разрешено сменить свой пароль.

  • Maximum_days - максимальное количество дней, в течение которых пароль действителен (после этого пользователь будет вынужден сменить свой пароль).

  • Warn - за какое количество дней до истечения срока действия пароля пользователь будет предупрежден о необходимости смены пароля.

  • Expire - дни, когда учетная запись будет отключена, т.е. абсолютная дата, определяющая, когда логин больше не может использоваться.

    1. Ограничение использования предыдущих паролей

      Рекомендуется запретить всем пользователям использовать или повторно использовать одни и те же старые пароли в Linux. Параметр памяти модуля pam_unix можно использовать для настройки количества предыдущих паролей, которые нельзя использовать повторно. /etc/pam.d/common-password – файл конфигурации pam Debian/Ubuntu Linux.

      Отредактируйте/добавьте строку пароля и добавьте ее remember=5, чтобы запретить пользователю повторно использовать любой из своих последних 5 паролей:

password sufficient pam_unix2.so use_authtok md5 shadow remember=5

Обратите внимание, что последние 5 паролей для каждого пользователя сохраняются в файле /etc/security/opasswd , чтобы принудительно сохранить историю смены паролей и не дать пользователю слишком часто менять один и тот же пароль.

  1. Блокировка учетных записей пользователей после неудачного входа в систему

    В Linux вы можете использовать команду Faillog для отображения записей журнала ошибок или для установки лимитов неудачных попыток входа в систему. faillog форматирует содержимое журнала сбоев /var/log/faillog. Его также можно использовать для ведения счетчиков и ограничений неудачных попыток входа. Чтобы увидеть неудачные попытки входа в систему, введите:

faillog

Чтобы разблокировать учетную запись после неудачных попыток входа, выполните:

faillog -r -u userName

Опция -m позволяет вам установить максимальное количество неудачных попыток входа (MAX) в систему, после превышения этого числа будет отключение учетной записи. Выбор значения MAX, равного 0, приводит к отсутствию ограничения на количество неудачных входов в систему.

# faillog -M MAX -u username
# faillog -M 5 -u root

Обратите внимание, что вы можете использовать команду passwd для блокировки и разблокировки учетных записей:

# lock Linux account
passwd -l userName

# unlock Linux account
passwd -u userName

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

awk -F: '($2 == "") {print}' /etc/shadow

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

passwd -l userName
  1. Убедитесь, что ни в одной учетной записи без полномочий root UID не установлен на 0

    Только учетная запись root имеет UID 0 с полными разрешениями на доступ к системе. Введите следующую команду, чтобы отобразить все учетные записи с UID, равным 0:

awk -F: '($3 == "0") {print}' /etc/passwd

Вы должны увидеть только одну строку:

root:x:0:0:root:/root:/bin/bash

Если вы видите другие строки, удалите их или убедитесь, что этим учетным записям разрешено использовать UID 0.

  1. Отключите root-вход

    Никогда не входите в систему как пользователь root. Вы должны использовать sudo для выполнения команд корневого уровня по мере необходимости. sudo значительно повышает безопасность системы, не передавая пароль root другим пользователям и администраторам.

  2. Оцените физическую безопасность серверов Linux

    Вы должны защитить доступ к физической консоли серверов Linux. Настройте BIOS и отключите загрузку с внешних устройств, таких как DVD/CD/USB-накопитель. Установите пароль загрузчика BIOS и grub, чтобы защитить эти настройки. Подробнее о настройках можно посмотреть здесь.

  3. Отключите ненужные службы Linux

    Отключите все ненужные службы и демоны (службы, работающие в фоновом режиме). Вам необходимо удалить все ненужные службы из автозагрузки системы. Введите следующую команду, чтобы просмотреть все службы, которые запускаются во время загрузки на уровне 3:

# systemctl list-unit-files --type=service
# systemctl list-dependencies graphical.target

Отключить службу во время загрузки

# systemctl disable service
# systemctl disable httpd.service

Запустить/остановить/перезапустить службу

# systemctl start service
# systemctl start httpd.service

# systemctl restart service
# systemctl restart httpd.service

# systemctl stop service
# systemctl stop httpd.service

Просмотр логов

# journalctl
# journalctl -u network.service
# journalctl -u ssh.service
# journalctl -f
# journalctl -k
  1. Найдите открытые сетевые порты

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

ss -tulpn
  1. Удалите системы X Window (X11)

    Системы X Window (графического интерфейса) на сервере не требуются. Нет смысла запускать X11 на выделенном почтовом сервере Linux и веб-сервере Apache/Nginx. Вы можете отключить и удалить X Windows, чтобы улучшить безопасность и производительность сервера. Debian использует /etc/rc2.d/*gdm или /etc/rc2.d/*kdm или /etc/rc2.d/*xdm для GUI при загрузке. Чтобы удалить воспользуйтесь командами

update-rc.d gdm remove <== удаление Gnome
update-rc.d xdm remove <== удаление Kde
update-rc.d kdm remove <== удаление Xdm
  1. Настройте сетевой экран (firewall) на базе Iptables и TCPWrappers

    Iptables — это прикладная программа, которая позволяет настраивать брандмауэр (Netfilter), предоставляемый ядром Linux. Будьте внимательны и аккуратны при настройке Iptables - при ошибке в настройке можно потерять сетевой доступ к серверу (благо, если Linux на виртуальной машине и можно подключиться и исправить настройки через гипервизор). Примеры настройки доступны здесь.

  2. Выполните харденинг ядра Linux /etc/sysctl.conf

    Файл /etc/sysctl.conf используется для настройки параметров ядра во время запуска. Linux считывает и применяет настройки из /etc/sysctl.conf во время загрузки. Пример /etc/sysctl.conf :

# Включаем execshield
kernel.exec-shield=1
kernel.randomize_va_space=1

# Включить защиту от IP спуфинга
net.ipv4.conf.all.rp_filter=1

# Отключить IP source роутинг
net.ipv4.conf.all.accept_source_route=0

# Игнорирование broadcast-запросов
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_messages=1

# Убеждаемся, что сетевые пакеты с некорректными адресами логируются 
net.ipv4.conf.all.log_martians = 1

Tags:
Hubs:
Total votes 31: ↑25 and ↓6+19
Comments24

Articles