Базовая защита Linux сервера (часть 2)

27/01/2019


В первой части статьи о безопасности сервера Linux я расписал то, как мы защищаем пользователей в системе, их пароли, а также сервис SSH. В этой части остановимся на фаерволе и защите сетевых сервисов от атак типа брут форса. Объединив все это вместе, мы получим общую картину защиты операционной системы от попыток взлома из вне. Для себя уже давно усвоил, что этими настройками нужно обеспечивать любой свой Linux сервер в Интернете, если хочется спать спокойно. Про настройки безопасности отдельных приложений, я думаю, мы поговорим отдельно в дальнейшем.

Персональный фаервол каждого сервера Linux, да и не только сервера, обеспечивается с помощью пакета iptables. В ряде дистрибутивов уже есть определенные готовые настройки для фаервола. Но, к сожалению, далеко не во всех, и, как правило, системному администратору приходится самому настраивать правила iptables. Я думаю, эти знания нужны любому квалифицированному инженеру IT. Функционал iptables очень широк и позволяет создавать из бокса с линуксом очень неплохой маршрутизатор с возможностями NAT и фильтрации пакетов. В контексте данной статьи iptables будет использоваться для фильтрации входящих и исходящих сетевых пакетов.

Фаервол на базе iptables

Перейдем непосредственно к настройкам iptables. Создадим отдельный файл с настройками файрвола — /etc/iptables.start. Пример данного файла приводится ниже:

#!/bin/bash

IPTABLES="/sbin/iptables"

#clear iptables
$IPTABLES -F
$IPTABLES -X

#set default policy to drop
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

#accept everything no matter port on localhost
$IPTABLES -A INPUT -i lo -j ACCEPT


#allow established connections
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#allow input on port 12345 SSH
$IPTABLES -A INPUT -p tcp --dport 12345 -j ACCEPT

#allow traffic going to specific inbound ports
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 443 -j ACCEPT

#allow traffic going to specific outbound ports
$IPTABLES -A OUTPUT -p udp --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p udp --dport 123 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 25 -j ACCEPT 

Данный файл является исполняемым bash скриптом. Поэтому добавляем ему разрешение на выполнение с помощью команды #chmod +x /etc/iptables.start. Также хотелось бы обратить внимание, что путь у команды, выполняемой в скрипте, крайне желательно указывать полный. В противном случае, при исполнении скрипта возможны подмены команд злоумышлениками с помощью переменых ENV.

Данный скрипт может быть взят за основу фаервола для любого Linux сервера. Мы в нем разрешаем весь трафик на loopback интерфейс, а также SSH трафик по 12345 порту плюс входящий и исходящий трафик по ряду TCP & UDP портов.

Теперь создадим init скрипт — /etc/init.d/firewall.sh, который будет запускать и останавливать правила фаервола в системе. Для Ubuntu он приведен ниже:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          server firewall
# Required-Start:    $local_fs $remote_fs $network $syslog $named
# Required-Stop:     $local_fs $remote_fs $network $syslog $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# X-Interactive:     true
# Short-Description: telegram_bot
# Description:       Start the telegram_bot
#  This script will start the telegram_bot.
### END INIT INFO
IPTABLES="/sbin/iptables"

case "$1" in
    start|restart)
        echo -n "Loading Firewall's Packet Filters\n"
        /etc/iptables.start
        ;;

    stop)
        echo -n "Stopping the firewall (in a closed state)!\n"
        $IPTABLES --flush
        $IPTABLES -X
        $IPTABLES -P INPUT ACCEPT
        $IPTABLES -P OUTPUT ACCEPT
        $IPTABLES -P FORWARD ACCEPT
        ;;

    *)
        echo "Usage: /etc/init.d/firewall.sh {start|stop|restart}"
        exit 1
        ;;

esac
exit 0 

Также делаем этот скрипт исполняемым с помощью команды #chmod +x /etc/init.d/firewall.sh, а также прописываем его в сервисах командой #update-rc.d firewall.sh defaults. Теперь правила фаервола будут автоматически загружаться при старте системы. А мы сможем управлять ими через команду service.

Защита от брут форса с помощью fail2ban

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

В Ubuntu установка выполняется предельно просто — #apt-get install fail2ban. В результате мы получим установленный сервис. Файлы конфигурации сервиса находятся в папке /etc/fail2ban/. Нам нужен конфигурационный файлик — jail.conf. Вносим в него следующие изменения:

[sshd]
port    = 12345
logpath = %(sshd_log)s
maxretry = 6
filter = sshd 
enabled = true

Перезапускаем сервис fail2ban и теперь наш ssh доступ защищен от брут форс атак. Параметр maxretry определяет количество попыток с неверным логином/паролем, после чего ip адрес будет заблокирован. Донастраиваем в файле jail.conf параметры отправки уведомлений. Еще раз перезапускаем сервис. И на этом все. Наша защита настроена.

Резюме

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *