Привет, защитники! На связи Pensecfort.

В видео я разобрал, что такое SCA (Security Configuration Assessment) в Wazuh — ваш личный системный аудитор, который автоматически проверяет серверы на соответствие стандартам безопасности (CIS, NIST, PCI DSS и вашим внутренним политикам).

Wazuh из коробки даёт отличные политики на основе CIS Benchmarks. Но что делать, если у вас:

  • специфичный корпоративный стандарт?

  • нужно проверять кастомные приложения?

  • хочется убедиться, что разработчики не оставили debug: true в продакшене?

Ответ один — писать свои кастомные политики.

Сегодня я разберу анатомию SCA-политик от и до, покажу все подводные камни и в конце дам готовый мощный пример для SSH Hardening. Также вот ссылка на официальную документацию.

Анатомия SCA-политики

Любая политика — это обычный YAML-файл с четырьмя основными секциями:

Секция

Обязательна?

Для чего

policy

Да

Паспорт политики (id, название, описание)

requirements

Нет

«Фейс-контроль» — если не выполнено, сканирование даже не запустится

variables

Нет

Переменные ($sshd_config, $my_app_conf) — чтобы не копипастить пути

checks

Да

Самое мясо — список проверок

Синтаксис правил — всё, что нужно знать

Формула правила: ТИП:ЛОКАЦИЯ -> ОПЕРАТОР:ЗНАЧЕНИЕ

Тип

Что проверяет

Пример

f:

файл (существование или содержимое)

f:/etc/ssh/sshd_config

d:

директория (рекурсивно!)

d:/etc/ssh/sshd_config.d

p:

процесс (только существование)

p:nc -l

c:

вывод команды

c:sshd -T

r:

реестр Windows

r:HKEY_LOCAL_MACHINE\...\LimitBlankPasswordUse

Операторы проверки контента:

Оператор

Что делает

Пример

(без оператора)

точное совпадение строки

f:/file -> PermitRootLogin no

r:

регулярное выражение

r:^Ciphers\s+chacha20-poly1305

n:

числовое сравнение

n:^MaxAuthTries\s+(\d+) compare <= 4

!

отрицание

!r:MD5 или not f:/bad/file

&&

логическое И (цепочки)

!r:^# && r:Port && r:22

> Важно: пробелы вокруг ->, &&, compare обязательны!

Как работает condition (таблица оценки)

condition

Все правила Passed

Есть Failed

Есть Not applicable

Итог

all

Да

Нет

Нет

Passed

all

—

Да

—

Failed

all

—

Нет

Да

Not applicable

any

Да

—

—

Passed

any

Нет

Да

Нет

Failed

any

Нет

—

Да

Not applicable

none

Нет

Да

—

Passed

none

Да

—

—

Failed

Рекурсивные проверки директорий (d:)

Очень мощная фича, которой многие не пользуются:

