Это первая статья из цикла, в котором расскажем о практических способах обеспечить безопасность сервера. В качестве примера — операционная система Linux Debian с панелью управления ispmanager 6 и сайт на WordPress.

В этой статье опишу:

▪️ Безопасность в процессе установки Debian
▪️ Защита загрузчика
▪️ Безопасность SSH
▪️ Настройка ядра Linux
▪️ Стратегия усиления безопасности аутентификации
▪️ Шифрование канала
▪️ Удаление ненужного ПО
▪️ Отключение ненужных сервисов
▪️ Настройка Firewall iptables
▪️ Конфигурация Fail2ban
▪️ Профилирование AppArmor

В следующих сериях обсудим: 

▪️ Практическое использование ModSecurity в Nginx
▪️ Инструменты для аудита и мониторинга безопасности
▪️ Резервирование данных и ПО для него

Я привожу базовые рекомендации. Они не исчерпывают всех возможных способов усилить информационную безопасность, но пригодятся как отправная точка — чтобы разобраться, как защитить веб-проекты на платформе Linux Debian с панелью управления ispmanager 6.

Безопасность в процессе установки Debian

В этом разделе рассмотрим ключевые шаги — шифрование данных, безопасное разбиение диска и его монтирование.

Шифрование диска. Шифрование защищает конфиденциальность данных в случае несанкционированного доступа. LUKS (Linux Unified Key Setup) — широко используемый инструмент для шифрования целых томов, обеспечивающий надежную защиту от утечки данных. Он поддерживает несколько ключей и обеспечивает безопасное управление ключами.

В установщике Debian 11 предусмотрены следующие алгоритмы шифрования для использования с LUKS:
AES (Advanced Encryption Standard)
— один из самых распространенных алгоритмов симметричного шифрования, обеспечивающий высокую стойкость и производительность.

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

Serpent — алгоритм симметричного шифрования, известный своей высокой стойкостью, но менее эффективный с точки зрения производительности по сравнению с AES и Twofish.

XTS (XEX-based Tweaked CodeBook mode with CipherText Stealing) — режим шифрования, предназначенный для защиты данных на диске, обеспечивающий конфиденциальность и целостность данных.

SHA-256 — алгоритм хеширования, используемый для проверки целостности и подлинности данных.

Реализация LUKS предполагает настройку зашифрованных томов во время или после установки системы Linux, а также повышение безопасности устройств, подверженных потере или краже. Дополнительные инструменты, такие как eCryptfs и EncFS, предлагают шифрование для определенных каталогов или файлов.

Минусы полного шифрования диска:
Снижение производительности
. Шифрование и дешифрование данных в реальном времени может замедлить скорость чтения и записи на диск.

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

Забытый пароль. Если потерять или забыть ключ шифрования доступ к данным может оказаться невозможным.

Время загрузки. Загрузка системы может занять больше времени из-за необходимости ввода пароля для расшифровки диска.

Разметка диска и монтирование. Важно правильно разметить и смонтировать диски. Использование Logical Volume Manager (LVM) позволяет гибко управлять разделами и улучшить безопасность системы. 

→ Пример разметки диска с опциями монтирования для установки хостинг-панели ispmanager

/boot— загрузочный раздел с файловой системой ext2 и указанными опциями nodev, nosuid и noexec.

/ — основной раздел операционной системы Linux. Файловая система ext4, монтирование с опциями nodev, nosuid, noexec. Опция монтирования noexec дополнительно запрещает выполнение исполняемых файлов в разделе, что повышает уровень безопасности системы, предотвращая возможность запуска потенциально вредоносных программ. 

swap— раздел для обмена, используемый для управления виртуальной памятью.

/usr — раздел с установленными приложениями, файловая система ext4, монтирование с опциями nodev, чтобы предотвратить создание устройств в этой файловой системе.

/usr/share — раздел с общими данными для приложений, файловая система ext4, монтирование с опциями, чтобы запретить использование устройств и суид-битов в этой директории.

/var — раздел с переменными данными, например, журналами или временными файлами, файловая система ext4, монтирование с опциями nodev, usrquota, grpquota, чтобы предотвратить создание устройств и включить квоты на пользователей и группы.

/tmp — раздел с временными файлами, файловая система ext4, монтирование с опциями nodev, nosuid, noexec, usrquota, grpquota, чтобы предотвратить создание устройств, использование суид-битов и выполнение файлов в этой директории, а также включить квоты на пользователей и группы.

/opt — раздел для стороннего ПО, не входящего в стандартный набор дистрибутива. Файловая система ext4, монтирование с опциями nodev, nosuid.

/var/tmp — раздел для временных файлов, аналогично /tmp, с параметром ext4 и опциями nodev, nosuid, noexec, usrquota, grpquota.

/var/log — раздел с журналами, файловая система ext4, монтирование с опциями nodev, nosuid, noexec, чтобы предотвратить создание устройств и использование суид-битов в этой директории.

/var/www — раздел для веб-сервера, файловая система ext4, монтирование с опциями nodev, usrquota, grpquota, чтобы предотвратить создание устройств и включить квоты на пользователей и группы.

→ Пример содержимого файла /etc/fstab

