Начиная с версии 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
URL: http://chooselinux.org.ua/nastrojka-ufw-v-ubuntu/
Обсуждается: http://www.opennet.dev/tips/info/2280.shtml