```yaml
- id: 200025
  title: "SSH: в sshd_config.d нет слабых алгоритмов"
  rules:
    - 'd:/etc/ssh/sshd_config.d -> r:\.conf$ -> !r:(MD5|DES|RC4|3DES)'

Частые ошибки (чек-лист)

Ошибка

Последствия

Как исправить

Забыли sca.remote_commands=1

Все c: → Not applicable / Failed

Добавить в local_internal_options.conf и перезапустить агент

Пропущены пробелы вокруг ->, &&, compare

Правило не парсится → Not applicable

Проверять строго: -> , &&, compare

«Жадное» отрицание !r:

Ложные Passed

Писать явно: r:^PermitRootLogin\s+no вместо !r:PermitRootLogin

Не учли Include /etc/ssh/sshd_config.d/*.conf

Пропускаются настройки из дополнительных файлов

Добавлять переменную $sshd_config_d и рекурсивные d: проверки

ID пересекаются с дефолтными политиками

Конфликты при обновлении

Используйте диапазон 100000–299999

Практика: разбор sca_ssh_hardening.yml

Самый важный трюк — проверяем и файл, и реальную конфигурацию в памяти:

- id: 200000
  title: "SSH: Ciphers настроены безопасно"
  condition: all
  rules:
    - 'f:$sshd_config -> r:^Ciphers\s+chacha20-poly1305@openssh.com,aes256-gcm...'
    - 'c:sshd -T -> r:^ciphers chacha20-poly1305@openssh.com,aes256-gcm...'

Если вы изменили файл, но забыли systemctl restart sshd — получите Failed. Это защита от configuration drift.

Как раздавать политику централизованно

Никогда не кладите свои политики в /var/ossec/ruleset/sca — при обновлении всё затрётся!
Правильно:

  1. На менеджере: /var/ossec/etc/shared/default/sca_ssh_hardening.yml (или в нужной группе)

  2. В agent.conf группы:

<agent_config>
  <sca>
    <policies>
      <policy>etc/shared/sca_ssh_hardening.yml</policy>
    </policies>
  </sca>
</agent_config>

Как протестировать локально (не ломая прод)

1.Скопируйте .yml только на один тестовый агент в /var/ossec/etc/shared/, либо через менеджер, создать тестовую группу, поместить туда тестовый агент в /var/ossec/etc/shared/TEST/
2.Добавьте в локальный ossec.conf, либо если используете тестирование через менеджер в /var/ossec/etc/shared/TEST/agent.conf:

<sca>
  <policies>
    <policy>etc/shared/sca_ssh_hardening.yml</policy>
  </policies>
</sca>

3. systemctl restart wazuh-agent
4.Смотреть результат в Wazuh-dashboard->Endpoint security->Configuration Assessment

Минимальный шаблон для старта

policy:
  id: "my_custom_policy"
  file: "my_custom_policy.yml"
  name: "Моя кастомная политика"
  description: "Проверка внутренних стандартов"

variables:
  $my_app_config: "/opt/myapp/config.yaml"

checks:
  - id: 100001
    title: "MyApp: debug mode выключен"
    rationale: "Режим отладки выводит чувствительные данные"
    remediation: "Установите debug: false и перезапустите сервис"
    compliance:
      - internal_corp: ["SEC-007"]
    condition: all
    rules:
      - 'f:$$ my_app_config -> r:^debug:\s*false $$'

Дополнительно:

Исходная конфигурация sshd_config для которой была разработана политика sca_linux_auditd.yml в видео для детального анализа.

Include /etc/ssh/sshd_config.d/*.conf
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
LogLevel VERBOSE
LoginGraceTime 60
MaxAuthTries 4
MaxSessions 10
AllowGroups ssh_access
PubkeyAuthentication yes
HostbasedAuthentication no
IgnoreRhosts yes
KbdInteractiveAuthentication no
UsePAM yes
PermitRootLogin no
AllowTcpForwarding no
X11Forwarding no
PrintMotd no
PermitUserEnvironment no
ClientAliveCountMax 3
MaxStartups 10:30:60
AcceptEnv LANG LC_*
Subsystem sftp  /usr/lib/openssh/sftp-server
PasswordAuthentication no
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
Banner /etc/issue.net

Политика sca_linux_auditd.yml:

# Security Configuration Assessment
# SSH Hardening Policy for Linux systems
# Copyright (C) 2025, @pensecfort
#
# This program is free software; you can redistribute it
# and/or modify it under the terms of the GNU General Public
# License (version 2) as published by the FSF - Free Software
# Foundation

policy:
  id: "ssh_hardening"
  file: "sca_ssh_hardening.yml"
  name: "SSH Hardening Configuration Assessment"
  description: "Полная проверка конфигурации SSH для обеспечения безопасности: проверка ключевых параметров в файле sshd_config и через команду sshd -T."
  references:
    - "https://cisecurity.org/benchmark/linux_server"
    - "https://www.ssh.com/academy/ssh/config"
    - "https://www.nist.gov/itl/applied-cybersecurity/nist-cybersecurity-framework"

requirements:
  title: "Требования для запуска сканирования SSH"
  description: "Проверяем наличие ключевых компонентов SSH перед сканированием (файлы конфигурации и наличие sshd)."
  condition: any
  rules:
    - 'c:which sshd'  # Проверяем наличие бинарника sshd
    - 'f:/etc/ssh/sshd_config'  # Основной файл конфигурации
    - 'd:/etc/ssh/sshd_config.d'  # Директория include

variables:
  $sshd_config: "/etc/ssh/sshd_config"
  $sshd_config_d: "/etc/ssh/sshd_config.d/.*\\.conf"  # Паттерн для include-файлов
  $sshd_banner: "/etc/issue.net"  # Файл баннера

checks:
  - id: 200000
    title: "SSH: Ciphers настроены безопасно"
    description: "Проверяем, что список Ciphers включает только сильные шифры (chacha20-poly1305, aes-gcm, aes-ctr)."
    rationale: "Использование слабых шифров может привести к MITM-атакам; сильные шифры обеспечивают конфиденциальность (CIS 5.2.12, NIST SC-8)."
    remediation: "Добавьте в sshd_config: Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr; перезапустите sshd: systemctl restart sshd."
    compliance:
      - cis: ["5.2.12"]
      - nist_800_53: ["SC-8"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^Ciphers\s+chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr'
      - 'c:sshd -T -> r:^ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr'

  - id: 200001
    title: "SSH: LogLevel установлен на VERBOSE"
    description: "Проверяем, что уровень логирования LogLevel = VERBOSE для детального аудита."
    rationale: "VERBOSE логи позволяют отслеживать подозрительные попытки аутентификации (CIS 5.2.3, NIST AU-3)."
    remediation: "Добавьте в sshd_config: LogLevel VERBOSE; перезапустите sshd."
    compliance:
      - cis: ["5.2.3"]
      - nist_800_53: ["AU-3"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^LogLevel\s+VERBOSE'
      - 'c:sshd -T -> r:^loglevel verbose'

  - id: 200002
    title: "SSH: LoginGraceTime = 60"
    description: "Проверяем, что время ожидания логина LoginGraceTime = 60 секунд."
    rationale: "Ограничение времени снижает риск brute-force атак (CIS 5.2.4, NIST AC-7)."
    remediation: "Добавьте в sshd_config: LoginGraceTime 60; перезапустите sshd."
    compliance:
      - cis: ["5.2.4"]
      - nist_800_53: ["AC-7"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^LoginGraceTime\s+60'
      - 'c:sshd -T -> r:^logingracetime 60'

  - id: 200003
    title: "SSH: MaxAuthTries = 4"
    description: "Проверяем, что максимум попыток аутентификации MaxAuthTries = 4."
    rationale: "Ограничение попыток защищает от brute-force (CIS 5.2.5, NIST AC-7)."
    remediation: "Добавьте в sshd_config: MaxAuthTries 4; перезапустите sshd."
    compliance:
      - cis: ["5.2.5"]
      - nist_800_53: ["AC-7"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^MaxAuthTries\s+4'
      - 'c:sshd -T -> r:^maxauthtries 4'

  - id: 200004
    title: "SSH: MaxSessions = 10"
    description: "Проверяем, что максимум сессий MaxSessions = 10."
    rationale: "Ограничение сессий снижает нагрузку и риск DoS (CIS 5.2.6, NIST SC-5)."
    remediation: "Добавьте в sshd_config: MaxSessions 10; перезапустите sshd."
    compliance:
      - cis: ["5.2.6"]
      - nist_800_53: ["SC-5"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^MaxSessions\s+10'
      - 'c:sshd -T -> r:^maxsessions 10'
  - id: 200005
    title: "SSH: AllowGroups = ssh_access"
    description: "Проверяем, что доступ ограничен группой AllowGroups = ssh_access."
    rationale: "Ограничение по группам повышает контроль доступа (CIS 5.2.7, NIST AC-3)."
    remediation: "Добавьте в sshd_config: AllowGroups ssh_access; перезапустите sshd."
    compliance:
      - cis: ["5.2.7"]
      - nist_800_53: ["AC-3"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^AllowGroups\s+ssh_access'
      - 'c:sshd -T -> r:^allowgroups ssh_access'

  - id: 200006
    title: "SSH: PubkeyAuthentication = yes"
    description: "Проверяем, что аутентификация по ключу PubkeyAuthentication = yes."
    rationale: "Ключевая аутентификация безопаснее паролей (CIS 5.2.8, NIST IA-5)."
    remediation: "Добавьте в sshd_config: PubkeyAuthentication yes; перезапустите sshd."
    compliance:
      - cis: ["5.2.8"]
      - nist_800_53: ["IA-5"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^PubkeyAuthentication\s+yes'
      - 'c:sshd -T -> r:^pubkeyauthentication yes'

  - id: 200007
    title: "SSH: HostbasedAuthentication = no"
    description: "Проверяем, что HostbasedAuthentication отключена (no)."
    rationale: "Hostbased уязвима к spoofing; отключение повышает безопасность (CIS 5.2.9, NIST IA-2)."
    remediation: "Добавьте в sshd_config: HostbasedAuthentication no; перезапустите sshd."
    compliance:
      - cis: ["5.2.9"]
      - nist_800_53: ["IA-2"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^HostbasedAuthentication\s+no'
      - 'c:sshd -T -> r:^hostbasedauthentication no'

  - id: 200008
    title: "SSH: IgnoreRhosts = yes"
    description: "Проверяем, что IgnoreRhosts = yes (игнорировать .rhosts)."
    rationale: "Игнорирование rhosts предотвращает старые уязвимые методы аутентификации (CIS 5.2.10, NIST IA-2)."
    remediation: "Добавьте в sshd_config: IgnoreRhosts yes; перезапустите sshd."
    compliance:
      - cis: ["5.2.10"]
      - nist_800_53: ["IA-2"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^IgnoreRhosts\s+yes'
      - 'c:sshd -T -> r:^ignorerhosts yes'

  - id: 200009
    title: "SSH: KbdInteractiveAuthentication = no"
    description: "Проверяем, что KbdInteractiveAuthentication отключена (no)."
    rationale: "Отключение keyboard-interactive снижает риск слабых методов аутентификации (CIS 5.2.11, NIST IA-2)."
    remediation: "Добавьте в sshd_config: KbdInteractiveAuthentication no; перезапустите sshd."
    compliance:
      - cis: ["5.2.11"]
      - nist_800_53: ["IA-2"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^KbdInteractiveAuthentication\s+no'
      - 'c:sshd -T -> r:^kbdinteractiveauthentication no'

  - id: 200010
    title: "SSH: UsePAM = yes"
    description: "Проверяем, что UsePAM = yes для интеграции с PAM."
    rationale: "PAM обеспечивает дополнительный контроль аутентификации (CIS 5.2.1, NIST IA-5)."
    remediation: "Добавьте в sshd_config: UsePAM yes; перезапустите sshd."
    compliance:
      - cis: ["5.2.1"]
      - nist_800_53: ["IA-5"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^UsePAM\s+yes'
      - 'c:sshd -T -> r:^usepam yes'

  - id: 200011
    title: "SSH: PermitRootLogin = no"
    description: "Проверяем, что логин root запрещён (PermitRootLogin = no)."
    rationale: "Запрет root-логинов снижает риск компрометации (CIS 5.2.2, NIST AC-6)."
    remediation: "Добавьте в sshd_config: PermitRootLogin no; перезапустите sshd."
    compliance:
      - cis: ["5.2.2"]
      - nist_800_53: ["AC-6"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^PermitRootLogin\s+no'
      - 'c:sshd -T -> r:^permitrootlogin no'

  - id: 200012
    title: "SSH: AllowTcpForwarding = no"
    description: "Проверяем, что TCP-форвардинг отключён (no)."
    rationale: "Отключение форвардинга предотвращает туннелирование (CIS 5.2.13, NIST SC-7)."
    remediation: "Добавьте в sshd_config: AllowTcpForwarding no; перезапустите sshd."
    compliance:
      - cis: ["5.2.13"]
      - nist_800_53: ["SC-7"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^AllowTcpForwarding\s+no'
      - 'c:sshd -T -> r:^allowtcpforwarding no'

  - id: 200013
    title: "SSH: X11Forwarding = no"
    description: "Проверяем, что X11-форвардинг отключён (no)."
    rationale: "X11 уязвим к захвату сессий; отключение повышает безопасность (CIS 5.2.14, NIST SC-7)."
    remediation: "Добавьте в sshd_config: X11Forwarding no; перезапустите sshd."
    compliance:
      - cis: ["5.2.14"]
      - nist_800_53: ["SC-7"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^X11Forwarding\s+no'
      - 'c:sshd -T -> r:^x11forwarding no'

  - id: 200014
    title: "SSH: PrintMotd = no"
    description: "Проверяем, что печать MOTD отключена (no)."
    rationale: "Отключение MOTD снижает утечку информации о системе (CIS 5.2.15, NIST SC-18)."
    remediation: "Добавьте в sshd_config: PrintMotd no; перезапустите sshd."
    compliance:
      - cis: ["5.2.15"]
      - nist_800_53: ["SC-18"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^PrintMotd\s+no'
      - 'c:sshd -T -> r:^printmotd no'

  - id: 200015
    title: "SSH: PermitUserEnvironment = no"
    description: "Проверяем, что PermitUserEnvironment отключено (no)."
    rationale: "Отключение предотвращает инъекции переменных окружения (CIS 5.2.16, NIST SC-18)."
    remediation: "Добавьте в sshd_config: PermitUserEnvironment no; перезапустите sshd."
    compliance:
      - cis: ["5.2.16"]
      - nist_800_53: ["SC-18"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^PermitUserEnvironment\s+no'
      - 'c:sshd -T -> r:^permituserenvironment no'

  - id: 200016
    title: "SSH: ClientAliveCountMax = 3"
    description: "Проверяем, что максимум живых клиентов ClientAliveCountMax = 3."
    rationale: "Ограничение снижает риск DoS от неактивных сессий (CIS 5.2.17, NIST SC-5)."
    remediation: "Добавьте в sshd_config: ClientAliveCountMax 3; перезапустите sshd."
    compliance:
      - cis: ["5.2.17"]
      - nist_800_53: ["SC-5"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^ClientAliveCountMax\s+3'
      - 'c:sshd -T -> r:^clientalivecountmax 3'

  - id: 200017
    title: "SSH: MaxStartups = 10:30:60"
    description: "Проверяем, что ограничение стартапов MaxStartups = 10:30:60."
    rationale: "Ограничение защищает от DoS на соединения (CIS 5.2.18, NIST SC-5)."
    remediation: "Добавьте в sshd_config: MaxStartups 10:30:60; перезапустите sshd."
    compliance:
      - cis: ["5.2.18"]
      - nist_800_53: ["SC-5"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^MaxStartups\s+10:30:60'
      - 'c:sshd -T -> r:^maxstartups 10:30:60'

  - id: 200018
    title: "SSH: AcceptEnv = LANG LC_*"
    description: "Проверяем, что AcceptEnv ограничено LANG LC_*."
    rationale: "Ограничение переменных снижает риск инъекций (CIS 5.2.19, NIST SC-18)."
    remediation: "Добавьте в sshd_config: AcceptEnv LANG LC_*; перезапустите sshd."
    compliance:
      - cis: ["5.2.19"]
      - nist_800_53: ["SC-18"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:AcceptEnv LANG LC_*'
      - 'c:sshd -T -> r:acceptenv LANG'
      - 'c:sshd -T -> r:acceptenv LC_*'

  - id: 200019
    title: "SSH: Subsystem sftp настроен"
    description: "Проверяем, что Subsystem sftp установлен на /usr/lib/openssh/sftp-server."
    rationale: "Правильный subsystem обеспечивает безопасный SFTP (CIS 5.2.20, NIST SC-8)."
    remediation: "Добавьте в sshd_config: Subsystem sftp /usr/lib/openssh/sftp-server; перезапустите sshd."
    compliance:
      - cis: ["5.2.20"]
      - nist_800_53: ["SC-8"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^Subsystem\s+sftp\s+/usr/lib/openssh/sftp-server'
      - 'c:sshd -T -> r:^subsystem sftp /usr/lib/openssh/sftp-server'

  - id: 200020
    title: "SSH: PasswordAuthentication = no"
    description: "Проверяем, что аутентификация по паролю отключена (no)."
    rationale: "Отключение паролей заставляет использовать ключи, повышая безопасность (CIS 5.2.21, NIST IA-5)."
    remediation: "Добавьте в sshd_config: PasswordAuthentication no; перезапустите sshd."
    compliance:
      - cis: ["5.2.21"]
      - nist_800_53: ["IA-5"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^PasswordAuthentication\s+no'
      - 'c:sshd -T -> r:^passwordauthentication no'

  - id: 200021
    title: "SSH: MACs настроены безопасно"
    description: "Проверяем, что список MACs включает hmac-sha2-etm и hmac-sha2."
    rationale: "Сильные MAC защищают от подмены сообщений (CIS 5.2.22, NIST SC-13)."
    remediation: "Добавьте в sshd_config: MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256; перезапустите sshd."
    compliance:
      - cis: ["5.2.22"]
      - nist_800_53: ["SC-13"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^MACs\s+hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256'
      - 'c:sshd -T -> r:^macs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256'

  - id: 200022
    title: "SSH: KexAlgorithms настроены безопасно"
    description: "Проверяем, что KexAlgorithms включает curve25519, diffie-hellman-group14-sha256 и другие сильные алгоритмы."
    rationale: "Сильные KEX защищают обмен ключами (CIS 5.2.23, NIST SC-13)."
    remediation: "Добавьте в sshd_config: KexAlgorithms curve25519-sha256,... (полный список из твоего конфига); перезапустите sshd."
    compliance:
      - cis: ["5.2.23"]
      - nist_800_53: ["SC-13"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^KexAlgorithms\s+curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256'
      - 'c:sshd -T -> r:^kexalgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256'

  - id: 200023
    title: "SSH: Banner = /etc/issue.net"
    description: "Проверяем, что баннер установлен на /etc/issue.net."
    rationale: "Баннер может содержать предупреждение о мониторинге, отпугивая атакующих (CIS 5.2.24, NIST AC-8)."
    remediation: "Добавьте в sshd_config: Banner /etc/issue.net; перезапустите sshd."
    compliance:
      - cis: ["5.2.24"]
      - nist_800_53: ["AC-8"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^Banner\s+/etc/issue.net'
      - 'c:sshd -T -> r:^banner /etc/issue.net'

  - id: 200024
    title: "SSH: Include sshd_config.d/*.conf"
    description: "Проверяем, что include из /etc/ssh/sshd_config.d/*.conf включён."
    rationale: "Include позволяет модульную конфигурацию, облегчая управление (CIS 5.2.25, NIST CM-6)."
    remediation: "Добавьте в sshd_config: Include /etc/ssh/sshd_config.d/*.conf; перезапустите sshd."
    compliance:
      - cis: ["5.2.25"]
      - nist_800_53: ["CM-6"]
    condition: all
    rules:
      - 'f:$sshd_config -> r:^Include\s+/etc/ssh/sshd_config.d/*.conf'
      - 'd:/etc/ssh/sshd_config.d'  # Проверка директории include