Здесь описаны монтирования различных разделов и файловых систем:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# systemd generates mount units based on this file, see systemd.mount(5).
# Please run 'systemctl daemon-reload' after making changes here.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/debian-root /               ext4    rw,nosuid,nodev,noexec,relatime,errors=remount-ro 0       1
# /boot was on /dev/vda1 during installation
UUID=aba9cdb1-0f46-4356-a74f-1a726883156b /boot           ext2    nodev,nosuid,noexec 0       2
/dev/mapper/debian-tmp /tmp            ext4    nodev,nosuid,noexec,usrquota,grpquota 0       2
/dev/mapper/debian-opt /opt            ext4    nodev,nosuid 0       2
/dev/mapper/debian-usr /usr            ext4    nodev           0       2
/dev/mapper/debian-usr_share /usr/share      ext4    nodev,nosuid    0       2
/dev/mapper/debian-var /var            ext4    nodev,usrquota,grpquota 0       2
/dev/mapper/debian-var_log /var/log        ext4    nodev,nosuid,noexec 0       2
/dev/mapper/debian-var_tmp /var/tmp        ext4    nodev,nosuid,noexec,usrquota,grpquota 0       2
/dev/mapper/debian-var_www /var/www        ext4    nodev,usrquota,grpquota 0       2
/dev/mapper/debian-swap none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0
#
proc /proc proc rw,nosuid,nodev,noexec,relatime,hidepid=2 0 0
tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0
devtmpfs /dev devtmpfs defaults,nosuid,noexec,relatime,size=487424k,nr_inodes=121856,mode=755,inode64 0 0
devpts /dev/pts devpts defaults,nosuid,noexec,relatime,mode=600 0 0

Шифрование и разметка диска — это тема для отдельной статьи.

Защита загрузчика

Защита загрузчика критически важна для обеспечения безопасности операционной системы, так как загрузчик — это первое программное обеспечение, которое выполняется при запуске компьютера. Если загрузчик скомпрометирован, злоумышленники могут внедрить вредоносное ПО, подменить ядро системы или обойти механизмы безопасности на ранних этапах загрузки. 

→ Защита загрузчика в Debian 11 может быть выполнена с помощью следующих шагов.

Использование пароля для GRUB

 1. Откройте файл конфигурации GRUB:
sudo nano /etc/grub.d/40_custom

2. Добавьте следующие строки для настройки парольной аутентификации:
set superusers="admin"

password_pbkdf2 admin grub.pbkdf2.sha512.10000.YOURHASH

3. Сгенерируйте хеш пароля с помощью команды:
grub-mkpasswd-pbkdf2

и замените YOURHASH на полученный хеш.

Настройка Secure Boot — если поддерживается вашим оборудованием:

1. Включите Secure Boot в настройках BIOS/UEFI.

2. Установите пакеты для работы с Secure Boot:
sudo apt install shim-signed grub-efi-amd64-signed

3. Переустановите GRUB с поддержкой Secure Boot:
sudo grub-install --target=x86_64-efi --uefi-secure-boot

4. Обновите конфигурацию GRUB:
sudo update-grub

Обновление и защита ядра:

1. Регулярно обновляйте систему, включая ядро, для получения последних патчей безопасности:
sudo apt update && sudo apt upgrade

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

Эти шаги помогут защитить загрузчик в Debian от несанкционированного доступа и улучшить общую безопасность системы.

Безопасность SSH

Безопасная конфигурация SSH играет ключевую роль в обеспечении безопасности серверных систем Linux. SSH (Secure Shell) — стандартный протокол удаленного доступа, который обеспечивает защищенное подключение и обмен данными между клиентом и сервером. 

Рассмотрим основные меры по улучшению безопасности SSH, включая настройку авторизации по ключу и отключение root-входа.

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

→ Настройка на стороне сервера SSHd:

1. Откройте файл конфигурации SSH-сервера /etc/ssh/sshd_config в текстовом редакторе с правами администратора.

2. Найдите или добавьте следующую строку для разрешения аутентификации по ключу id_ed25519:
PubkeyAcceptedKeyTypes +ssh-ed25519

3. Сохраните изменения и перезапустите SSH-сервер:
sudo systemctl restart sshd

→ Настройка клиентской машины:

1. Создайте пару ключей SSH. Используйте команду ssh-keygen, чтобы создать новую пару ключей SSH. Эта команда создаст закрытый ключ и открытый ключ. Храните закрытый ключ в безопасности и не передавайте его.
ssh-keygen -t ed25519 -C "your_email@example.com"

2. Скопируйте открытый ключ на сервер:
scp ~/.ssh/id_ed25519.pub username@server_ip:~/

3. Подключитесь к серверу и добавьте открытый ключ в файл ~/.ssh/authorized_keys:
ssh username@server_ipcat ~/id_ed25519.pub >> ~/.ssh/authorized_keys

5. Установите права доступа для файлов на сервере и клиентской машине.

Выполняем команду на клиентской машине. Храните приватный ключ как зеницу ока:
chmod 600 ~/.ssh/id_ed25519

Выполняем команды сервере:
chmod 700 ~/.ssh

chmod 600 ~/.ssh/authorized_keys

Теперь сервер SSH должен принимать ключи Ed25519 для аутентификации и вы можете подключаться к серверу с использованием ключа id_ed25519.

Важно! Рекомендуется хранить приватный ключ в зашифрованном состоянии на внешнем носителе.

→ Включение авторизации по ключу. Чтобы включить авторизацию по ключу в SSH, вам нужно убедиться, что следующие параметры в файле /etc/ssh/sshd_config установлены следующим образом:

1. Убедитесь, что параметр PubkeyAuthentication установлен в yes. Этот параметр разрешает аутентификацию по открытым ключам:
PubkeyAuthentication yes

2. По умолчанию, большинство систем устанавливают этот параметр в yes. Если он установлен в no, измените его на yes.

3. Убедитесь, что параметр RSAAuthentication или PubkeyAcceptedKeyTypes для более современных настроек. Также установлен в yes:
RSAAuthentication yes

4. Сохраните изменения и перезапустите SSH-сервер:
sudo systemctl restart sshd

