Server Security

Материал из ALT Linux Wiki
(перенаправлено с «Bezopasnost»)
42px-Wikitext-ru.svg.png
Эту статью следует викифицировать.
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Краткие заметки по минимальной защите сервера

На написание данного черновика навел меня вопрос в рассылке:

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, в конфигурации по умолчанию, почтовик не смотрит в Интернет).