Настало время более детально познакомиться с предустановленным в систему Ubuntu 12.04 фаерволом, а именно ufw (Ubuntu Firewall) который является некой оберткой для iptables.
Просто с первого взгляда да и не сильного знакомства с iptables – работа с ним превращается в недопонимание, как строить правила, как ими управлять. Но это процесс времени, можно и нужно попрактиковаться некоторое время и трудностей больше не будет. А сейчас я пока разберусь, хоть и кратко, но для меня это будет более чем достаточно:
ekzorchik@srv-serv:~$ apt-cache search ufw
ufw – program for managing a Netfilter firewall
gufw – graphical user interface for ufw
из вывода становится понятно, что если у Вас используется серверная часть (т. е. Без GUI) то нужно использоваться ufw в противном случае для Desktop – gufw, сейчас в рамках данной заметки я буду рассматривать без gui – так я по крайнем мере лучше понимаю, да и просто мне нравится все делать своими руками, а не щелкать кнопочки (+ практикуюсь набором слепой печати).
ekzorchik@srv-serv:~$ sudo apt-get install ufw
По умолчанию в системе Ubunu 12.04 – фаервол выключен, будем исправлять это дело придерживаясь принципа: все запретить, а разрешить только нужное.
ekzorchik@srv-serv:~$ sudo ufw status
Status: inactive
На заметку:
Хочу предупредить если к системе вы подключаетесь через программу putty,winscp то советую сперва настроить правила, а уже потом включить ufw – в противном случае легко может оказаться, что доступ Вы потеряете.
ekzorchik@srv-serv:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Также можно включить использование ufw через правку конфигурационного файла:
ekzorchik@srv-serv:~$ sudo cat /etc/ufw/ufw.conf | grep -v '^#'
ENABLED=yes
LOGLEVEL=off
На заметку: если система выступает в роли шлюза (как правило имеется 2 и более сетевых адаптеров), то нужно активировать для ufw возможность пересылки пакетов из внутренней сети в другую и обратно:
ekzorchik@srv-serv:~$ sudo nano /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"
или по другому внеся изменения в ekzorchik@srv-serv:~$ sudo nano /etc/ufw/sysctl.conf
net/ipv4/ip_forward=1
ekzorchik@srv-serv:~$ sudo sysctl -p
потому как настройка в /etc/ufw/sysctl.conf перекрывает настройки заданные в /etc/sysctl.conf, чтобы сделать наоборот следует:
ekzorchik@srv-serv:~$ sudo nano /etc/ufw/ufw.conf
IPT_SYSCTL=/etc/sysctl.conf
Сохранить внесенные изменения и перезапустить ufw
ekzorchik@srv-serv:~$ sudo ufw reload
Т.к. я нигде пока не использую ipv6 (ведь ранее даже разбирал, как отключить поддержку для всех системы), то также выключу и в ufw:
ekzorchik@srv-serv:~$ sudo nano /etc/default/ufw
IPV6=no
- Запретим доступ к системе из вне: (правило применяется сразу же)
ekzorchik@srv-serv:~$ sudo ufw default deny
Default incoming policy changed to ‘deny’
(be sure to update your rules accordingly)
- Просто включить доступ к системе на определенные порты: (откуда угодно)
ekzorchik@srv-serv:~$ sudo ufw allow ssh
Rule added
ekzorchik@srv-serv:~$ sudo ufw allow http
Rule added
ekzorchik@srv-serv:~$ less /etc/services | grep ssh
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp
- поэтому зная название сервиса из файла /etc/services можно включать и отключать доступ:
ekzorchik@srv-serv:~$ less /etc/services
ekzorchik@srv-serv:~$ sudo ufw deny ftp
Rule added
- Запретим прощупывание системы посылкой ICMP запросов (т. е. Использование команды ping, по умолчанию в системе ufw разрешает такие запросы)
ekzorchik@srv-serv:~$ sudo nano /etc/ufw/before.rules
# ok icmp codes
-A ufw-before-input -p icmp –icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp –icmp-type source-quench -j ACCEPT
-A ufw-before-input -p icmp –icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp –icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp –icmp-type echo-request -j ACCEPT
чтобы запретить изменяем ACCEPT на DROP и не забываем сохранить внесенные изменения и перечитать настройки ufw (sudo ufw reload)
- Теперь разрешим доступ к системе с определенного ip адреса на порт 22:
ekzorchik@srv-serv:~$ sudo ufw allow to 192.168.1.50 port 22 from 192.168.1.58 proto tcp
Rule added
- ,а если нужно сделать доступ из всего диапазона локальной сети, то так:
(добавляем перед уже существующим правилом новое, после удаляем предшествующее — можно можно сделать как-то по другому я пока не разобрался, но все в процессе: – через некоторое время стало понятно как это сделать по простому, просто отменить предыдущее правило:
ekzorchik@srv-serv:~$ sudo ufw delete allow to 192.168.1.50 port 22 from 192.168.1.58 proto tcp
)
ekzorchik@srv-serv:~$ sudo ufw insert 1 allow to 192.168.1.50 port 22 from 192.168.1.0/24 proto tcp
Rule inserted
ekzorchik@srv-serv:~$ sudo ufw status numbered
Status: active
To Action From
— —— —-
[ 1] 192.168.1.50 22/tcp ALLOW IN 192.168.1.0/24
[ 2] 192.168.1.50 22/tcp ALLOW IN 192.168.1.58
ekzorchik@srv-serv:~$ sudo ufw delete 2
Deleting:
allow from 192.168.1.58 to 192.168.1.50 port 22 proto tcp
Proceed with operation (y|n)? y
Rule deleted
По такому же принципу можно делать и для других портов (25,565,110,993,8080 и т. д.)
- Включаем логирование: (для всех соединений с указанными настройки информативности)
ekzorchik@srv-serv:~$ sudo ufw logging on
После чего нужно обновить файрвол перезагрузкой ufw:
ekzorchik@srv-serv:~$ sudo ufw reload
Firewall reloaded
- Отобразить содержимое лога работы ufw можно так:
ekzorchik@srv-serv:~$ sudo tail -f /var/log/ufw.log
, но порой не всегда нужно логировать все и вся, достаточно сузить область поиска к примеру только для ssh соединений к текущему серверу:
ekzorchik@srv-serv:~$ sudo ufw allow log 22/tcp
Rule added
ekzorchik@srv-serv:~$ sudo ufw reload
Firewall reloaded
еще одно но — по умолчанию уровень логирования принимает значение «low”
Синтаксис изменения уровня логирования:
ekzorchik@srv-serv:~$ sudo ufw logging low
Logging enabled
На заметку: уровни логирования
- off – логирование отключено
ekzorchik@srv-serv:~$ sudo ufw logging off
Logging disabled
- low – логировать только блокируемые пакеты, а также правила для которых активировано логирование
- medium – то же что и low плюс все разрешенные пакеты
- high – low + medium и все пакеты rate limiting
- full – high, но без rate limiting
К примеру текущий размер логов, а это я только включил:
ekzorchik@srv-serv:~$ sudo dir -sh /var/log/ufw.log
60K /var/log/ufw.log
На заметку: следует побеспокоить об включенной опции ротации файлов журнала, т. к. при значительном уровне логирования место на системе можен как бы невзначай закончиться.
- Разрешим доступ к текущей системе (полный доступ) с определенного IP адреса: (т. е. Доступ к Ubuntu 12.04.5 Server amd64 с Windows станции IP адрес которой 192.168.1.58)
ekzorchik@srv-serv:~$ sudo ufw allow from 192.168.1.58
Rule added
- Отобразить текущие правила:
ekzorchik@srv-serv:~$ sudo ufw status numbered
Status: active
To Action From
— —— —-
[ 1] Anywhere ALLOW IN 192.168.1.58
- Удалить правило:
ekzorchik@srv-serv:~$ sudo ufw delete 1
Deleting:
allow from 192.168.1.58
Proceed with operation (y|n)? y
Rule deleted
Еще интересным при использовании UFW является возможность использовать профили приложений, в которых можно использовать только те порты которые которые нужны для работы того или иного приложения:
- Отобразить все профили приложений:
ekzorchik@srv-serv:~$ sudo ufw app list
Available applications:
OpenSSH
- Отобразить информацию по профилю OpenSSH:
ekzorchik@srv-serv:~$ sudo ufw app info OpenSSH
Profile: OpenSSH
Title: Secure shell server, an rshd replacement
Description: OpenSSH is a free implementation of the Secure Shell protocol.
Port:
22/tcp
- Местонахождение профилей:
ekzorchik@srv-serv:~$ ls -l /etc/ufw/applications.d/
Cинтаксис профиля OpenSSH приложения
ekzorchik@srv-serv:~$ cat /etc/ufw/applications.d/openssh-server
[OpenSSH]
title=Secure shell server, an rshd replacement
description=OpenSSH is a free implementation of the Secure Shell protocol.
ports=22/tcp
- Создам профиль с именем Web:
ekzorchik@srv-serv:~$ sudo cp -r /etc/ufw/applications.d/openssh-server /etc/ufw/applications.d/web
ekzorchik@srv-serv:~$ sudo nano /etc/ufw/applications.d/web
[Web]
title=Web server (LAMP)
description=Web Server (LAMP).
ports=80,81,82/tcp|8080/tcp
- Активирую созданный профиль Web:
ekzorchik@srv-serv:~$ sudo ufw allow Web
Rule added
- Выключить созданный профиль Web:
ekzorchik@srv-serv:~$ sudo ufw deny Web
- Отобразить информацию по профилю Web:
ekzorchik@srv-serv:~$ sudo ufw app info Web
Profile: Web
Title: Web server (LAMP)
Description: Web Server (LAMP).
Ports:
80,81,82/tcp
8080/tcp
- Таким образом имея настроенные профили можно задействовать их для предоставления доступа определенному адресу с сервисам сервера на основе профиля, к примеру предоставляю для определенного IP адреса возможность подключать к порту 80 для доступа допустим к сервису: Zabbix, Asterisk:
ekzorchik@srv-serv:~$ sudo ufw allow from 192.168.1.58 to 192.168.1.50 app Web
Rule added
ekzorchik@srv-serv:~$ sudo ufw status | grep Web
192.168.1.50 Web ALLOW 192.168.1.58
На заметку: чтобы запретить доступ к системе определенным IP адресам то сперва нужно сделать правило запрета, а потом правило разрешения — потом как приоритет у правил запрета выше чем у правил разрешения, к примеру запретим доступ по порту Web для определенных IP адресов, но разрешим для всех остальных:
ekzorchik@srv-serv:~$ sudo ufw deny from 192.168.1.2 to any port 22
Rule added
ekzorchik@srv-serv:~$ sudo ufw deny from 192.168.1.3 to any port 22
Rule added
ekzorchik@srv-serv:~$ sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
Rule added
- Еще есть возможность принудительно запретить из системы/сети запросы из во вне:
ekzorchik@srv-serv:~$ sudo ufw default deny outgoing
Default outgoing policy changed to ‘deny’
(be sure to update your rules accordingly)
ekzorchik@srv-serv:~$ ping ya.ru
ping: unknown host ya.ru
, т. е. Придется прописывать кому и куда можно ломиться во вне, но это я считаю порой очень затруднительно определить, поэтому возвращаю обратно настройки:
ekzorchik@srv-serv:~$ sudo ufw default allow outgoing
Default outgoing policy changed to ‘allow’
(be sure to update your rules accordingly)
Также можно сделать систему более защищенной в плане доступности:
1) Запретиь все входящие запросы
ekzorchik@srv-serv:~$ sudo ufw default deny incoming
2) Запретить все исходящие запросы
ekzorchik@srv-serv:~$ sudo ufw default deny outgoing
3) Разрешить все входящие соединения на порт 22
ekzorchik@srv-serv:~$ sudo ufw allow in 22/tcp
4) Разрешить все исходящие соединения с порт 22
ekzorchik@srv-serv:~$ sudo ufw allow out 22/tcp
В итоге типовой шаблон правил для моей системы выглядит следующим образом:
- ekzorchik@srv-serv:~$ sudo ufw default deny incoming
- ekzorchik@srv-serv:~$ sudo ufw default allow outgoing
- ekzorchik@srv-serv:~$ sudo ufw allow in 22/tcp
- ekzorchik@srv-serv:~$ sudo ufw enable
- запретить все ping запросы к системе
- ekzorchik@srv-serv:~$ sudo nano /etc/ufw/before.rules
# ok icmp codes
-A ufw-before-input -p icmp –icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp –icmp-type source-quench -j ACCEPT
-A ufw-before-input -p icmp –icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp –icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp –icmp-type echo-request -j ACCEPT
чтобы запретить изменяем ACCEPT на DROP и не забываем сохранить внесенные изменения
- ekzorchik@srv-serv:~$ sudo nano /etc/default/ufw
IPV6=no
- ekzorchik@srv-serv:~$ sudo ufw reload
В итоге результирующая информацию по правила следующая:
ekzorchik@srv-serv:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
To Action From
— —— —-
22/tcp ALLOW IN Anywhere
Конечно же по описанному в этой заметки нельзя охватить всех возможностей данного фронтенда, но как известно нужно начинать с малого и постепенно увеличивать сложность. Вот и я этой заметкой только начал его использование. Вывел базовые настройки по обеспечению безопасности системы, уж лучше хоть никакая но защита чем ее остутствие, поэтому считаю данную заметку завершенной и работоспособной, до встречи с уважением автор блога — ekzorchik.