После выполнения этих шагов, авторизация по ключу SSH будет включена на вашем сервере.

Настройка SSHD сервера. SSHD (Secure Shell Daemon) отвечает за обеспечение безопасного удаленного доступа к системе по протоколу SSH. В этом разделе мы рассмотрим основные шаги по настройке SSHD для обеспечения безопасности и удобства использования.

Отключение root-авторизации если в систему невозможно войти через SSH под пользователем root, риск успешных атак на сервер снижается.

→ Для отключения root-входа по SSH необходимо внести изменения в конфигурационный файл SSH-сервера. Обычно это файл /etc/ssh/sshd_config.

1. Откройте файл /etc/ssh/sshd_config в текстовом редакторе с правами администратора.

2. Найдите строку PermitRootLogin в этом файле. Если она закомментирована:
# PermitRootLogin
раскомментируйте ее и установите значение на no:
PermitRootLogin no

3. Сохраните изменения и перезапустите SSH-сервер:
sudo systemctl restart sshd

Вход под пользователем root через SSH будет запрещен. 

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

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

Чтобы отключить авторизацию по паролю и разрешить только аутентификацию по ключу:

1. Откройте файл /etc/ssh/sshd_config в текстовом редакторе с правами администратора.

2. Найдите и измените следующие строки:

PasswordAuthentication no

ChallengeResponseAuthentication no

3. Сохраните изменения и перезапустите SSH-сервер:

sudo systemctl restart sshd

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

Важно! Перед применением настроек обязательно проверьте конфигурационные файлы SSHD. Используйте следующую команду для проверки:
sudo sshd -t

Прочие настройки sshd_config. Настройки в файле sshd_config могут значительно усилить безопасность и функциональность вашего SSH-сервера за счет предотвращения подбора паролей и ограничения возможностей злоумышленников использовать SSH-туннели и перенаправление для атак.

Настройки, которые вы можете установить в этом файле, включают:

Port 1234 — порт, на котором будет слушать SSH-сервер. Замените «1234» на нестандартный номер порта — например, 2222, чтобы уменьшить количество неудачных попыток подключения.

Protocol 2 — используйте только протокол версии 2, так как он более безопасен, чем устаревший протокол версии 1.

AllowUsers username1 username2 — разрешить только указанным пользователям подключаться по SSH. Замените username1 username2 на реальные имена пользователей.

PermitEmptyPasswords no — запретить аутентификацию с пустым паролем.

LogLevel VERBOSE — установить уровень журналирования SSH на VERBOSE для получения более подробных журналов.

MaxAuthTries 3 — ограничить количество попыток аутентификации до 3 для предотвращения подбора паролей.

MaxSessions 2 — ограничить количество одновременных сеансов до 2 для уменьшения риска перегрузки сервера.

AllowAgentForwarding no — запретить перенаправление агента SSH, чтобы предотвратить атаки через агент SSH.

AllowTcpForwarding no — запретить TCP-перенаправление, чтобы предотвратить возможные атаки через SSH-туннели.

X11Forwarding no — отключить X11-перенаправление для снижения риска безопасности.

TCPKeepAlive no — отключить отправку пакетов подтверждения keepalive для сокращения ресурсов сети.

Compression no — отключить сжатие данных для уменьшения нагрузки на процессор сервера.

ClientAliveInterval 300 — отправить сообщение клиенту каждые 300 секунд (5 минут) для проверки активности соединения.

ClientAliveCountMax 2 — разрешить до 2 неответивших сообщений о проверке активности соединения перед его завершением.

Banner none — отключить баннер SSH, чтобы скрыть версию SSH-сервера.

Перед внесением изменений в sshd_config убедитесь, что вы понимаете, как они повлияют на безопасность и функциональность вашего сервера, и протестируйте изменения в безопасной среде.

После внесения изменений не забудьте перезапустить службу SSH для применения настроек:
sudo systemctl restart sshd

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

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

1. Создание резервной копии файла /etc/issue.net и установка нового приветственного сообщения:

sudo cp /etc/issue.net /etc/issue.net.old

sudo echo 'Welcome to the world of Windows 98! ;)' > /etc/issue.net

2. Создание резервной копии файла /etc/issue и установка нового приветственного сообщения:

sudo cp /etc/issue /etc/issue.old

sudo echo 'Welcome to the world of Windows 98! ;)' > /etc/issue

Настройка ядра Linux

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

Рассмотрим каждую из этих настроек подробнее:
kernel.kptr_restrict = 2— ограничивает доступ к указателям ядра для предотвращения утечек информации о ядре.

kernel.sysrq = 0 — отключает возможность использования комбинации клавиш SysRq, что может предотвратить нежелательные действия через этот механизм.

kernel.unprivileged_bpf_disabled = 0 — отключает возможность запуска непривилегированными процессами программ, использующих BPF (Berkeley Packet Filter).

kernel.yama.ptrace_scope = 0 — отключает ограничения на использование ptrace для отладки процессов, что может быть полезно для некоторых отладочных задач.

net.core.bpf_jit_harden = 0 — отключает JIT-компиляцию для BPF для уменьшения риска уязвимости.

kernel.modules_disabled = 1 — отключает возможность загрузки новых модулей ядра в систему после её запуска. Это увеличивает безопасность системы, предотвращая загрузку потенциально вредоносных или несанкционированных модулей. Однако, после включения этой настройки, её нельзя отключить без перезагрузки системы.

kernel.core_uses_pid = 0 — отключает использование PID в имени файла ядра при записи дампов памяти для повышения конфиденциальности.

dev.tty.ldisc_autoload = 0 — отключает автоматическую загрузку ldisc (line discipline) для tty устройств.

