Глиф Учебники

Урок 9. Безопасность сервера для начинающих

Курс «Кибербезопасность» · урок 9 из 10 · 6 минут чтения

Сервер в интернете начинают проверять на слабости через минуты после запуска. Боты круглосуточно перебирают все адреса подряд, ищут открытые порты, пробуют пароли root и популярные имена пользователей по SSH, стучатся к старым версиям систем управления сайтами. Это не охота лично на вас — это фон, и защищаться нужно с первого дня.

Урок — про сервер на Ubuntu или Debian. Подробно о самих командах — тема Ubuntu.

Шаг 1. Обновления

Первым делом после установки обновите систему:

Bash
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";

Если файла нет или там нули, включите автоматические обновления:

Bash
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Некоторые обновления, например ядра системы, начинают действовать только после перезагрузки. Если она нужна, появляется файл /var/run/reboot-required:

Bash
cat /var/run/reboot-required

Сообщение *** System restart required *** — перезагрузите сервер в удобное время. Если файла нет, перезагрузка не нужна.

Шаг 2. Свой пользователь вместо root

Не работайте под root постоянно: любая ошибка или чужая программа сразу получает полную власть над системой. Заведите своего пользователя и дайте ему право на sudo:

Bash
sudo adduser ivan
sudo usermod -aG sudo ivan

Дальше входите как ivan, а команды администратора выполняйте через sudo. Каждая такая команда пишется в журнал — видно, кто и что делал.

Шаг 3. Вход по ключу

Пароль можно подобрать, SSH-ключ — практически нельзя. Создайте пару ключей на своём компьютере, не на сервере:

Bash
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 и новее эта строка есть. Проверьте:

Bash
grep Include /etc/ssh/sshd_config

Строка естьсоздайте свой файл в папке

Файла 10-hardening.conf ещё нет — nano создаст его при сохранении:

Bash
sudo nano /etc/ssh/sshd_config.d/10-hardening.conf

Впишите в него две строки выше, сохраните — Ctrl+O, затем Enter — и выйдите: Ctrl+X.

В SSH действует первое найденное значение настройки, а файлы из sshd_config.d читаются по алфавиту. Если там уже есть файл с PasswordAuthentication yes (так бывает в облачных образах), имя вашего файла должно идти по алфавиту раньше — отсюда 10- в начале.

Дальше — для всех случаев

Строки нетправьте главный файл

grep ничего не вывел — сервер файлы папки не читает, и строки правят в самом главном файле:

Bash
sudo nano /etc/ssh/sshd_config

Найдите строки PasswordAuthentication и PermitRootLogin (поиск в nano — Ctrl+W). Уберите # в начале, если он есть, поставьте значение no и сохраните файл. Строка с # в начале — комментарий: сервер её не читает.

В обоих случаях проверьте настройки и перезапустите сервер SSH:

Bash
sudo sshd -t
sudo systemctl restart ssh

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

Какие значения действуют на самом деле, с учётом всех файлов настроек, показывает sudo sshd -T.

отказ по ключу Боты из интернета перебирают пароли по SSH root / 123456 admin / qwerty Ваш компьютер ключ с фразой-паролем ssh ivan@203.0.113.10 Сервер 203.0.113.10 10-hardening.conf PasswordAuthentication no PermitRootLogin no открытый ключ ivan вход без пароля пользователя
Боты перебирают пароли root и других пользователей и получают отказ, а владелец входит по ключу: в настройках сервера PasswordAuthentication no и PermitRootLogin no.

Шаг 5. Брандмауэр

Брандмауэр (firewall) пропускает к серверу только разрешённые подключения. В Ubuntu есть простой брандмауэр ufw. Разрешите SSH, затем то, что действительно нужно снаружи (для сайта — порты 80 и 443), и включите его:

Bash
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 не пройдут, и войти снова получится только через консоль хостинга.

У многих хостингов есть ещё и свой брандмауэр в панели управления — его правила действуют раньше, чем правила на самом сервере.

интернет брандмауэр хостинга брандмауэр ufw не разрешён Сервер SSH — порт 22 OpenSSH сайт — порты 80 и 443 остальные порты сначала sudo ufw allow OpenSSH потом sudo ufw enable иначе новые SSH не пройдут
Подключение из интернета проходит брандмауэр хостинга и ufw: разрешённые SSH, порты 80 и 443 доходят до сервера, остальные порты закрыты; сначала allow OpenSSH, потом enable.

Шаг 6. Минимум открытых портов

Каждая программа, которая принимает подключения из сети, — возможная дверь. Посмотрите, какие порты сервер слушает:

Bash
sudo ss -tlnp

В столбце адреса:

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

интернет Сервер sudo ss -tlnp сайт 0.0.0.0:80 или *:80 база данных 127.0.0.1:5432 с самого сервера все адреса сервера: доступна снаружи, если пускает брандмауэр только с самого сервера: так и нужно базам и внутренним службам или [::1]:5432
Сайт на 0.0.0.0:80 слушает все адреса и доступен снаружи, а база данных на 127.0.0.1:5432 принимает подключения только с самого сервера.

Docker открывает порты контейнеров, опубликованные через -p, своими правилами — в обход ufw. Закрытый в ufw порт контейнера всё равно будет доступен из интернета. Публикуйте внутренние порты только на 127.0.0.1, например -p 127.0.0.1:8080:80.

Шаг 7. Журналы

Посмотреть, кто и когда входил по SSH:

Bash
sudo journalctl -u ssh --since today
sudo journalctl -u ssh --since today | grep Accepted

Первая команда показывает сегодняшний журнал сервера SSH — в том числе неудачные попытки входа, вторая — только успешные входы: строки Accepted publickey for … или Accepted password for … с именем пользователя и адресом, откуда вошли. Сотни неудачных попыток с разных адресов — обычный фон для сервера в интернете. Насторожить должен успешный вход, которого вы не делали.

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

Что ещё не забыть

Коротко

Проверьте себя

1. Что нужно сделать перед тем, как выключить вход по паролю в SSH?
2. В каком порядке включать ufw на сервере, к которому вы подключены по SSH?
3. В выводе ss -tlnp база данных слушает 0.0.0.0:5432. Что это значит?
4. Почему не стоит постоянно работать под root?