podsec-inotify-check-policy(1)

PODSEC-INOTIFY-CHECK-POLICY(1) PODSEC-INOTIFY-CHECK-POLICY(1)

NAME

podsec-inotify-check-policy - Плугин проверяет настройки политики контейнеризации на узле

SYNOPSIS

podsec-inotify-check-policy [-v[vv]] [-a интервал] [-f интервал] -c интервал -h интервал [-m интервал] х-w интервалъ [-l интервал] [-d интервал]

DESCRIPTION

Общее описание

Плугин проверяет настройки политики контейнеризации на узле.

Проверка идет по следующим параметрам:

файл policy.json установки транспортов и политик доступа к регистраторам:


Параметр контроля пользователей | Вес метрики
--------------------------------------------------------------------------------------------------------------------------|-------------
имеющих `defaultPolicy != reject`, но не входящих в группу `podman_dev` | 102
не имеющих не имеющих `registry.local` в списке регистраторов для которых проверяется наличие электронной подписи образов | 103
имеющих в политике регистраторы для которых не проверяется наличие электронной подписи образов | 104
имеющих в списке поддерживаемых транспорты отличные от `docker` (транспорт получения образов с регистратора) | 105
файлы привязки регистраторов к серверам хранящим электронные подписи (файл привязки о умолчанию default.yaml и файлы привязки регистраторов *.yaml каталога registries.d). Наличие (число) пользователей:


Параметр контроля пользователей | Вес метрики
-------------------------------------------------------------------------------------------------------------|-------------
не использующих хранилище подписей `http://sigstore.local:81/sigstore/` как хранилище подписей по умолчанию | 106
контроль групп пользователей
наличие пользователей имеющих образы, но не входящих в группу podman:


Параметр контроля пользователей | Вес метрики
-----------------------------------------------------------------------|-------------
наличие пользователей имеющих образы, но не входящих в группу `podman` | 101
* наличие пользователей группы `podman` (за исключением входящих в группу `podman_dev`):