net.ipv4.conf.all.accept_redirects = 0 — это значение указывает, что система не будет принимать ICMP-редиректы. Это повышает безопасность системы, предотвращая атаки, которые могут использовать поддельные ICMP-редиректы для изменения маршрутизации трафика. Обычно рекомендуется устанавливать это значение в 0, особенно на маршрутизаторах или шлюзах.

net.ipv4.conf.all.log_martians = 1— включает логирование «марсианских» пакетов — то есть пакетов, которые приходят с неправильных или невозможных IP-адресов для всех сетевых интерфейсов. Это помогает в обнаружении и диагностике сетевых аномалий или неправильных конфигураций.

net.ipv4.conf.all.send_redirects = 0 — отключает отправку ICMP перенаправлений, что может помочь предотвратить атаки с использованием перенаправлений.

net.ipv4.conf.default.accept_redirects = 0 — отключает прием ICMP перенаправлений по умолчанию для повышения безопасности.

net.ipv4.conf.default.log_martians = 1 — включает логирование «марсианских» пакетов для интерфейсов по умолчанию.

net.ipv4.tcp_timestamps = 0 — отключает использование временных меток TCP, что может помочь предотвратить некоторые атаки, связанные с манипуляцией временем.

net.ipv6.conf.all.accept_redirects = 0 и net.ipv6.conf.default.accept_redirects = 0 — отключают прием ICMPv6 перенаправлений для IPv6.

net.ipv4.conf.all.rp_filter = 1 — включает обратную проверку пути для фильтрации пакетов с неправильным адресом источника.

net.ipv4.conf.default.accept_source_route = 0 — отключает принятие пакетов с маршрутом, содержащим исходный маршрут — для предотвращения атак с подделкой пакетов.

net.ipv4.conf.all.proxy_arp = 0 — отключает proxy ARP, что может помочь предотвратить некоторые сетевые атаки.

Эти настройки могут быть добавлены в файл /etc/sysctl.conf и применены с помощью команды :
sysctl -p

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

Отключение модулей ядра —  таких как ohci1394, sbp2, dv1394, raw1394, и video1394 помогает уменьшить атакующую поверхность сервера и снижает риск эксплуатации потенциальных уязвимостей в этих модулях. Так проще обеспечивать безопасность сервера и управление им и сосредоточиться на поддержании актуальности и безопасности используемых компонентов.

→ Отключение модулей ядра USB Storage и выбор классической стеки FireWire перед новой CONFIG_FIREWIRE:

  1. Для USB Storage:

    Создание файла конфигурации /etc/modprobe.d/usb-storage.conf со следующим содержимым:

    install usb-storage /bin/true

  2. Для FireWire:
    Настройка в файле /etc/modprobe.d/blacklist-firewire.conf:

# Выбор классической стеки FireWire перед новой CONFIG_FIREWIRE.
blacklist ohci1394
blacklist sbp2
blacklist dv1394
blacklist raw1394
blacklist video1394

Настройка проверки auditd в Linux. Позволяет отслеживать и записывать события безопасности, происходящие в системе, обеспечивая детализированный аудит важных системных компонентов и файлов. Это помогает быстро выявлять несанкционированные действия, нарушения безопасности и изменения в конфигурациях.

Настройка проверок auditd в Linux позволяет создавать подробные журналы аудита для отслеживания действий пользователей и системных событий. В файле, автоматически сгенерированном из /etc/audit/rules.d, определены правила аудита для мониторинга различных действий в системе.

→ Вот мои настройки проверок auditd в Linux:

