Итак, имеем доступ к сайту компании для различных нужд с использованием сервиса ProFTPD:
а для безопасности передаваемых данных используется самоподписанный сертификат и только с ним возможно подключение, без него ни как. Но разве это все меры? — Ответ, нет! Самым важным я считаю — это использование брандмауэера, а вот какой выбрать голый iptables
или надстройку. Я за удобство, простоту и опыт использования. Я работаю с ufw & firewall-cmd.
Моя защита строится на следующем принципе, доступ к серверу только с доверенных адресов и только для сервисов с которыми из вне взаимодействуешь.
Шаг №1:
Устанавливаю firewall-cmd
в текущую систему Ubuntu 18.04 Server:
ekzorchik@srv-bionic:~$ sudo ufw disable Firewall stopped and disabled on system startup ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo apt-get install -y firewalld ekzorchik@srv-bionic:~$ sudo systemctl enable firewalld ekzorchik@srv-bionic:~$ sudo systemctl start firewalld ekzorchik@srv-bionic:~$ sudo firewall-cmd --state running ekzorchik@srv-bionic:~$
Шаг №2:
Изменяю зону, в ней доступ ограничивается только прописанными настройками:
ekzorchik@srv-bionic:~$ ip r | awk '{print $5}' | head -n1 ens18 ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone public --change-interface=ens18 --permanent success ekzorchik@srv-bionic:~$
Шаг №3:
Проверяю настройки зоны public:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --list-all public target: default icmp-block-inversion: no interfaces: sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Шаг №4:
Отобразить список всех сервисов которые могут быть поставлены на защиту:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --get-service
Шаг №5:
Включаю взаимодействие с этой системой только для сервисов которые есть у меня, если сервис уже присутствует, то его добавление будет проигнорировано.
ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-service={http,https,ftp,ssh} --permanent Warning: ALREADY_ENABLED: ssh success ekzorchik@srv-bionic:~$
пока добавляю http
, как только активирую работу через сертификат Let's Encrypt
, сервис можно будет деактивировать.
На заметку: Если Вы используете недефолтные порты для сервисов, как например ssh, то тогда сервис не указываете в «Шаг №5
«, а задействуете команду:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-port=22222/tcp --permanent
Шаг №6:
Добавляю разрешающее правило на взаимодействие с сервисом ftp & ssh
только из доверенной сети, как правило это статический WAN-IP
адрес офисной сети или если сервис в локальной сети ограничиваем нужной подсетью или адресами:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" service name="ftp" source address="172.33.33.0/24" accept' --permanent success ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" service name="ssh" source address="172.33.33.0/24" accept' --permanent success
На заметку: Чтобы удалить порт или сервис, здесь все просто заменяем если при добавлении пишем --add
, то наоборот --remove
.
Если же сервис, SSH
у Вас не на 22
порту, то правило на доступ:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" port port="22222" protocol="tcp" source address="172.33.33.0/24" accept' --permanent
Если нужно удалить правило выше:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" port port="22222" protocol="tcp" source address="172.33.33.0/24" accept' --permanent
А дефолтный доступ к сервису SSH
на порт 22/tcp
удаляем:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --remove-service=ssh --permanent success ekzorchik@srv-bionic:~$ sudo firewall-cmd --reload
Шаг №7:
Чтобы изменения применились: (Это самая важная команда после указания всех правил)
ekzorchik@srv-bionic:~$ sudo firewall-cmd --reload
На заметку: Если вы тестируете правила, то ключ «--permanent
» для активации на постоянной основе не указываете или указываете. Мой также совет: сперва в тестовых условиях обкатываете правила, а только после переносите их на боевое.
Шаг №8:
Итак пример правил на доступ из вне:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone public --change-interface=ens18 --permanent ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-service={http,https} --permanent ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" service name="ssh" source address="172.33.33.0/24" accept' --permanent ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" service name="ftp" source address="172.33.33.0/24" accept' --permanent ekzorchik@srv-bionic:~$ sudo firewall-cmd --remove-service=ssh --permanent ekzorchik@srv-bionic:~$ sudo firewall-cmd --remove-service=ftp --permanent ekzorchik@srv-bionic:~$ sudo firewall-cmd --reload
Шаг №9:
Отобразить текущие правила:
ekzorchik@srv-bionic:~$ firewall-cmd --zone=public --list-all Authorization failed. Make sure polkit agent is running or run the application as superuser. ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: ens18 sources: services: dhcpv6-client http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="172.33.33.0/24" service name="ftp" accept rule family="ipv4" source address="172.33.33.0/24" service name="ssh" accept ekzorchik@srv-bionic:~$
Как видите, доступ к системе беспрепятственно возможен только через сервисы http & https
, а для всех остальных только из указанной подсети.
В выводе выше присутствует сервис dhcpv6-client
, это нормально ,так моя система развернута в локальной сети и она получила динамический адрес. Во вне этот сервис удаляете:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --remove-service=dhcpv6-client --permanent success ekzorchik@srv-bionic:~$ sudo firewall-cmd --reload
На заметку: Доступ к системе на основе подсетей рекомендуется указывать, если один статический IP
то маска /32
, в других случаях смотрится какой пул адресов выдал Вам провайдер с указанной маской подсети.
Шаг №10:
Вывожу на консоль текущие правила:
ekzorchik@srv-bionic:~$ sudo firewall-cmd --zone=public --list-all public (active) target: default icmp-block-inversion: no interfaces: ens18 sources: services: http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="172.33.33.0/24" service name="ftp" accept rule family="ipv4" source address="172.33.33.0/24" service name="ssh" accept ekzorchik@srv-bionic:~$
Шаг №11:
Проверяю, а смогу ли подключиться к этой системе за брандмауэром из другой сети:
ekzorchik@srv-nas:~$ ssh -l ekzorchik 172.33.33.21 -p 22 ssh: connect to host 172.33.33.21 port 22: No route to host ekzorchik@srv-nas:~$ ftp 172.33.33.21 21 ftp: connect: No route to host ftp> ekzorchik@srv-nas:~$ sudo nmap 172.33.33.21 -p 21,22 Starting Nmap 6.40 ( http://nmap.org ) at 2020-04-08 22:49 MSK Nmap scan report for 172.33.33.21 Host is up (0.00079s latency). PORT STATE SERVICE 21/tcp filtered ftp <- доступ к портам фильтруется 22/tcp filtered ssh <- доступ к портам фильтруется Nmap done: 1 IP address (1 host up) scanned in 0.57 seconds ekzorchik@srv-nas:~$
Как видно блокировка не из разрешенных сетей отработала.
Шаг №12:
Обязательно стоит проверить все сервисы, как они себя ведут с учетом настроенных правил, вот к примеру я же использую сервис ProFTPD + SSL/TLS
. Открываю клиент filezilla
, пробую соединиться из сети 172.33.33.0/24
и получаю:
Статус: Соединяюсь с 172.33.33.21:21...
Статус: Соединение установлено, ожидание приглашения...
Статус: Инициализирую TLS...
Статус: Проверка сертификата...
Статус: TLS соединение установлено.
Статус: Авторизовались
Статус: Получение списка каталогов...
Команда: PWD
Ответ: 257 "/" is the current directory
Команда: TYPE I
Ответ: 200 Type set to I
Команда: PASV
Ответ: 227 Entering Passive Mode (172,33,33,21,196,5).
Команда: MLSD
Ошибка: Соединение передачи данных не может быть установлено: EHOSTUNREACH - Отсутствует маршрут к хосту
Ошибка: Соединение прервано после 20 секунд неактивности
Ошибка: Не удалось получить список каталогов
Разбираюсь, что не так и как это дело поправить. Помнится, я в конфигурационном файле /etc/proftpd/proftpd.conf
указывал диапазон пассивных портов:
PassivePorts 49152 65534
значит этот диапазон мне также нужно открыть для доверенной сети 172.33.33.0/24
ekzorchik@srv-bionic:~$ sudo firewall-cmd --add-rich-rule 'rule family="ipv4" port port="49152-65534" protocol="tcp" source address="172.33.33.0/24" accept' --permanent success ekzorchik@srv-bionic:~$ sudo firewall-cmd --reload success ekzorchik@srv-bionic:~$
Шаг №13:
Проверяю, будет ли теперь соединение к ProFTPD
только к FTP
через TLS
используя клиент filezilla
— Ответ да! — Это при добавленном правиле «Шаг №12
»
Статус: Соединяюсь с 172.33.33.21:21...
Статус: Соединение установлено, ожидание приглашения...
Статус: Инициализирую TLS...
Статус: Проверка сертификата...
Статус: TLS соединение установлено.
Статус: Авторизовались
Статус: Получение списка каталогов...
Статус: Список каталогов "/" извлечен
Это кстати опыт. Решения вот таких вот проблем.
При написание данной заметки участвовали мои наработки из
- Как настраивается firewall-cmd on Ubuntu 18.04
- Защита через Firewall-cmd системы Ubuntu 18.04 Server
Итого, я составил для себя пошаговую заметку по базовой настройке ограничения доступа к системе Ubuntu 18.04
на которой у меня сайт (Nginx)
+ (FTP
передача данных) + доступ только из доверенной сети.
На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.