Написание правил аудита
«Сканер-ВС» позволяет создавать собственные правила для задачи «Аудит конфигурации». Это мощный инструмент для проверки соответствия систем вашим внутренним политикам безопасности или специфическим требованиям. Доступен только для пользователью с ролью "Администратор"
Анатомия правила
Каждое правило представляет собой набор инструкций в формате YAML и состоит из следующих полей:
name
: (Обязательно) Уникальное и понятное название правила.description
: (Обязательно) Подробное описание того, что именно проверяет правило и почему это важно.condition
: (Обязательно) Условие, определяющее успешность выполнения правила (all
илиany
).commands
: (Обязательно) Список из одной или нескольких команд, которые выполняются на целевом активе.group
: Необязательное поле для логической группировки правил.environment
: (Обязательно) Указывает среду, для которой предназначено правило (например,Linux
).
Пример структуры правила:
- name: Убедитесь, что prelink не установлен.
description: prelink - это программа, которая модифицирует ELF-библиотеки...
group: '-'
env_name: linux
condition: all
commands:
- cmd:dpkg-query -s prelink -> r:package 'prelink' is not installed
environment: Linux
Логика выполнения: condition
и commands
Команды (commands
)
Каждая команда в списке выполняется на целевой системе и возвращает один из трех результатов:
PASSED
: Команда выполнилась успешно. Например, проверялось наличие файла, и он был найден.NOT_PASSED
: Команда выполнилась, но проверка не пройдена. Например, искали определенную строку в файле, но не нашли ее.INVALID
: Команда не смогла выполниться. Например, на целевой системе отсутствует необходимая утилита или было разорвано соединение.
Условие (condition
)
Поле condition
определяет, как интерпретировать результаты всех команд в списке для вынесения итогового вердикта по правилу:
all
: Правило считается успешным (PASSED
) только если все команды вернули результатPASSED
. Выполнение останавливается на первой же команде с результатомNOT_PASSED
илиINVALID
.any
: Правило считается успешным (PASSED
) как только хотя бы одна команда вернет результатPASSED
. Выполнение останавливается на первой успешной команде.
Синтаксис команд
Команды имеют общую структуру: цель:тип -> проверка
.
1. Типы целей
Тип цели | Обозначение | Описание |
---|---|---|
Файл | file | Проверка наличия или содержимого файла. |
Директория | dir | Проверка наличия директории или файлов в ней. |
XML-документ | xml | Проверка элементов или атрибутов в XML-файле (только для Windows). |
Процесс | proc | Проверка наличия запущенного процесса. |
Консольная команда | cmd | Выполнение произвольной команды в shell (bash для Linux, cmd.exe для Windows) и проверка ее вывода. |
Реестр | reg | Проверка наличия или значения ключа в реестре Windows. |
2. Проверки содержимого
Если вы хотите проверить не только наличие цели, но и ее содержимое, используйте оператор ->
.
-
Проверка на точное совпадение:
file:/proc/sys/net/ipv4/ip_forward -> 1
Проверяет, что в файле
ip_forward
содержится только символ1
. -
Проверка по регулярному выражению (regex): Используйте префикс
r:
.cmd:findmnt --kernel /tmp -> r:noexec
Проверяет, что в выводе команды
findmnt
присутствует словоnoexec
. -
Числовое сравнение: Используйте префикс
n:
, ключевое словоcompare
и операторы сравнения (==
,!=
,>
,<
,>=
,<=
).file:/etc/ssh/sshd_config -> n:^\s*MaxAuthTries\s*(\d+) compare <= 4
Находит строку, начинающуюся с
MaxAuthTries
, извлекает из нее число(\d+)
и сравнивает его с4
.
3. Продвинутые операторы
-
Инвертирование (
not
и!
)not proc:sshd
— правило успешно, если процессsshd
не найден.file:/etc/ssh_config -> !r:PermitRootLogin
— правило успешно, если в файле нет строки, содержащейPermitRootLogin
.
-
Объединение проверок (
&&
) Вы можете объединять несколько проверок для одной цели в одну цепочку.cmd:stat /etc/crontab -> r:Access:\s*\(0600/-rw-------\) && r:Uid:\s*\(\s*0/\s*root\)
Проверяет, что вывод команды
stat
содержит и права0600
, и владельцаroot
.
Практический пример: создание правила
Задача: Убедиться, что root
является единственным аккаунтом с UID 0.
Наличие других учетных записей с UID 0 является критической уязвимостью, так как предоставляет полный доступ к системе и может свидетельствовать о взломе.
-
Определяем цель и логику проверки: Нам нужно проанализировать файл
/etc/passwd
и убедиться, что только одна строка в нем содержит0
в третьем поле (поле UID), и эта строка принадлежит пользователюroot
.Самый надежный способ сделать это — выполнить команду, которая посчитает количество строк с UID 0, и сравнить результат с единицей.
-
Определяем команду: Мы можем использовать стандартную утилиту
awk
для фильтрации файла/etc/passwd
иwc -l
для подсчета строк:awk -F: '($3 == 0) { print }' /etc/passwd | wc -l
Эта команда выведет
1
, если в системе все в порядке, и больше, если есть другие учетные записи с UID 0. -
Составляем команду для правила:
- Тип цели:
cmd
(консольная команда). - Команда:
awk -F: '($3 == 0) { print }' /etc/passwd | wc -l
- Проверка: Нам нужно сравнить вывод команды с числом
1
. Для этого используем числовое сравнениеn:
.- Регулярное выражение для захвата всего вывода:
(\d+)
- Оператор сравнения:
==
- Значение:
1
- Регулярное выражение для захвата всего вывода:
- Итоговая проверка:
-> n:(\d+) compare == 1
- Тип цели:
-
Собираем правило целиком:
- name: Убедитесь, что root является единственной учетной записью с UID 0
description: Проверяет файл /etc/passwd на наличие учетных записей с UID 0, кроме root. Наличие таких учетных записей является серьезным нарушением безопасности.
condition: all
commands:
- cmd:awk -F: '($3 == 0) { print }' /etc/passwd | wc -l -> n:(\d+) compare == 1
environment: Linux
Теперь это правило можно добавить в ваш шаблон аудита.