apt install auditd -y
systemctl enable auditd
echo '
## This file is automatically generated from /etc/audit/rules.d
-D
-b 8192
-f 1
--backlog_wait_time 60000
-w /var/log/audit/ -k auditlog
-w /etc/audit/ -p wa -k auditconfig
-w /etc/libaudit.conf -p wa -k auditconfig
-w /etc/audisp/ -p wa -k audispconfig
-w /sbin/auditctl -p x -k audittools
-w /sbin/auditd -p x -k audittools
-a exit,always -F arch=b32 -S mknod -S mknodat -k specialfiles
-a exit,always -F arch=b64 -S mknod -S mknodat -k specialfiles
-a exit,always -F arch=b32 -S mount -S umount -S umount2 -k mount
-a exit,always -F arch=b64 -S mount -S umount2 -k mount
-a exit,always -F arch=b32 -S adjtimex -S settimeofday -S stime -S clock_settime -k time
-a exit,always -F arch=b64 -S adjtimex -S settimeofday -S clock_settime -k time
-w /etc/localtime -p wa -k localtime
-w /etc/cron.allow -p wa -k cron
-w /etc/cron.deny -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /etc/cron.daily/ -p wa -k cron
-w /etc/cron.hourly/ -p wa -k cron
-w /etc/cron.monthly/ -p wa -k cron
-w /etc/cron.weekly/ -p wa -k cron
-w /etc/crontab -p wa -k cron
-w /var/spool/cron/crontabs/ -k cron
-w /etc/group -p wa -k etcgroup
-w /etc/passwd -p wa -k etcpasswd
-w /etc/gshadow -k etcgroup
-w /etc/shadow -k etcpasswd
-w /etc/security/opasswd -k opasswd
-w /usr/bin/passwd -p x -k passwd_modification
-w /usr/sbin/groupadd -p x -k group_modification
-w /usr/sbin/groupmod -p x -k group_modification
-w /usr/sbin/addgroup -p x -k group_modification
-w /usr/sbin/useradd -p x -k user_modification
-w /usr/sbin/usermod -p x -k user_modification
-w /usr/sbin/adduser -p x -k user_modification
-w /etc/login.defs -p wa -k login
-w /etc/securetty -p wa -k login
-w /var/log/faillog -p wa -k login
-w /var/log/lastlog -p wa -k login
-w /var/log/tallylog -p wa -k login
-w /etc/hosts -p wa -k hosts
-w /etc/network/ -p wa -k network
-w /etc/inittab -p wa -k init
-w /etc/init.d/ -p wa -k init
-w /etc/init/ -p wa -k init
-w /etc/ld.so.conf -p wa -k libpath
-w /etc/sysctl.conf -p wa -k sysctl
-w /etc/modprobe.conf -p wa -k modprobe
-w /etc/pam.d/ -p wa -k pam
-w /etc/security/limits.conf -p wa  -k pam
-w /etc/security/pam_env.conf -p wa -k pam
-w /etc/security/namespace.conf -p wa -k pam
-w /etc/security/namespace.init -p wa -k pam
-w /etc/puppetlabs/puppet/ssl -p wa -k puppet_ssl
-w /etc/aliases -p wa -k mail
-w /etc/postfix/ -p wa -k mail
-w /etc/ssh/sshd_config -k sshd
-a exit,always -F arch=b32 -S sethostname -k hostname
-a exit,always -F arch=b64 -S sethostname -k hostname
-w /etc/issue -p wa -k etcissue
-w /etc/issue.net -p wa -k etcissue
-a exit,always -F arch=b64 -F euid=0 -S execve -k rootcmd
-a exit,always -F arch=b32 -F euid=0 -S execve -k rootcmd
-a exit,always -F arch=b64 -S open -F dir=/etc -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/bin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/home -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/var/www -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/sbin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/srv -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/usr/bin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/usr/local/bin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/usr/sbin -F success=0 -k unauthedfileacess
-a exit,always -F arch=b64 -S open -F dir=/var -F success=0 -k unauthedfileacess
-w /bin/su -p x -k priv_esc
-w /usr/bin/sudo -p x -k priv_esc
-w /etc/sudoers -p rw -k priv_esc
-w /sbin/halt -p x -k power
-w /sbin/poweroff -p x -k power
-w /sbin/reboot -p x -k power
-w /sbin/shutdown -p x -k power
-e 2
' > /etc/audit/rules.d/audit.rules
auditctl -R /etc/audit/audit.rules

Буду рад, если расскажите, как делаете вы или как улучшить мою практику.

Стратегия усиления безопасности аутентификации

Для усиления безопасности вашей системы Linux важно включить строгую аутентификацию.

Этот процесс включает в себя следующее:
Правила надежных паролей. Убедитесь, что каждая учетная запись пользователя использует пароли длиной не менее 12 символов, включая прописные и строчные буквы, цифры и уникальные символы. Избегайте использования легко предсказуемых слов или фраз.

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

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

Управление паролями. Используйте надежные менеджеры паролей для безопасного хранения и управления паролями, что позволит пользователям использовать разные и сложные пароли без необходимости запоминания их.

Эти стратегии помогут значительно снизить вероятность несанкционированного доступа к вашей системе Linux и защитить важную информацию от киберугроз.

→ Двухэтапная аутентификация ispmanager

По умолчанию для входа в панель управления требуется указать только логин и пароль. Однако для улучшения безопасности аккаунта рекомендуется использовать двухэтапную аутентификацию.

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

— Логин и пароль.

— Одноразовый числовой пароль, который генерирует мобильное приложение Google Authenticator.

Дополнительные сведения о настройке двухэтапной аутентификации можно найти в официальной документации https://www.ispmanager.ru/docs/ispmanager/dvuhetapnaya-autentifikacziya

Шифрование канала

Шифрование канала с использованием OpenVPN и WireGuard помогает усилить информационную безопасность за счет обеспечения конфиденциальности и целостности передаваемых данных, защищая их от перехвата и модификации злоумышленниками во время трансляции по сети.

OpenVPN. Использует библиотеку OpenSSL, которая поддерживает множество алгоритмов шифрования.

Наиболее часто используемые алгоритмы OpenVPN включают:
→ AES (Advanced Encryption Standard). Самый популярный алгоритм шифрования, используемый в OpenVPN. Обычно используются варианты AES-128, AES-192 и AES-256, где числа обозначают размер ключа в битах.

→ Blowfish. Это симметричный алгоритм блочного шифрования, который был одним из первых алгоритмов, поддерживаемых OpenVPN. Однако он считается менее безопасным, чем AES.

→ Camellia. Это ещё один симметричный алгоритм блочного шифрования, аналогичный AES. Camellia реже используется, но предлагает схожую степень безопасности.

WireGuard. Использует собственный набор криптографических примитивов, известный как Noise Protocol Framework.

Основные алгоритмы, используемые в WireGuard, включают:
→ ChaCha20. Это симметричный алгоритм потокового шифрования, который используется для шифрования данных. ChaCha20 обеспечивает высокую скорость и безопасность.

→ Poly1305. Это алгоритм для создания кода аутентификации сообщения (MAC), который используется в сочетании с ChaCha20 для обеспечения целостности и аутентификации данных.

→ Curve25519. Это алгоритм для обмена ключами эллиптической кривой Диффи-Хеллмана (ECDH), используемый для установления общего секретного ключа между двумя сторонами.

→ BLAKE2s. Это алгоритм хеширования, используемый для различных внутренних операций в WireGuard.

Настройка WireGuard в ispmanager 6 описана в официальной документации →

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

Я выбираю WireGuard за его простоту настройки, высокую скорость и современные алгоритмы шифрования. Этот инструмент обеспечивает надежную безопасность и высокую производительность, делая его идеальным выбором для создания защищенных VPN-соединений.

