Server Security
Краткие заметки по минимальной защите сервера
На написание данного черновика навел меня вопрос в рассылке:
hi all
Скажу сразу, я не спец по безопасности…
…
PS вопрос возник после того, как только что подняв машину завёл пользователя admin c паролем admin (думал когда закончу работу поменяю) поставил ssh и… пошёл на 10 мин в туалет. Когда вернулся дело было уже сделано — уже кто-то приконектился и начал что-то на мою машину заливать. Удивительно даже — маньяки какие-то… Я ж не супер-мега сервер какой-то, а рядовойadsl-щик.
В этой заметке я хочу собрать советы и рекомендации, скорее идеи, как настроить некоторый уровень безопасности сервера или рабочей станции при подключении к Интернет. Эти рекомендации ни в коем случае не обеспечат абсолютной защиты вашего сервера (такой не существует), но большинство атак отразить помогут.
Проверяем, какие сервисы запущены и слушают порты
После установки необходимого ПО, проверьте, какие порты открыты.
# netstat -nap Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name ... tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 5584/cyrus-master ...
Приведенная строка информирует нас о том, что на всех сетевых адресах открыт порт 993, и слушает его cyrus-master.
Да, я уверен, что этот сервис должен слушать этот порт (это IMAPS). Надписи вида 127.0.0.1:xxx в третьей колонке означают, что сервис работает только в пределах самой машины (считается безопасным).
Если вы обнаружите открытый порт и сервис, который вам не известен, разберитесь досконально, что это и для чего нужно, прежде чем отключать.
Если данный сервис нужен в локальной сети, но не должен быть доступен извне, посмотрите в настройки данного сервиса, наиболее вероятным параметром будет LISTEN.
Например, настройки сервера ssh:
# cat /etc/openssh/sshd_config ... #Port 22 #ListenAddress 0.0.0.0 #ListenAddress :: ...
В моем примере данная настройка не используется, а вы поступайте по своему разумению.
Настраиваем firewall
Возможна ситуация, когда необходимый сервис не имеет такой настройки, и слушает все сетевые интерфейсы. В таком случае необходимо настроить iptables. (Я предполагаю, что у вас именно этот пакет. В другом случае, берите на вооружение идею, а реализуйте ее тем инструментарием, который у вас есть). Есть два пути настройки iptables, использовать тот файл настроек, который предусмотрен дистрибутивом, и написание собственного скрипта. Различий мало… Я привожу вариант настроек для /etc/sysconfig/iptables.
# Выдержки из файла конфигурации *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT DROP [0:0] # Создаем два новых канала :input_ext - [0:0] :input_int - [0:0] -A INPUT -i lo -j ACCEPT # Пакеты с адресами внутренней сети не имеют права выходить во внешние каналы -A OUTPUT -s 192.168.0.0/255.255.255.0 ! -o eth0 -j DROP # Эти строки разрешают уже открытые соединения -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT # Перенаправляем входящие пакеты с различных интерфейсов в разные каналы -A INPUT -i eth0 -j input_int -A INPUT -i ! eth0 -j input_ext # Ловушки для взломщиков SSH -A input_ext -p tcp -m state --state NEW --dport 22 -m recent --name sshattack --set -A input_ext -p tcp -m state --state ESTABLISHED --tcp-flags FIN,ACK FIN,ACK --dport 22 -m recent --name sshattack --set -A input_ext -p tcp -m state --state ESTABLISHED --tcp-flags RST RST --dport 22 -m recent --name sshattack --set -A input_ext -m recent --name sshattack --update --seconds 60 --hitcount 4 -m limit --limit 4/minute -j LOG --log-prefix SSH_attack:_ -A input_ext -m recent --name sshattack --update --seconds 60 --hitcount 4 -j DROP # Ловушки для сканеров (на этих портах дежурит portcentry) -A input_ext -p tcp -m tcp --dport 1 -j ACCEPT -A input_ext -p tcp -m tcp --dport 7 -j ACCEPT -A input_ext -p tcp -m tcp --dport 15 -j ACCEPT -A input_ext -p udp -m udp --dport 1 -j ACCEPT -A input_ext -p udp -m udp --dport 7 -j ACCEPT -A input_ext -p udp -m udp --dport 15 -j ACCEPT -A input_ext -p tcp -m tcp --dport 23 -j ACCEPT # Рабочие порты (тут дежурят настоящие сервисы) -A input_ext -p tcp -m tcp --dport 25 -j ACCEPT -A input_ext -p tcp -m tcp --dport 22 -j ACCEPT -A input_ext -p tcp -m tcp --dport 993 -j ACCEPT # Все, в чем я не уверен... Может быть это параноя... -A input_ext -p tcp -m tcp --dport 21 -j DROP -A input_ext -p tcp -m tcp --dport 80 -j DROP -A input_ext -p tcp -m tcp --dport 111 -j DROP -A input_ext -p tcp -m tcp --dport 113 -j DROP -A input_ext -p tcp -m tcp --dport 135 -j DROP -A input_ext -p tcp -m tcp --dport 139 -j DROP -A input_ext -p tcp -m tcp --dport 143 -j DROP -A input_ext -p tcp -m tcp --dport 389 -j DROP -A input_ext -p tcp -m tcp --dport 445 -j DROP -A input_ext -p tcp -m tcp --dport 621 -j DROP -A input_ext -p tcp -m tcp --dport 631 -j DROP -A input_ext -p tcp -m tcp --dport 653 -j DROP -A input_ext -p tcp -m tcp --dport 2000 -j DROP
Более подробно почитайте на странице, подготовленной Виталием Липатовым.
Настраиваем сервисы
SSH
Минимально нужно ограничить вход в систему для пользователей, которым это не нужно. Оставим только того, кто реально может и должен иметь доступ (и ограничим скорость попыток подключений), и/или установим/настроим дополнительно sshutout.
# cat /etc/openssh/sshd_config ... AllowUsers yourname AllowGroups wheel DenyUsers bin nobody sys DenyGroups users ... MaxStartups 3:50:6 PermitRootLogin no ...
По минимуму, все … Далее, имеет смысл правильно настроить ваш почтовый сервер, для того, чтобы через него не рассылали спам, но это уже другая статья (в дистрибутивах ALT Linux, в конфигурации по умолчанию, почтовик не смотрит в Интернет).