September 13, 2023

Linux hardening aka закалка для пингвина

Данный материал по большей части будет представлять собой чек-лист, который можно и нужно использовать при развертывании и настройке систем, основанных на Debian/Ubuntu или CentOS/RHEL.

Оглавление

  1. Шифрование передачи данных
  2. Избегай того, чтобы использовать FTP, Telnet, Rlogin/Rsh сервисов
  3. Минимизируй количество установленного ПО, чтобы минимизировать риски
  4. Одна сетевая служба на систему или экземпляр ВМ
  5. Обновляйся
  6. Учетные записи юзверей Linux и строгая парольная политика
  7. Включи ограничение по времени использования паролей пользователей Linux для повышения безопасности
  8. Ограничение использования старых паролей в Linux
  9. Фильтруй учетки без пароля
  10. Никто, кроме root, не имеет UID 0
  11. Отключи авторизацию под root
  12. Отключи ненужные службы
    1. По поводу дистрибутивов и служб Linux использующих systemd
  13. Физическая защита
  14. Отслеживай прослушиваемые порты

Шифрование передачи данных

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

  1. Используйте scp, ssh, rsync или sftp для передачи файлов. Также можно примонтировать файловую систему, которая является удаленным сервером или же Вашей домашней директорией. Реализуется это, например, через sshfs;
  2. GnuPG позволяет шифровать и подписывать ваши данные и сообщения, имеет универсальную систему управления ключами, а также модули доступа ко всем видам каталогов открытых ключей;
  3. OpenVPN - это экономичная, легкая SSL VPN. Другой вариант - попробовать tinc, который использует туннелирование и шифрование для создания защищенной сети между узлами в Интернете или же незащищенной локальной сети;
  4. При использовании веб-сервера (NGinx, Apache, Lighttpd), то и к нему будет не лишним прикрутить сертификатик.

Избегай того, чтобы использовать FTP, Telnet, Rlogin/Rsh сервисов

В большинстве сетевых конфигураций имена пользователей, пароли, команды FTP/telnet/rsh и передаваемые файлы могут быть перехвачены любым пользователем, находящимся в той же сети, с помощью сниффера. Общим решением этой проблемы является использование OpenSSH, SFTP или FTPS (FTP over SSL), которые добавляютшифрование к FTP.

Введите следующую команду yum для удаления NIS, rsh и других устаревших служб:

yum erase xinetd ypserv tftp-server telnet-server rsh-server

Если вы используете Debian/Ubuntu, то для удаления небезопасных служб: используйте:

sudo apt-get --purge remove xinetd nis yp-tools tftpd atftpd tftpd-hpa telnetd rsh-server rsh-redone-server

Минимизируй количество установленного ПО, чтобы минимизировать риски

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

Для проверки и удаления нежелательных пакетов с yum:

yum list installed

yum list packageName

yum remove packageName

Для проверки и удаления нежелательных пакетов с apt-get/dpkg:

dpkg --list

dpkg --info packageName

apt-get remove packageName

Одна сетевая служба на систему или экземпляр ВМ

Запускайте различные сетевые службы на отдельных серверах или экземплярах виртуальных машин. Это ограничивает количество других сервисов, которые могут быть скомпрометированы.

Если злоумышленник скомпрометировал веб-сервер, то будет неловко, если он скомпрометирует еще и БД, которая крутилась на этом же сервере.

Обновляйся

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

yum:

yum update

Debian/Ubuntu

apt-get update && apt-get upgrade

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

Для создания и поддержки учетных записей пользователей используйте команды useradd / usermod. Убедитесь в том, что у вас надежная парольная политика. Например, хороший пароль должен состоять не менее чем из 8 символов, а вообще лучше не менее 12 и включать в себя сочетание букв, цифр, специальных символов, верхнего и нижнего алфавита и т.д. Самое важное - выбрать пароль, который можно запомнить.

Включи ограничение по времени использования паролей пользователей Linux для повышения безопасности

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

Чтобы узнать информацию об истекающих паролях:
chage -M 99999 userName

Ну или на худой конец Вы можете редактировать /etc/shadow вручную в соответствии со значениями:

{userName}:{password}:{lastpasswdchanged}:{Minimum_days}:{Maximum_days}:{Warn}:{Inactive}:{Expire}:

Где:

  1. Minimum_days: Минимальное количество дней, необходимое для смены пароля, т.е. количество дней, оставшихся до того, как пользователю будет разрешено сменить пароль;
  2. Maximum_days: Максимальное количество дней, в течение которых действует пароль (после чего пользователь будет вынужден сменить пароль);
  3. Warn : Количество дней до истечения срока действия пароля, за которые пользователь будет предупрежден о необходимости смены пароля;
  4. Expire : Количество дней с 1 января 1970 года, когда учетная запись отключена, т.е. абсолютная дата, определяющая, когда логин больше не может быть использован.

Но я был не рекомендовал этим заниматься, а сделать по-человечески:

chage -M 60 -m 7 -W 7 userName

Ограничение использования старых паролей в Linux

В Linux можно запретить всем пользователям использовать одни и те же старые пароли. Параметр модуля pam_unix remember может быть использован для настройки количества предыдущих паролей, которые не могут быть использованы повторно.

Фильтруй учетки без пароля

Нехорошо, когда в системе есть пользователь без собственного пароля, поэтому стоит таковых отсеивать:

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

passwd -l accountName

Никто, кроме root, не имеет UID 0

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

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

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

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

Если Вы увидите учетные записи помимо root, то удалите их, либо же убедитесь, что данные учетные записи могут использовать UID 0.

Отключи авторизацию под root

Авторизация в систему под root не нужна, как и работа в системе от учетной записи root'a. Если для работы необходимы права суперпользователя, то используй sudo. Это поможет обезопасить систему и позволит не делиться с другими пользователями и администраторами паролем от root. А можно ведь еще и прикрутить уведомления на использование sudo.

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

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

chkconfig --list | grep '3:on'

А чтобы отключить:

service serviceName stop

chkconfig serviceName off

По поводу дистрибутивов и служб Linux использующих systemd

Для всего описанного выше современные в дистрибутивах с systemd используется systemctl. Например, чтобы выведите список служб, в котором перечислены уровни выполнения, на которых каждая из них настроена на включение или выключение:

systemctl list-unit-files --type=service

systemctl list-dependencies graphical.target

Для отключения служб при загрузке:

systemctl disable service

systemctl disable httpd.service

Посмотреть логи служб всегда поможет journalctl:

journalctl -u network.service

journalctl -u ssh.service

journalctl -f

journalctl -k

Физическая защита

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

Отслеживай прослушиваемые порты

Для получения списка всех открытых портов и связанного с ними ПО используйте:
netstat -tulpn

ss -tulpn

nmap -sT -O localhost

nmap -sT -O server.example.com

Ну, как мне кажется, это самое основное, что необходимо при hardening'е Linux-систем. Разумеется, можно сделать куда больше. Но это уже вопрос к тому, кто как и на совесть ли выполняет свою работу.

4rchi

tg - https://t.me/bh_cat