Конечно, существуют и другие способы защиты данных, передаваемых по сети. Я описал надежные и простые в использовании решения. Клиентские приложения доступны для различных операционных систем, включая Windows, macOS, Linux, Android и iOS.

Удаление ненужного ПО

Меньше программ — меньше уязвимых точек и более эффективное использование ресурсов.

Шаги для удаления ненужного ПО:
1. Определить ненужные приложения. Используйте инструменты, такие как `dpkg-query`, для составления списка установленных пакетов и определения тех, которые можно удалить. Вывести список установленных пакетов можно командой:
dpkg-query -l

или

dpkg-query -l | awk '{print $2}'

Для просмотра информации об определенном установленном пакете используйте команду :
dpkg-query -l apache2

2. Удалить неиспользуемое ПО через менеджер пакетов. Используйте команды, такие как
sudo apt remove [имя_пакета]

3. Полное удаление пакетов. Для удаления даже конфигурационных файлов ненужных пакетов используйте:
sudo apt purge [имя_пакета]

или

sudo apt purge ~c

чтобы удалить все пакеты, помеченные как устаревшие.

4. Очистка зависимостей. Используйте:
sudo apt autoremove

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

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

В интерфейсе ispmanager 6: 

  1. Перейдите в раздел «Настройки»

  2. Выберите «Конфигурация ПО».

  3. Найдите нужный сервис — на примере apache2 и веб-сервер (WWW)

  4. Нажмите кнопку: «Изменить».

После перехода в интерфейс «Настройка ПО» → Веб-сервер (WWW)» установите значение «Не использовать».

Отключение ненужных сервисов 

Отключение ненужных сервисов снижает атакующую поверхность системы и уменьшает количество потенциальных уязвимостей.

Сначала определяем, какие сервисы работают, чтобы решить, какие из них можно отключить. Чтобы получить список всех сервисов и их статусов, используйте команду service с аргументом status-all, как показано ниже:

sudo service --status-all

В этом списке сервисы, которые запущены, отмечены символом +, а отключенные сервисы – символом -.

Если сервис отключен, но не остановлен, он продолжит работу до следующей перезагрузки.

Чтобы остановить сервис перед его отключением, используйте команду systemctl с аргументом stop, за которым следует имя сервиса.

Синтаксис:
sudo systemctl stop <Service-Name>

Например, чтобы остановить сервис apache2, выполните команду:

sudo systemctl stop apache2

Чтобы полностью отключить сервис и предотвратить его запуск при следующей перезагрузке, используйте команду systemctl с аргументом disable и именем сервиса.

Синтаксис:
sudo systemctl disable <service>

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

sudo systemctl disable apache2

В интерфейсе ispmanager:

  1. Перейдите в раздел «Мониторинг и журналы»

  2. Выберите «Службы».

  3. Найдите нужный сервис — например, apache2.

  4. Нажмите соответствующую задаче кнопку: «Старт», «Стоп», «Рестарт» или «Включить/Выключить автозапуск».

Настройка Firewall iptables 

Настройка iptables путем закрытия лишних портов и настройки политик доступа к серверу помогает контролировать трафик и ограничивать доступ к службам.

Если у вас есть конкретные вопросы или требуется помощь с настройкой iptables — спрашивайте.

Закрываем открытые порты. Чтобы закрыть порт 3306/tcp (стандартный порт для MySQL) с помощью iptables и ip6tables, выполните следующее.

1. Проверьте текущие правила iptables.

Для IPv4:

sudo iptables -L

Для IPv6:

sudo ip6tables -L

2. Если нужно, добавьте правило для блокировки порта 3306.

Для IPv4:

sudo iptables -A INPUT -p tcp --destination-port 3306 -j DROP

Для IPv6:

sudo ip6tables -A INPUT -p tcp --destination-port 3306 -j DROP

3. Убедитесь, что правило добавлено, выполнив команды для проверки правил.

4. Сохраните изменения, чтобы они применялись после перезагрузки.

Для IPv4:

sudo iptables-save > /etc/ispiptable.conf

Для IPv6:

sudo iptables-save > /etc/ispip6table.conf

Теперь порт 3306/tcp будет заблокирован и не будет доступен извне.

Открываем доступ для IP White List. Для открытия доступа к порту 3306/tcp (MySQL) для конкретного IP-адреса 1.2.3.4 в iptables и ip6tables , выполните следующие шаги.

1. Проверьте текущие правила, как описано в главе выше:

2. Добавьте правило для разрешения доступа к порту 3306 от IP-адреса 1.2.3.4 и fe12::3456:ff:fe89:10:

Для IPv4:

sudo iptables -A INPUT -p tcp --dport 3306 -s 1.2.3.4 -j ACCEPT

Для IPv6:

ip6tables -A INPUT -p tcp --dport 3306 -s fe12::3456:ff:fe89:10 -j ACCEPT

3. Убедитесь, что правило добавлено, как описано в главе выше.

4. Сохраните изменения, чтобы они применялись после перезагрузки, как описано в главе выше.

Теперь IPv4-адрес 1.2.3.4 и IPv6-адрес fe12::3456:ff:fe89:10 будет и иметь доступ к порту 3306/tcp MySQL сервера.

Готовая конфигурация iptables для ispmanager 6. Содержимое файла /etc/ispiptable.conf представлено ниже. Конфигурацию /etc/ispip6table.conf мы рассмотрим в отдельной статье, посвященной настройке iptables в ispmanager.

Скопируйте текст и вставьте его в терминал с правами root или администратора:

 sudo echo '

# Generated by iptables-save v1.8.7 on Sun Mar 24 01:54:11 2024

*filter

:INPUT DROP [0:0]

