Урок 9. Безопасность сервера для начинающих
Сервер в интернете начинают проверять на слабости через минуты после запуска. Боты круглосуточно перебирают все адреса подряд, ищут открытые порты, пробуют пароли root и популярные имена пользователей по SSH, стучатся к старым версиям систем управления сайтами. Это не охота лично на вас — это фон, и защищаться нужно с первого дня.
Урок — про сервер на Ubuntu или Debian. Подробно о самих командах — тема Ubuntu.
Шаг 1. Обновления
Первым делом после установки обновите систему:
sudo apt update
sudo apt upgradeВ Ubuntu обновления безопасности обычно ставятся сами — это делает пакет unattended-upgrades. Проверьте, что он включён:
$ cat /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";Если файла нет или там нули, включите автоматические обновления:
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgradesНекоторые обновления, например ядра системы, начинают действовать только после перезагрузки. Если она нужна, появляется файл /var/run/reboot-required:
cat /var/run/reboot-requiredСообщение *** System restart required *** — перезагрузите сервер в удобное время. Если файла нет, перезагрузка не нужна.
Шаг 2. Свой пользователь вместо root
Не работайте под root постоянно: любая ошибка или чужая программа сразу получает полную власть над системой. Заведите своего пользователя и дайте ему право на sudo:
sudo adduser ivan
sudo usermod -aG sudo ivanДальше входите как ivan, а команды администратора выполняйте через sudo. Каждая такая команда пишется в журнал — видно, кто и что делал.
Шаг 3. Вход по ключу
Пароль можно подобрать, SSH-ключ — практически нельзя. Создайте пару ключей на своём компьютере, не на сервере:
ssh-keygen -t ed25519
ssh-copy-id ivan@203.0.113.10Первая команда создаёт ключ (задайте фразу-пароль — она защитит ключ, если файл украдут), вторая отправляет открытую часть на сервер. Адрес 203.0.113.10 — пример, у вас будет адрес вашего сервера. Проверьте, что ssh ivan@203.0.113.10 пускает без пароля пользователя. Подробнее, в том числе для Windows, — урок SSH — удалённый доступ к серверу темы Ubuntu.
Шаг 4. Выключите пароли и вход root по SSH
Когда вход по ключу работает, закройте вход по паролю — тогда перебор паролей становится бесполезен. Для этого серверу SSH нужны две строки настроек:
PasswordAuthentication no
PermitRootLogin noГлавный файл настроек — /etc/ssh/sshd_config. Если в его начале есть строка Include /etc/ssh/sshd_config.d/*.conf, сервер читает и файлы из папки /etc/ssh/sshd_config.d/ — тогда свои настройки удобнее положить туда отдельным файлом. В Ubuntu 20.04 и Debian 11 и новее эта строка есть. Проверьте:
grep Include /etc/ssh/sshd_configСтрока естьсоздайте свой файл в папке
Файла 10-hardening.conf ещё нет — nano создаст его при сохранении:
sudo nano /etc/ssh/sshd_config.d/10-hardening.confВпишите в него две строки выше, сохраните — Ctrl+O, затем Enter — и выйдите: Ctrl+X.
В SSH действует первое найденное значение настройки, а файлы из sshd_config.d читаются по алфавиту. Если там уже есть файл с PasswordAuthentication yes (так бывает в облачных образах), имя вашего файла должно идти по алфавиту раньше — отсюда 10- в начале.
Строки нетправьте главный файл
grep ничего не вывел — сервер файлы папки не читает, и строки правят в самом главном файле:
sudo nano /etc/ssh/sshd_configНайдите строки PasswordAuthentication и PermitRootLogin (поиск в nano — Ctrl+W). Уберите # в начале, если он есть, поставьте значение no и сохраните файл. Строка с # в начале — комментарий: сервер её не читает.
В обоих случаях проверьте настройки и перезапустите сервер SSH:
sudo sshd -t
sudo systemctl restart sshНе закрывайте текущее соединение, пока не проверили вход по ключу из второго окна терминала. Если ключ не подошёл, а пароли уже выключены, попасть на сервер можно будет только через консоль в панели хостинга или с клавиатуры самого сервера.
Какие значения действуют на самом деле, с учётом всех файлов настроек, показывает sudo sshd -T.
Шаг 5. Брандмауэр
Брандмауэр (firewall) пропускает к серверу только разрешённые подключения. В Ubuntu есть простой брандмауэр ufw. Разрешите SSH, затем то, что действительно нужно снаружи (для сайта — порты 80 и 443), и включите его:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verboseРазрешите SSH до команды ufw enable. Иначе после включения брандмауэра новые подключения по SSH не пройдут, и войти снова получится только через консоль хостинга.
У многих хостингов есть ещё и свой брандмауэр в панели управления — его правила действуют раньше, чем правила на самом сервере.
Шаг 6. Минимум открытых портов
Каждая программа, которая принимает подключения из сети, — возможная дверь. Посмотрите, какие порты сервер слушает:
sudo ss -tlnpВ столбце адреса:
127.0.0.1:портили[::1]:порт— программа доступна только с самого сервера. Так и должно быть у баз данных, кэшей и внутренних служб;0.0.0.0:портили*:порт— программа слушает все сетевые адреса и доступна снаружи, если брандмауэр её пропускает.
Удалите программы, которые не нужны, а базы данных и панели администрирования не выставляйте в интернет: пусть слушают 127.0.0.1, а подключайтесь к ним через SSH.
Docker открывает порты контейнеров, опубликованные через -p, своими правилами — в обход ufw. Закрытый в ufw порт контейнера всё равно будет доступен из интернета. Публикуйте внутренние порты только на 127.0.0.1, например -p 127.0.0.1:8080:80.
Шаг 7. Журналы
Посмотреть, кто и когда входил по SSH:
sudo journalctl -u ssh --since today
sudo journalctl -u ssh --since today | grep AcceptedПервая команда показывает сегодняшний журнал сервера SSH — в том числе неудачные попытки входа, вторая — только успешные входы: строки Accepted publickey for … или Accepted password for … с именем пользователя и адресом, откуда вошли. Сотни неудачных попыток с разных адресов — обычный фон для сервера в интернете. Насторожить должен успешный вход, которого вы не делали.
Программа fail2ban следит за журналами и на время блокирует адреса, с которых много раз ошибаются паролем. При входе только по ключу она уже не так важна, но уменьшает шум в журналах.
Что ещё не забыть
- Сайты. Систему управления сайтом, её плагины и темы обновляйте так же, как систему: через устаревшие плагины взламывают больше всего сайтов.
- Пароли служб. У базы данных, панели и почты — свои длинные пароли, не такие, как у пользователя.
- Резервные копии — на другой сервер или в другое хранилище, а не на тот же диск. Урок Резервные копии: правило 3-2-1.
- Свой ключ — только у вас. Закрытый ключ SSH не пересылают и не кладут на сервер.
Коротко
- Сервер в интернете атакуют сразу: защищаться нужно с первого дня.
- Обновления —
apt updateиapt upgrade, автоматические обновления безопасности —unattended-upgrades. - Работайте своим пользователем с
sudo, а не подroot. - Вход по ключу, затем
PasswordAuthentication noиPermitRootLogin no— после проверки из второго окна. ufw: сначалаallow OpenSSH, потомenable; снаружи — только нужные порты.ss -tlnpпоказывает, что слушает сервер; базы данных — только на127.0.0.1.