← Назад к «Клиент»

Клиент LSUS Config Agent (Linux)

lsus-config-agent — отдельный systemd-сервис для Linux-клиентов, исполняющий Ansible-плейбуки, поступающие с сервера через вкладку Конфигурации. Это «руки» модуля compliance/remediation: проверка и приведение в соответствие хостов (EDR/AV/DLP, харднинг ОС, конфиги, службы, установка ПО).

Поставляется со встроенным self-contained Ansible (vendored venv, ~15 МБ) — не требует интернета, установки ansible из репозиториев ОС или системных devel-пакетов. Зависит от lsus-client (читает из его конфигов server_url и Bearer-токен).

Архитектура и принцип работы

  Master (вкладка Конфигурации)
      │  POST /api/v1/clients/ansible/runs/pending  (Bearer хоста)
      ▼
  lsus-config-agent (systemd, root)
      │  GET /clients/ansible/runs/<id> → spec {playbook, подпись Ed25519, assets, vault}
      │  проверка подписи + sha256
      │  запуск: venv/bin/ansible-playbook -c local (--check|--become)
      │  POST /runs/<id>/result {status, recap, per-task, stdout_log, report}
      ▼
  встроенный venv: ansible-core 2.19 + ansible.posix + community.general

infoPull-модель

Агент сам опрашивает сервер (GET /api/v1/clients/ansible/runs/pending) — никаких входящих SSH/портов на клиенте открывать не нужно. Тот же Bearer-токен хоста, что у lsus-client. Запуск локальный: ansible-playbook -c local на самом клиенте, без SSH-push с сервера.

Ключевые свойства

  • Ed25519-подпись обязательна — каждый playbook подписывается приватным ключом сервера; агент проверяет подпись перед выполнением. Защищает от подмены контента (RCE от root — главный риск). Без подписи или при неверной подписи раннер отказывается выполнять.
  • Версионирование — контент playbook'а хранится на сервере в immutable-версиях; идущие прогоны ссылаются на конкретную версию. Редактирование плейбука не ломает идущие прогоны.
  • Антишторм — раскатка батчами с throttle/jitter, lease на выполнение, экспоненциальный backoff при ошибках.
  • Запуск не от root — через run_as_user + runuser (сброс привилегий), временные файлы с правами 700.

Установка

lsus-config-agent — отдельный пакет, ставится на Linux-клиенты после lsus-client (жёсткая зависимость).

Команды установки

# Astra / Debian / Ubuntu (.deb)
sudo apt install ./lsus-config-agent_<версия>_amd64.deb

# РЕД ОС / ALT / CentOS (.rpm)
sudo dnf install ./lsus-config-agent-<версия>-1.x86_64.rpm

Зависимости

Зависимость Назначение
python3 >= 3.11 Для встроенного venv (ansible-core требует 3.11+)
lsus-client >= <версия> Источник server_url и Bearer-токена

priority_highПорядок установки

Сначала lsus-client, затем lsus-config-agent. Пакет lsus-config-agent не сможет работать без конфигов и токена lsus-client. На Astra 1.7 (где системный Python 3.7) нужно установить python3.11 из репозитория LSUS.

При установке пакет автоматически:
1. создаёт venv из bundled wheels (/var/lib/lsus-config-agent/venv);
2. устанавливает коллекции Ansible (community-general, ansible.posix);
3. настраивает SELinux (при enforcing — chcon/semanage для venv);
4. включает и запускает службу lsus-config-agent.service.

Пути установки

Путь Содержимое
/var/lib/lsus-config-agent/ демон lsus_config_agent.py, раннер lsus_ansible_runner.py, venv/, work/
/etc/lsus-config-agent/lsus-config-agent.conf конфиг (%config(noreplace))
/usr/share/lsus-config-agent/wheels/ wheels для пересоздания venv
/usr/share/lsus-config-agent/collections/ коллекции Ansible
/var/log/lsus-config-agent/agent.log журналы

Конфигурация

Основной конфиг — /etc/lsus-config-agent/lsus-config-agent.conf. По умолчанию server_url и api_token в нём закомментированы — наследуются из конфигов lsus-client.

Приоритет чтения настроек

  1. [server] server_url из собственного конфига (если задан);
  2. /etc/lsus-client/lsus-client.conf или /etc/lsus-client/lsus-client-common.conf — секция [server], ключи server_url или master_server_url;
  3. Bearer-токен — всегда из /etc/lsus-client/.api_token (тот же, что у lsus-client).

systemd-служба

# /etc/systemd/system/lsus-config-agent.service
Type=simple
User=root
After=network.target lsus-client.service
Requires=lsus-client.service
ConditionPathExists=/var/lib/lsus-config-agent/venv/bin/ansible-playbook
Restart=always
RestartSec=10
ExecStart=/var/lib/lsus-config-agent/venv/bin/python3 /var/lib/lsus-config-agent/lsus_config_agent.py

infoConditionPathExists

Сервис не стартует, пока venv не развёрнут (нет ansible-playbook). Это защита от запуска при незавершённой установке.

Встроенный Ansible (vendored venv)

Компонент Версия
ansible-core 2.19.11
community-general 13.1.0
ansible.posix 2.2.x
cryptography 49.0.0 (проверка Ed25519)
PyYAML 6.0.3