:FORWARD DROP [0:0]

:OUTPUT ACCEPT [0:0]

:ispmgr_allow_ip - [0:0]

:ispmgr_allow_sub - [0:0]

:ispmgr_deny_ip - [0:0]

:ispmgr_deny_sub - [0:0]

:ispmgr_limit_req - [0:0]

-A INPUT -j ispmgr_deny_ip

-A INPUT -j ispmgr_allow_ip

-A INPUT -j ispmgr_allow_sub

-A INPUT -j ispmgr_deny_sub

# Для настроек IPv6 замените в строке ispmgr_limit_req на ispmgr_limit_req6 
# Должно выглядеть это так: -A INPUT -m set --match-set ispmgr_limit_req6 src -j DROP
-A INPUT -m set --match-set ispmgr_limit_req src -j DROP

-A INPUT -i lo -j ACCEPT # Разрешить установленные соединения 

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Web сервер

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # FTP сервер

-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 49152:65534 -j ACCEPT 

# SSH настроен на нестандартный порт.
-A INPUT -p tcp -m tcp --dport 1234 -j ACCEPT 

# Почтовый сервер
-A INPUT -p tcp -m tcp --dport 143 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 993 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 110 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 995 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 25 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 465 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 587 -j ACCEPT

#Хостинг панель 
# Не рекомендую открывать доступ к хостинг панели для всех IP, замените 1.2.3.4 на ваш IP 
# -A INPUT -s 1.2.3.4 -p tcp -m tcp --dport 1500 -j ACCEPT 

# Чтобы избежать потери доступа к хостинг-панели, я закомментировал правило выше. 
# Если вы хотите активировать это правило, отредактируйте его, убрав символ комментария в начале строки 
# и затем удалите это правило: `-A INPUT -p tcp -m tcp --dport 1500 -j ACCEPT`.
-A INPUT -p tcp -m tcp --dport 1500 -j ACCEPT

# DNS 
-A INPUT -p udp -m udp --dport 53 -j ACCEPT

COMMIT
# Completed on Sun Mar 24 01:54:11 2024' > /etc/ispiptable.conf

Для быстрого применения настроек выполните следующую команду:

Для IPv4:

sudo iptables-restore < /etc/ispiptable.conf

Для IPv6:

sudo ip6tables-restore < /etc/ispip6table.conf

Для использования команды sudo необходимо установить и настроить соответствующий пакет. Если вы столкнулись с ошибкой:

-bash: sudo: command not found

выполняйте команды с правами пользователя root без использования sudo.

 Или можно установить sudo, выполнив команду от пользователя root:

 apt install sudo

 После этого sudo должен работать как ожидается.

Конфигурация Fail2ban

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

Установка Fail2ban

1. Обновление системы:

sudo apt update

sudo apt upgrade -y

2. Установка Fail2ban:

   sudo apt install fail2ban -y

Настройка Fail2ban для защиты SSH

1. Создание копии конфигурационного файла:

