Итак, имеем доступ к сайту компании для различных нужд с использованием сервиса 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 соединение установлено.

Статус: Авторизовались

Статус: Получение списка каталогов...

Статус: Список каталогов "/" извлечен

Это кстати опыт. Решения вот таких вот проблем.

При написание данной заметки участвовали мои наработки из

Итого, я составил для себя пошаговую заметку по базовой настройке ограничения доступа к системе Ubuntu 18.04 на которой у меня сайт (Nginx) + (FTP передача данных) + доступ только из доверенной сети.

На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.