Перейти к основному содержимому
Версия: 7.x

Написание правил аудита

«Сканер-ВС» позволяет создавать собственные правила для задачи «Аудит конфигурации». Это мощный инструмент для проверки соответствия систем вашим внутренним политикам безопасности или специфическим требованиям. Доступен только для пользователью с ролью "Администратор"

Анатомия правила

Каждое правило представляет собой набор инструкций в формате 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 является критической уязвимостью, так как предоставляет полный доступ к системе и может свидетельствовать о взломе.

  1. Определяем цель и логику проверки: Нам нужно проанализировать файл /etc/passwd и убедиться, что только одна строка в нем содержит 0 в третьем поле (поле UID), и эта строка принадлежит пользователю root.

    Самый надежный способ сделать это — выполнить команду, которая посчитает количество строк с UID 0, и сравнить результат с единицей.

  2. Определяем команду: Мы можем использовать стандартную утилиту awk для фильтрации файла /etc/passwd и wc -l для подсчета строк:

    awk -F: '($3 == 0) { print }' /etc/passwd | wc -l

    Эта команда выведет 1, если в системе все в порядке, и больше, если есть другие учетные записи с UID 0.

  3. Составляем команду для правила:

    • Тип цели: cmd (консольная команда).
    • Команда: awk -F: '($3 == 0) { print }' /etc/passwd | wc -l
    • Проверка: Нам нужно сравнить вывод команды с числом 1. Для этого используем числовое сравнение n:.
      • Регулярное выражение для захвата всего вывода: (\d+)
      • Оператор сравнения: ==
      • Значение: 1
    • Итоговая проверка: -> n:(\d+) compare == 1
  4. Собираем правило целиком:

    - 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

Теперь это правило можно добавить в ваш шаблон аудита.