OpenBSD PF - создание и анализ log-файлов (протоколирование) [FAQ PF - На главную]



Введение

Когда пакет обрабатывается PF, копия его заголовка пересылается на интерфейс pflog(4), к которому добавляется дополнительная информация о интерфейсе, через который прошел пакет, действие, которое пременил PF к этому пакету (pass или block), и др. При помощи pflog user-space программы могут получать logging data из ядра. Если PF включен (enabled) во время загрузки системы, запускается демон pflogd(8). По умолчанию pflogd прослушивает интерфейс pflog0 и записывает все протоколируемые данные в файл /var/log/pflog.

Протоколирование пакетов

Для того чтобы сохранять информацию о пакетах, обработанных PF, используйте параметр (keyword) log. Параметр log говорит о том, что все пакеты, которые попадают под PF правило его содержащее, должны быть занесены в протокол (log-файл). В том случае, когда правило создает состояние, в log-файл будет занесен только первый пакет (тот, который это состояние создал).

Опции, которые могут быть использованы с парамертом (keyword) log:

all
Означает, что все обработанные пакеты, а не только инициализирующий пакет, будут занесены в log-файл. Полезно для правил, которые создают состояния.

to pflogN
Означает, что все обработанные пакеты будут занесены в log-файл при помощи интерфейса pflog(4). Например, при использовании spamlogd(8), весь SMTP трафик будет занесен в log-файл при помощи специального для этого интерфейса pflog. Демону spamlogd можно затем указать, чтобы он прослушивал этот интерфейс. Это позволит оставить основной файл протокола PF свободным от трафика SMTP, который в этом случае не нуждается в протоколировании. Для создания интерфейса pflog используйте ifconfig(8). По умолчанию интерфейс pflog0 создается автоматически.

user
Является UNIX user-id и group-id, который будет владельцем сокета источника/приемника пакета (этот сокет всегда локальный) и будет запротоколирован вместе с остальной стандартной информацией.
Параметры указываются в круглых скобках после log; их может быть несколько - используйте пробел или запятую в качестве разделителя.
pass in log (all, to pflog1) on egress inet proto tcp to egress port 22

Просмотр log-файла

Logfile, создаваемый pflogd, является бинарным файлом, поэтому не может быть прочитан при помощи обычного текстового редактора. Для его просмотра можно использовать tcpdump(8).

Прочитать его содержимое можно вот так:

# tcpdump -n -e -ttt -r /var/log/pflog
Учтите, что при просмотре pflog файла при помощи tcpdump вы не увидете информацию в реальном времени. Просмотр протоколируемых пакетов в реальном времени можно увидеть при помощи pflog0 интерфейса:
# tcpdump -n -e -ttt -i pflog0
При чтении/анализе протокола, нужно быть особо осторожным, а именно - учитывать подробное декодирование протоколов tcpdump (активируется опцией командной строки -v). Декодер протокола tcpdump не имеет такой уж хорошей истории безопасности. По крайней мере в теории, возможна отложенная атака с использованием частичной загрузки пакета устройством протоколирования (logging device). Поэтому, рекомендованным методом исследования файла протокола является предварительный перенос log-файла с файрвола на другую машину.

Также нужно быть осторожным при предоставлении доступа к log-файлу. По умолчанию pflogd будет записывать в log-файл первые 160 байт пакета. Доступ к log-файлу может обозначать частичный доступ к содержимому пакета.

Фильтры для анализа log-файла

Так как pflogd записывает данные в бинарном tcpdump формате, вы можете использовать все возможности tcpdump при просмотре протокола. Например, ниже представлена команда для просмотра пакетов, которые прошли через определенный порт:
# tcpdump -n -e -ttt -r /var/log/pflog port 80
Также можно отфильтровать пакеты комбинацией указанных адресов и портов:
# tcpdump -n -e -ttt -r /var/log/pflog port 80 and host 192.168.1.3
Такой же способ применим при чтении информации из интерфейса pflog0:
# tcpdump -n -e -ttt -i pflog0 host 192.168.4.2
Обратите внимание, что это не влияет на то, какие пакеты регистрируются в log-файле pflogd; вышеупомянутые команды лишь показывают пакеты, которые были занесены в log-файл.

В дополнение к имеющимся стандартным правилам фильтрации tcpdump(8), tcpdump имеет некоторые дополнительные возможности специально для чтения вывода pflogd:

Пример:
# tcpdump -n -e -ttt -i pflog0 inbound and action block and on wi0
Эта команда покажет log (в реальном времени) только для входящих пакетов, которые были блокированы на интерфейсе wi0.