Начиная с версии Ubuntu 8.04 в ее состав по умолчанию включена новая упрощенная
оболочка для работы с файрволом - ufw (Uncomplicated firewall -
"незамысловатый" брэндмауер). Как известно Linux по умолчанию имеет очень
мощный встроенный сетевой фильтр - netfilter.
Стандартной утилитой для управления настройками netfilter является утилита
iptables. Ufw создан для того чтобы сделать более простым настройку
netfilter-а. По сути ufw - это скрипт, который получает команды в одном формате
и преобразует их в формат iptables.
Так как ufw является упрощенной утилитой настройки файрвола, он так же является
и более ограниченным в своих возможностях по сравнению с iptables. Практика
показывает что большинству пользователей вполне достаточно функционала который
предоставляет ufw. В то же время, в случае необходимости всегда можно дописать
нужное правило с помощью iptables.
Функционал ufw
Основными функциями файрвола ufw является:
1. Работа в одном из двух режимов: разрешено все кроме того что описано
правилами, запрещено все, кроме описанного правилами.
2. Создание правил для фильтрации пакетов с действиями allow, deny, reject
3. Создание правил с учетом адреса и порта получателя и отправителя, используемого протокола
4. Логирование пакетов подпадающих под правило
5. Блокировка частых неправильных попыток авторизации по ssh
6. Настраиваемые профили для приложений
Запуск ufw
Ufw может быть включен или выключен системным администратором сервера, для
этого используется команд:
# ufw enable
Межсетевой экран активен и будет запущен при запуске системы
# ufw disable
Файрвол остановлен и деактивирован при загрузке
Просматривать состояние можно с помощью команды:
# ufw status [numbered]
Status: active
Параметр numbered может быть использован для отображения правил файрвола с
соответствующей нумерацией.
Изменение политики по умолчания:
# ufw default allow [in|out]
# ufw default deny [in|out]
# ufw default reject [in|out]
Где allow подразумевает что все пакеты будут пропущены, кроме тех, для которых
есть запрещающее правило: deny - все пакеты будут заблокированы, кроме
тех, для которых есть разрешающие правила; reject - все пакеты будут
заблокированы с соответствующим уведомлением подключающуюся сторону.
Параметры in|out указывают для какого направления мы хотим применять политику,
для входящих или исходящих пакетов соответственно.
Управление правилами осуществляется с помощью команд allow, deny, reject, delete, insert.
allow - добавить разрешающее правило
deny - добавить запрещающее правило (файрвол не предпринимает действий при попадании в это правило)
reject - добавить запрещающее правило (файрвол даст знать подключающемуся что этот порт закрыт)
limit - добавляет ограничивающее правило для указанного порта. В случае если с
одного и того же адреса в течении 30 секунд будет произведено 6 и более
неуспешных попыток авторизации в службу удаленного доступа ssh, ufw заблокирует
удаленный адрес.
delete - удалить добавленное ранее правило
insert - вставить правило в определенную позицию в цепочке
Построение правил файрвола
Конструкция построения правил
ufw allow|deny|reject|limit [in|out on INTERFACE] [log|log-all] [proto protocol] \
[from ADDRESS [port PORT]] [to ADDRESS [port PORT]]
Подробнее о параметрах:
allow|deny|reject|limit - указываем что будет делать это правило (см. описание выше).
[in|out on INTERFACE] - указываем будет это правило относится к входящему
трафику (in) или исходящему (out) и хотим ли мы ограничить данное правило
отдельным сетевым интерфейсом (к примеру eth0).
[log|log-all] - при желании можно логировать события которые подпадают под
правило. По умолчанию лог пишется в /var/log/syslog. При использовании опции
log - в файл будут записаны лишь пакеты участвующие при установке соединения с
сервером. Используя опцию log-all в лог файл будут записаны все пакеты
подпадающие под правило.
[proto protocol] - в правиле можно указать для какого протокола оно действует: tcp или udp.
[from ADDRESS [port PORT]] - адрес и порт источника пакета
[to ADDRESS [port PORT]] - адрес и порт получателя пакета
Профили приложений
Ufw позволяет создавать профили приложений. в которых можно указать все порты
которые используются и удобно добавлять их в правила. Так к примеру можно
создать профиль для веб-сервера Apache, указав что слушает он 80 и 443 порты по
протоколу tcp.
Профили приложений являются текстовыми файлами и могут быть отредактированы
любым текстовым редактором. все файлы хранятся в директории /etc/ufw/applications.d:
root@server:/etc/ufw/applications.d# pwd
/etc/ufw/applications.d
root@server:/etc/ufw/applications.d# ls -l
-rw-r--r-- 1 root root 406 2009-11-13 00:52 apache2.2-common
-rw-r--r-- 1 root root 145 2009-10-22 22:50 openssh-server
-rw-r--r-- 1 root root 241 2009-09-22 16:52 postfix
Рассмотрим пример профиля приложения apache2.2-common:
[Apache]
title=Web Server
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80/tcp
[Apache Secure]
title=Web Server (HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=443/tcp
[Apache Full]
title=Web Server (HTTP,HTTPS)
description=Apache v2 is the next generation of the omnipresent Apache web server.
ports=80,443/tcp
В одном файле может находится несколько профилей. В данном примере 3: Apache,
Apache Secure, Apache Full. Структура записей проста: сначала имя профиля в
квадратных скобка ([Apache Full]), далее развернутое наименования приложения,
далее описание приложения и список портов с указанием протокола которые
задействованы в профиле (80,443/tcp).
Вывести список профилей можно с помощью команды:
# ufw app list
Доступные приложения:
Apache
Apache Full
Apache Secure
OpenSSH
Postfix
Postfix Submission
Детальную информацию по профилю можно просмотреть с помощью команды:
# ufw app info OpenSSH
|Профиль: OpenSSH
|Название: Secure shell server, an rshd replacement
|Описание: OpenSSH is a free implementation of the Secure Shell
protocol.
|Порт: 22/tcp
После добавления или изменения профиля приложения (в файле) необходимо дать
знать файрволу о новом профиле:
# ufw app update OpenSSH
Для того чтобы новый профиль сразу вступил в силу, необходимо добавить опцию --add-new:
# ufw app update --add-new OpenSSH
По умолчанию добавленные с помощью --add-new профили не будут обрабатываться
файрволом. Рекомендуется вначале задать политику для новых профилей приложений:
ufw app default allow|deny
После чего все новые профили приложений будут добавляться в цепочку файрвола с указанной политикой.
Использовать профили приложений можно также при создании обычных правил, например:
# ufw allow OpenSSH
Настройка профиля безопасности
1. Ограничение входящих подключений к FTP и Веб серверу
Пример настройки файрвола для ситуации, когда необходимо заблокировать доступ к
FTP и Веб серверу с адреса 192.168.100.100. В примере 192.168.1.11 - сервер на
котором настраивается файрвол:
# ufw deny proto tcp from 192.168.100.100 to 192.168.1.11 port 21,80
Правило добавлено
# ufw status
|Статус: активно
|До Действие От
---- --------------------
192.168.1.11 21,80/tcp DENY 192.168.100.100
Теперь при попытках подключения с хоста 192.168.100.100 к 21 или 80 порту хоста
192.168.1.11 клиент будет висеть пока не отвалится по таймауту.
Удалим это правило и добавить аналогичное но с действием reject:
# ufw delete deny proto tcp from 192.168.100.100 to 192.168.1.11 port 21,80
# ufw reject proto tcp from 192.168.100.100 to 192.168.1.11 port 21,80
Теперь при попытке подключения к 21 порту сервера удаленный клиент получит
ответ Connection refused:
$ telnet 192.168.1.11 21
Trying 192.168.1.11...
telnet: Unable to connect to remote host: Connection refused
Просканируем порты сервера:
# nmap -sT 192.168.1.100
Starting Nmap 5.00 ( http://nmap.org ) at 2009-12-28 22:56 EET
Interesting ports on 192.168.1.100:
Not shown: 992 closed ports
PORT STATE SERVICE
21/tcp filtered ftp
22/tcp open ssh
80/tcp filtered http
139/tcp open netbios-ssn
445/tcp open microsoft-ds
2323/tcp open unknown
3128/tcp open squid-http
5900/tcp open vnc
MAC Address: 00:18:F3:67:85:9E (Asustek Computer)
Nmap done: 1 IP address (1 host up) scanned in 17.52 seconds
2. Ограничение исходящих подключений к указанному серверу
Цель - запретить исходящие подключения с сервера к адресу 195.214.195.105:
# ufw deny proto tcp to 195.214.195.105
3. Ограничение попыток авторизации по ssh
# ufw limit 22
Произведем несколько попыток подключения к 22 порту сервера с введением
заведомо неправильного пароля:
$ ssh 192.168.1.100
user@192.168.1.100's password:
Permission denied, please try again.
...
$ ssh 192.168.1.100
ssh: connect to host 192.168.1.100 port 22: Connection refused
Как видим после нескольких неудачных попыток файрвол блокирует IP адрес с
которого исходят попытки подключения и в логах появится соответсвтующяя запись:
Dec 28 22:59:13 fortress kernel: [273659.578463] [UFW LIMIT BLOCK]
IN=eth0 OUT= MAC=00:18:f3:67:85:9e:00:26:5e:46:40:86:08:00
SRC=192.168.1.156 DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00
TTL=64 ID=3150 DF PROTO=TCP SPT=33783 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0
4. Логирование пакетов
# ufw allow log 22
С помощью этого правила файрвол будет логировать пакеты установки соединиения
по указанному 22 порту. В логах появятся следующие записи:
Dec 28 23:04:18 fortress kernel: [273964.364715] [UFW ALLOW] IN=eth0
OUT= MAC=00:18:f3:67:85:9e:00:26:5e:46:40:86:08:00
SRC=192.168.1.156 DST=192.168.1.100 LEN=60 TOS=0x00 PREC=0x00
TTL=64 ID=6564 DF PROTO=TCP SPT=58069 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0
|