Написание правил аудита
«Сканер-ВС» позволяет создавать собственные правила для задачи «Аудит конфигурации». Это мощный инструмент для проверки соответствия систем вашим внутренним политикам безопасности или специфическим требованиям. Доступен только для пользователью с ролью "Администратор"
Анатомия правила
Каждое правило представляет собой набор инструкций в формате 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
Теперь это правило можно добавить в ваш шаблон аудита.