Параметр контроля пользователей | Вес метрики
---------------------------------------------------------------------|-------------
входящих в группу `wheel` | 107
имеющих каталог `.config/containers/` открытым на запись и изменения | 90 * `доля_нарушителей`
не имеющих файла конфигурации `.config/containers/storage.conf` | 90 * `доля_нарушителей

доля_нарушителей считается как: число_нарушителей / число_пользователей_группы_podman

Все веса метрик суммируются и формируется итоговая метрика.

OPTIONS

Уровень опасности определяется при запуске флагами:

для системных логов:


Имя уровня | Уровень | Префикс | Флаг | Рекомендуемое значение интервала
------------|---------|------------|------|------------------------
аварийный | 7 | Crash | `-a` | не указывать
фатальный | 6 | Fatal | `-f` | не указывать
критический | 5 | Critical | `-c` | 100
высокий | 4 | Heigh | `-h` | 0
средний | 3 | Middle | `-m` | не указывать
низкий | 2 | Low | `-l` | не указывать
отладочный | 1 | Debug | `-d` | не указывать
для сервера nagios:


Имя уровня | Уровень | Префикс | Флаг | Рекомендуемое значение интервала
---------------|---------|------------|------|-----------------------
критический | 2 | Critical | `-c` | 100
предупреждение | 1 | Warning | `-w` | 0

Любой параметр может отсутствовать. В этом случае он не рассматривается при просмотре соответствия полученной метрики интервалам.

Значение параметров имеют формат интервала, описанного в документации по nagios: Threshold and Ranges https://nagios-plugins.org/doc/guidelines.html#THRESHOLDFORMAT.

Общее описание:

[@]start:end

Замечания:

  • startend
  • start и : не требуется если start=0
  • если интервал задан в формате start: и конец не задан, то концом интервала считается бесконечность
  • для указания отрицательной бесконечности (-ꝏ) используйте ~
  • триггер срабатывает когда значение метрики ВНЕ УКАЗАННОГО ИНТЕРВАЛА (начальные и конечные точки включаются в интервал)
  • если интервал начинается с символа @, тогда условие инвертируется - триггер срабатывает при значении метрики В УКАЗАННОМ ИНТЕРВАЛЕ (начальные и конечные точки включаются в интервал)

Примеры возможных форматов:

Формат интервала | Описание условия срабатывания триггера
-----------------|--------------------------------------
100              | metrica < 0 || metrica > 100 (вне интервала 0-100)
100:             | metrica < 100 (вне интервала 100-ꝏ)
~:100            | metrica > 100 (вне интервала -ꝏ-100)
20-100           | metrica < 20 || metrica > 100 (вне интервала 20-100)
@20-100          | metrica >= 20 && metrica <= 100 (в интервале 20-100)

Системные логи

Для системных логов уровень опасности определяется для каждого сообщения. Интервалы уровней опасностей, заданные параметрами просматриваются в порядке от большого к меньшему. Уровень сообщения определяется по первому найденному соответствию (не забываете, что триггер срабатывает при нахождении метрики ВНЕ интервала). Если соответствие не найдено, сообщение в системный лог не выводится.

Исходя найденного уровня определяет приоритет сообщения и его тег (префикс). В системный лог командой logger посылается сообщение с указанным приоритетом и тегом:

# logger -p приоритет -t тег "тег: сообщение"

Кроме основного сообщения для nagios формируются:

  • список пользователей нарушителей;
  • укороченные сообщения для уровня детализации 1.

Логи nagios

Форматы сообщений и кодов завершения плугина описаны в Plugin Output for Nagios https://nagios-plugins.org/doc/guidelines.html#PLUGOUTPUT.

Уровень опасности для логов nagios определяется СУММАРНОЙ метрике. Суммарная метрика определяется для определения уровня сравнивается с интервалами, задаваемыми флагами

  • -c - Critical
  • -w - Warning

Если соответствие не найдено, в nagios выводится сообщение:

POLICY OK: Политики контейнеризации не нарушены

Код завершение программы (которое обрабатывается на стороне сервера nagios) - 0.

Формат логов для nagios зависит от уровня детализации, задаваемый флагом -v[vv] (см. Verbose Output https://nagios-plugins.org/doc/guidelines.html#AEN41):

Флаг        | Уровень
------------|--------
отcутствует | 0
-v          | 1
-vv         | 2
-vvv        | 3

Для всех уровней формируется префикс сообщение формата:

POLICY $prefix:

Где prefix в зависимости от уровня опасности принимает значения:

  • -c - Critical
  • -w - Warning

Если уровень детализации - 0, то выводится укороченное сообщение.

POLICY $prefix: Нарушение политик контейнеризации пользователей users

Где users - список пользователей у которых обнаружены нарушения.

Если уровень детализации - 1, то к сообщению с префиксом Есть пользователи: добавляется первый уровень детализации из списка укороченных сообщений сформированных при формировании системных логов.

POLICY $prefix: Нарушение политик контейнеризации пользователей $users | Есть пользователи:
укороченное сообщение

Если уровень детализации - 2, то к сообщению добавляется второй уровень детализации из списка полных сообщений сформированных при формировании системных логов.

POLICY $prefix: Нарушение политик контейнеризации пользователей $users | Есть пользователи:
укороченное сообщение
укороченное сообщение |
полное сообщение

После вывода сообщений плугин завершается кодом завершения:

  • Critical - 2
  • Warning - 1
создайте в /etc/nagios/commands/ конфигурационный файл nagios-plugins-podsec.cfg для всех podsec планинов
define command{

command_name podsec-inotify-check-policy
command_line $USER1$/check_by_ssh -H $HOSTADDRESS$ -l root -C ´/usr/lib/nagios/plugins/podsec-inotify-check-policy -vvv -w $ARG1$ -l $ARG1$ -c $ARG2$ ´
}

В command_name надо указать имя плагина которое будет использоваться в секции define service файла конфигурации в каталоге /etc/nagios/objects. В command_line не забудьте если в этом есть необходимость указать флаг -l root для запуска скрипта под пользователем root на удаленной машине. Если для плагина достаточно прав обыкновенного пользователя nagios, флаг -l не нужен.

Переменныe $ARG1, $ARG2, ... берутся из командной строки описания сервиса в каталоге /etc/nagios/objects.

define service {

use generic-service
host_name <host>
service_description Check containers policy
check_command podsec-inotify-check-policy!0!100
}

В строке service_description укахите иям сервиска которое будет отображаться в WEB-интерейсе nagios. В check_command имя команды, из вышеописанного файла nagios-plugins-podsec.cfg каталога /etc/nagios/commands/. Параметры использумые в команде указываются через символ |.

Запуск сервиса через systemd/Timers

Кроме запуска скрипта через nagios скрипт может запускаться через systemd/Timers. В состав пакета входит systemd-файлы podsec-inotify-check-policy.service, podsec-inotify-check-policy.timer. Файл сервисов podsec-inotify-check-policy.service описывает в параметре ExecStart строку с описанием режима запуска скрипта podsec-inotify-check-policy. Скрипт запускается с флагами -vvv -c 100 - выводить подробную информацию, все сообщения имеют уровень c - критический. Если во время работы скрипта обнаружены некорректные настройки политики, они выводятся в системный лог и передаются почтой системному администратору (root).

Расписание запуска сервиса podsec-inotify-check-policy.service описывается в параметре OnCalendar файла расписания podsec-inotify-check-policy.timer. Сервис вызывается ежечасно.

По умолчанию таймер запуска сервиса выключен. Для его включения наберите команду:

#  systemctl enable --now podsec-inotify-check-policy.timer

Если необходимо изменить режим запуска скрипта отредактируйте параметр OnCalendar файла расписания podsec-inotify-check-policy.timer.

EXAMPLES

Проанализировать политики политики с максимальным уровнем детализации. Критический уровень (nagios, system) >100. Уровень предупреждений (nagios) >0. Низкий уровень (system) >0.

# podsec-inotify-check-policy -vvv  -w 0 -h 0 -c 100
POLICY Critical(18): Нарушение политик контейнеризации пользователей  "imagedeveloper" "k8s-user1" "kaf" "kafpodman" "podmanuser" "root" "securityadmin" "user" "user1"  | Есть пользователи:
вне группы podman,
способные получать любой образ
способные получать локальный образ без подписи
способные получать любой образ без подписи
способные получать любой образ через запрещенный транспорт
не использующие локальный хранитель подписей
входящие в группу wheel
не имеющих конфигурационного файла
способные изменить конфигурацию" |
Critical(101): Пользователи "kafpodman"  имеют образы, но не входят в группу ´podman´
Critical(102): Пользователи "user"  имеют в policy.json defaultPolicy!=reject, но не входят в группу ´podman_dev´
Critical(103): Пользователи "user"  не имеют registry.local в списке регистраторов для которых проверяется наличие электронной подписи образов
Critical(104): Пользователи "root" "kaf" "kafpodman" "podmanuser" "securityadmin" "user1"  имеют в политике регистраторы для которых не проверяется наличие электронной подписи образов
Critical(105): Пользователи "user"  имеют в списке поддерживаемых транспорты отличные от docker
Critical(106): Пользователи "imagedeveloper" "user"  не используют хранилище подписей  http://sigstore.local:81/sigstore/ как хранилище подписей по умолчанию
Critical(107): Пользователи  "kaf" "securityadmin" входят в группы ´podman´ и ´wheel´
High(72): Пользователи  "k8s-user1" "kaf" "securityadmin" "user1" не имеют конфигурационного файла .config/containers/storage.conf
High(18): Пользователи  "user" имеют открытым для записи каталог конфигурации .config/containers

Код завершения программы - 2.

SECURITY CONSIDERATIONS

SEE ALSO

Nagios Plugins. Development Guidelines https://nagios-plugins.org/doc/guidelines.html#PLUGOUTPUT

AUTHOR

Костарев Алексей, Базальт СПО kaf@basealt.ru

August 2023