Fail2ban читает файлы конфигурации в следующем порядке: fail2ban.conf, fail2ban.local, jail.conf, jail.d/*.conf, jail.local, jail.d/*.local. Лучшей практикой является создание `.local` файлов для изменения настроек, чтобы они не были перезаписаны при обновлении пакета.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

2. Настройка файла /etc/fail2ban/jail.d/defaults-debian.localдля защиты SSH:

 Откройте файл в редакторе:

sudo nano /etc/fail2ban/jail.d/defaults-debian.local

Найдите секцию [sshd] и убедитесь, что она включенаenabled = true. Вы можете настроить параметры в соответствии с вашими потребностями, например:

[sshd]
enabled = true
# тут поменял стандартный порт 
port    = 1234
filter  = sshd
maxretry = 5
bantime = 600

Здесь maxretry— количество попыток входа перед блокировкой, bantime — время блокировки в секундах. 

3. Перезапуск Fail2ban:

 sudo systemctl restart fail2ban

или

sudo fail2ban-client restart

 Проверка статуса Fail2ban

 Проверьте статус Fail2ban и активные правила SSH:

sudo fail2ban-client status
sudo fail2ban-client status sshd

Теперь Fail2ban будет мониторить логи SSH и блокировать IP-адреса, которые совершают слишком много неудачных попыток входа, тем самым защищая ваш сервер от брутфорс-атак.

→ Установка и настройка Fail2ban в ispmanager 6

Установка. Обычно Fail2ban уже предустановлен в системе после установки ispmanager 6. Если по каким-то причинам Fail2ban отсутствует, вы можете легко установить его через интерфейс панели:

1. Перейдите в раздел «Настройки» → «Конфигурация ПО».
2. Найдите Fail2ban в списке, отметьте его галочкой.
3. Нажмите на кнопку «Установить».

Пример процесса установки показан ниже.

Настройка. Сетевые службы играют ключевую роль в обеспечении взаимодействия между устройствами в сети, такими как компьютеры и другое сетевое оборудование. К примеру, служба SSH (sshd) позволяет подключаться к серверу через протокол SSH, а служба веб-сервера (httpd) управляет веб-подключениями.

В разделе «Сетевые службы» ispmanager доступны следующие настройки:

— Конфигурация правил доступа к сетевым службам вашего сервера.

— Настройка защиты от брутфорс-атак с использованием сервиса Fail2ban.

Чтобы работать с этим модулем, перейдите в раздел «Мониторинг и журналы» → «Сетевые службы». 

Дополнительную информацию и подробные инструкции можно найти в официальной документации ispmanager по ссылке https://www.ispmanager.ru/docs/ispmanager/setevye-sluzhby

Настройка fail2ban — это широкая тема, охватывающая не только защиту sshd, но и таких сервисов, как Exim, Dovecot, Proftpd и прочих сервисов. Если вас интересует подробное описание этой темы, пожалуйста, отметьте это в комментариях, и я подготовлю материалы по настройке fail2ban для различных сервисов.

Профилирование AppArmor

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

Пример профиля AppArmor php-fpm для обеспечения безопасности сайта на WordPress:

# Last Modified: Tue Mar 19 09:44:20 2024
include <tunables/global>

/opt/php74/sbin/php-fpm {
  include <abstractions/apache2-common>
  include <abstractions/base>
  include <abstractions/openssl>
  include <abstractions/php>
  include <abstractions/user-tmp>

  capability chown,
  capability kill,
  capability net_admin,
  capability setgid,
  capability setuid,

  network inet dgram,
  network inet6 dgram,

  /etc/ImageMagick-6/coder.xml r,
  /etc/ImageMagick-6/magic.xml r,
  /etc/hosts r,
  /opt/php74/sbin/php-fpm mr,
  /run/*.sock w,
  /run/mysqld/mysqld.sock rw,
  /run/systemd/resolve/stub-resolv.conf r,
  /usr/share/ImageMagick-6/english.xml r,
  /usr/share/ImageMagick-6/locale.xml r,
  /var/www/*/data/logs/.log w,
  owner /etc/ImageMagick-6/log.xml r,
  owner /etc/ImageMagick-6/policy.xml r,
  owner /opt/php74/conf.d/ r,
  owner /opt/php74/etc/* r,
  owner /opt/php74/etc/*/ r,
  owner /opt/php74/etc/php-fpm.d/* r,
  owner /opt/php74/lib/php/extensions/ mr,
  owner /opt/php74/mods-available/* r,
  owner /opt/php74/var/log/php-fpm.log w,
  owner /opt/php74/var/run/php-fpm.pid w,
  owner /proc/sys/kernel/random/boot_id r,
  owner /run/*.sock rw,
  owner /run/systemd/notify w,
  owner /run/systemd/userdb/ r,
  owner /run/systemd/userdb/io.systemd.DynamicUser rw,
  owner /var/www/*/data/tmp/* rwk,
  owner /var/www/*/data/mod-tmp/* rwk,
  owner /var/www/*/data/www/*/ r,
  owner /var/www/*/data/www/*/sap-logs/logs-*.txt w,
  owner /var/www/*/data/www/*/wp-content/cache/ w,
  owner /var/www/*/data/www/*/wp-content/uploads/.gif w,
  owner /var/www/*/data/www/*/wp-content/uploads/.jpg w,
  owner /var/www/*/data/www/*/wp-content/uploads/.mp4 w,
  owner /var/www/*/data/www/*/wp-content/uploads/.png w,
  owner /var/www/*/data/www/*/wp-content/webp-express/webp-images/doc-root/wp-content/uploads/ w,
  owner /var/www/*/data/www/*/wp-content/webp-express/webp-images/doc-root/wp-content/uploads/.jpg.webp w,
  owner /var/www/*/data/www/*/wp-content/wflogs/*.php rwk,
  owner /var/www/*/data/www/*/wp-content/wflogs/config.tmp.* wk,
  owner /var/www/*/data/www/*/wp-content/temp-write-* w,
  owner /var/www/*/data/www/*/wp-content/uploads/temp-write-test-* w,
}

Этот профиль AppArmor предназначен для управления разрешениями процесса php-fpm, используемого в веб-серверах. 

Вот некоторые ключевые аспекты профиля:

Включение абстракций. Профиль включает различные абстракции AppArmor, такие как apache2-common, base, openssl, php, user-tmp, которые предоставляют общие правила доступа, используемые во многих профилях.

Капабилити (capabilities). Профиль предоставляет php-fpm определенные капабилити, такие как chown, kill, net_admin, setgid,setuid, позволяя ему изменять владельца файлов, отправлять сигналы процессам, управлять сетевыми настройками и изменять идентификаторы группы и пользователя.

Сетевой доступ. Разрешен доступ к сети через протоколы inet и inet6 (IPv4 и IPv6 соответственно) для дейтаграмм (dgram), что позволяет php-fpm взаимодействовать с сетью.

Доступ к файлам и каталогам. Профиль определяет правила для доступа к различным файлам и каталогам, включая конфигурационные файлы, логи, временные файлы, а также файлы и каталоги, связанные с сайтами на WordPress. Например, разрешен доступ на чтение к файлам конфигурации ImageMagick, запись в логи веб-сайтов, а также чтение и запись в директории кеша и загрузок WordPress.

Защита файлов логов и конфигураций. Профиль ограничивает доступ к файлам логов и конфигураций php-fpm, разрешая запись только в определенные файлы и каталоги.

Этот профиль AppArmor настроен для обеспечения безопасной работы php-fpm, ограничивая его возможности и доступ к файловой системе. Но профили безопасности могут отличаться в зависимости от установленных плагинов в WordPress.

Настройка AppArmor — это обширная тема, требующая не одной статьи для того, чтобы детально описать процесс создания профилей для таких сервисов, как Apache, Nginx, MySQL, Exim, Dovecot, Proftpd, Redis, Memcached и других. Если вас интересует эта тема, пожалуйста, укажите это в комментариях, и я подготовлю подробные материалы по настройке AppArmor.

В следующих статьях:
▪️ Настройка Nginx ModSecurity (WAF)
▪️ Настройка системы согласно аудиту Lynis
▪️ Завершение настроек безопасности, включая белые списки

Расскажите, какие еще аспекты безопасности Linux Debian с ispmanager 6 вы бы хотели обсудить.

Комментарии (13)