Менеджер по развитию

Базовые советы по сетевой безопасности на сервере

Бытует мнение, что Linux-сервера являются наиболее безопасными и защищёнными. Это утверждение справедливо, но всегда следует держать в голове, что безопасность — это процесс, а не результат, и под лежачий камень вода не течёт.

В этой статье структурированы советы и практики по организации сетевой безопасности на серверах на примере Debian. Они отсортированы от самых распространённых и важных до менее очевидных.

1. Минимизировать внешний доступ из интернета

Через настройки роутера ограничить доступ до сервера только по тем портам, которые слушает само веб-приложение, избегая торчащих наружу баз данных, почтовых сервисов, микросервисов без валидаций, доступ к котором должен быть только у самого приложения на сервере. Для нескольких серверов лучше всего организовать свой собственный VLAN из под VPN (виртуальной приватной сети), прокинув наружу только проксирующий nginx или Apache.

2. Защитить ssh доступ

2.1 Использовать ssh ключи с алгоритмом шифрования rsa

$ ssh-keygen -t rsa

На сервере свой публичный ключик с расширением .pub можно поместить в $HOME/.ssh/authorized_keys, на клиенте добавить ключ можно через

$ ssh-add -K $HOME/.ssh/user_rsa

Следует запретить вход по паролю, разрешить вход только нескольким юзерам:

$ nano /etc/ssh/ssh_config

И привести конфигурацию к такому виду:

AllowUsers admin maxim
PermitRootLogin no
PasswordAuthentication no

Перезапустить сервис ssh (внимание: перед этим следует проверить вход по ssh ключу, иначе можно потерять доступ к серверу насовсем).

$ service sshd restart

2.2 Защитить ssh от подбора паролей с помощью Fail2Ban

Fail2Ban будет блокировать IP-адреса, с которых будут активно подбираться пароли по ssh, а также сканироваться порты на предмет уязвимостей.

$ apt-get install fail2ban

Отредактировать конфиг можно в /etc/fail2ban/jail.local

3. Использовать нестандартные порты для сервисов

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

Чтобы усложнить им работу стоит хотя бы поменять стандартные порты, как 5432 на Postgres и 22 на ssh, 3306 для MySQL.

Делается это всё в стандартных конфигах (только не забыть потом перезапустить сервис и разблокировать новые необходимые порты в фаерволе).

# Для ssh:

$ nano /etc/ssh/sshd_config

# Поменять 22 на необходимый порт, например, 122331
Port 22


$ service sshd restart

4. Расположить сервисы по разным виртуальным хостам

Не стоит держать сервер электронной почты, CMS, базу данных и прочие внутренние службы на одном хосте. Так, если один из этих сервисов будет скомпрометирован, под угрозу попадает сразу всё. Для этого прекрасно подходит виртуализация, правильно настроенное Docker-окружение (как его правильно настроить читайте здесь).

5. Правильно настроить firewall

В качестве firewall на Debian используется стандартный iptables, чтобы упростить его настройку мы будем использовать ufw :

# Установка
$ sudo apt install ufw

# Проверяем статус
$ sudo ufw status verbose

# По умолчанию запрещаем входящие и разрешаем исходящие соединения
$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing

# Синтаксис добавления правил
$ ufw allow 80/tcp 
$ ufw allow 443/tcp 
$ ufw allow 22/tcp
$ ufw allow proto tcp from 81.44.44.44
$ ufw allow out on docker0 from 172.16.0.0/12

# Удаляем правила
$ sudo ufw status numbered
$ sudo ufw delete <номер_правила>

# Включаем фаервол
$ sudo ufw enable

# Перезапускаем конфиг
$ sudo ufw reload

# Вывод всех правил
$ sudo ufw status

Просканировать свой сервер можно через nmap, выполненный снаружи:

$ nmap 8.8.8.8

6. Регулярно обновлять хостовую машину и докер*

На стабильные версии. Регулярные обновления помогут избежать атаки различных сканеров уязвимостей. Например, если у вас до сих пор стоит непропатченная Ubuntu 16.04, то вам угрожает Dirty COW (CVE-2016-5195), с помощью которой можно из контейнера получить root права на хосте.

# Важно помнить, что подобные действия лучше не проводить на production 
# окружении вашего приложения, не проверив совместимость версий на dev или stage  

$ apt update && sudo apt upgrade

7. Настроить мониторинг

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