Клиент 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
Pull-модель
Агент сам опрашивает сервер (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-токена |
Порядок установки
Сначала 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.
Приоритет чтения настроек¶
[server] server_urlиз собственного конфига (если задан);/etc/lsus-client/lsus-client.confили/etc/lsus-client/lsus-client-common.conf— секция[server], ключиserver_urlилиmaster_server_url;- 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
ConditionPathExists
Сервис не стартует, пока 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'ом¶
- GET pending —
GET /api/v1/clients/ansible/runs/pending(получает список ожидающих прогонов, до 10 за раз, с учётомnext_poll_secondsот сервера). - GET spec —
GET /clients/ansible/runs/<id>(контент playbook, Ed25519-подпись,content_type,assets[], расшифрованный vault-секрет — только по TLS). - Доставка ассетов — скачивание файлов-нагрузок (сертификаты, конфиги, дистрибутивы ПО), проверка sha256 + Ed25519, установка mode/owner.
- Проверка подписи — обязательная проверка Ed25519-подписи контента playbook перед выполнением.
- Запуск —
ansible-playbook -i localhost, -c local --check|--becomeчерез venv, с таймаутом из spec (по умолчанию 1800 с). - Прогресс — live-обновления
POST /runs/<id>/progress(фаза, задача). - Артефакты — загрузка собранных файлов (логи, отчёты) обратно на сервер.
- Результат —
POST /runs/<id>/result(status, recapok/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.
Журналы
- 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) |
Версия в `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 и запущен сервис.
Связанные страницы¶
- Клиент LSUS — базовый агент (heartbeat, обновления).
- Конфигурации — серверная часть: профили, плейбуки, назначения, конструктор.
- Windows-агент — для Windows (PowerShell вместо Ansible).
- Развёртывание серверов — установка Master.