Wheels (15 файлов, ~12 МБ) и tarball-коллекций поставляются внутри пакета — venv создаётся при установке из локального каталога /usr/share/lsus-config-agent/wheels/ без обращения к PyPI. Покрытие Python: stable ABI cp311-abi3 для cryptography + по два wheel для PyYAML/MarkupSafe (cp311 и cp312).

Поддерживаемые ОС

ОС Версия Python Особенность
РЕД ОС 8.0.2 3.11
Astra Linux 1.7.9 3.7 → 3.11 ставится python3.11 из LSUS-репо
Astra Linux 1.8.5 3.11
Ubuntu 22.04 3.10 → 3.11 ставится python3.11
Ubuntu 24.04 3.12 venv --without-pip + bootstrap
ALT Linux 11.1 3.12 (glibc 2.38)
CentOS Stream 10 3.12 SELinux enforcing

Архитектура: x86_64. Для Windows используется отдельный .NET-агент (PowerShell вместо Ansible).

Что делает агент с run'ом

  1. GET pendingGET /api/v1/clients/ansible/runs/pending (получает список ожидающих прогонов, до 10 за раз, с учётом next_poll_seconds от сервера).
  2. GET specGET /clients/ansible/runs/<id> (контент playbook, Ed25519-подпись, content_type, assets[], расшифрованный vault-секрет — только по TLS).
  3. Доставка ассетов — скачивание файлов-нагрузок (сертификаты, конфиги, дистрибутивы ПО), проверка sha256 + Ed25519, установка mode/owner.
  4. Проверка подписи — обязательная проверка Ed25519-подписи контента playbook перед выполнением.
  5. Запускansible-playbook -i localhost, -c local --check|--become через venv, с таймаутом из spec (по умолчанию 1800 с).
  6. Прогресс — live-обновления POST /runs/<id>/progress (фаза, задача).
  7. Артефакты — загрузка собранных файлов (логи, отчёты) обратно на сервер.
  8. РезультатPOST /runs/<id>/result (status, recap ok/ch/fail/unr, per-task, stdout_log, report, stderr, rc):
    - stdout_logчеловекочитаемый вывод ansible (PLAY/TASK/MSG/PLAY RECAP, классический default-формат). Агент формирует его из распарсенного вывода JSON-callback (берёт события прогона и собирает строки PLAY/TASK/MSG/PLAY RECAP), без повторного запуска ansible — отдельного прогона ради человекочитаемого лога нет.
    - report — сырой JSON-callback (структурированные события прогона), отправляется отдельным полем. На сервере попадает в детали прогона как вкладка «сырой вывод ansible (JSON-callback)» и используется для глубокой отладки/интеграций.

Статусы прогона (AWX-выровненные)

Статус Значение
pending Создан, ждёт агента
claimed Агент забрал (lease активен)
running Выполняется
successful Завершён без failed/changed
changed Завершён, что-то изменено (apply)
failed Проверка/применение упали
error Ошибка агента (нет venv, нет подписи)
timed_out Превышён timeout_seconds
canceled Отменён оператором

Диагностика

Проверка работоспособности

# статус службы
systemctl status lsus-config-agent

# журнал службы
journalctl -u lsus-config-agent -f

# файловый лог
tail -f /var/log/lsus-config-agent/agent.log

Стартовая строка в логе при успешном запуске: lsus-config-agent <version> запущен (server=<url>).

Ручной запуск spec (dry-run)

Для диагностики playbook'а без сервера есть CLI-обёртка:

/var/lib/lsus-config-agent/venv/bin/python3 /var/lib/lsus-config-agent/lsus_ansible_runner.py <spec.json> [output.json]

Принимает JSON spec (файл или строку), выполняет playbook через тот же AnsibleRunner, печатает результат (или пишет в output.json). Exit-код 0 при successful.

infoЖурналы

  • journal: journalctl -u lsus-config-agent (StandardOutput=journal).
  • Файловый лог: /var/log/lsus-config-agent/agent.log (ротация 5 МБ × 5 копий, уровень INFO).

Связь с lsus-client

Что Как
server_url наследуется из конфигов lsus-client (если не задан в собственном конфиге)
Bearer-токен всегда из /etc/lsus-client/.api_token (тот же, что у lsus-client)
Зависимость пакета Depends: lsus-client (>= <версия>) — обязательная
Автономная работа невозможна — нужен server_url/токен из lsus-client
Heartbeat не шлёт; версию отправляет один раз при старте (POST /clients/ansible/version)

infoВерсия в `config_agent_version`

При старте агент отправляет свою версию (POST /api/v1/clients/ansible/version), сервер записывает её в колонку хоста config_agent_version — видна на вкладке «Хосты → Версии агента».

Регистрация на сервере

lsus-config-agent не регистрируется отдельно — использует регистрацию и Bearer-токен хоста, созданные lsus-client. Просто начинает опрашивать /clients/ansible/runs/pending с тем же токеном. User-Agent во всех запросах: lsus-config-agent/<version>.

Что нужно серверу

Чтобы вкладка Конфигурации появилась в Master и агент начал получать задания, на сервере должны быть:
- созданы плейбуки/профили (через Конструктор политик или импорт);
- создано назначение (профиль → группа/тег/хост) с режимом check/apply;
- на клиентах установлен lsus-config-agent и запущен сервис.

Связанные страницы