143 lines
6.4 KiB
Markdown
143 lines
6.4 KiB
Markdown
# Salt baseline для PMG
|
||
|
||
Репозиторий содержит автономный набор Salt states для базовой эксплуатации и hardening Proxmox Mail Gateway.
|
||
|
||
## Что внутри
|
||
|
||
- `top.sls` — привязка состояний к minion ID.
|
||
- `pillar/pmg.sls` — переменные и параметры PMG.
|
||
- `pmg/*.sls` — состояния:
|
||
- `common` (базовые пакеты),
|
||
- `node_exporter` (установка и включение Prometheus node exporter),
|
||
- `smtp_monitoring` (SMTP-метрики: blackbox probe для 25/26 и postfix queue/connection gauges),
|
||
- `ssh_hardening`,
|
||
- `custom_check` (кастомная AV-проверка PMG через KESL),
|
||
- `security_agents` (Wazuh/Qualys),
|
||
- `update` (пакетные обновления + pre/post проверки PMG),
|
||
- `auto_updates` (security-only, без auto reboot),
|
||
- `audit_logging`,
|
||
- `pmg_baseline` (проверка/поддержание сервисов PMG),
|
||
- `verify` (проверки состояния).
|
||
- `pmg/files/*` — шаблоны конфигов.
|
||
|
||
## Требования
|
||
|
||
- Salt (рекомендуется актуальная LTS-ветка).
|
||
- Debian/PMG узлы с systemd.
|
||
- root-доступ на узел.
|
||
|
||
## Быстрый запуск
|
||
|
||
```bash
|
||
make lint
|
||
make check
|
||
make apply
|
||
make verify
|
||
make update-check
|
||
make update
|
||
```
|
||
|
||
По умолчанию `MINION_ID=p-mailgw-x2-01.lmru.tech`. Можно переопределить:
|
||
|
||
```bash
|
||
make check MINION_ID=p-mailgw-x1-01.lmru.tech
|
||
```
|
||
|
||
## Основные переменные
|
||
|
||
Все параметры задаются в `pillar/pmg.sls`:
|
||
|
||
- `pmg.base_packages`
|
||
- `pmg.ssh_allow_users`
|
||
- `pmg.ssh_password_authentication`
|
||
- `pmg.journald_system_max_use`
|
||
- `pmg.journald_max_file_sec`
|
||
- `pmg.node_exporter.*`
|
||
- `pmg.smtp_monitoring.*`
|
||
- `pmg.pmg_services`
|
||
- `pmg.pmg_cluster_only_services`
|
||
- `pmg.cluster_join.*`
|
||
- `pmg.update_dist_upgrade`
|
||
- `pmg.update_auto_reboot`
|
||
- `pmg.update_reboot_delay_minutes`
|
||
- `pmg.custom_check.*`
|
||
- `pmg.manage_hosts_file`
|
||
- `pmg.hosts_file_entries`
|
||
- `pmg.wazuh.*`
|
||
- `pmg.kesl.*`
|
||
- `pmg.klnagent.*`
|
||
- `pmg.qualys.*`
|
||
|
||
`pmg.node_exporter.args` по умолчанию включает textfile collector:
|
||
`--collector.textfile.directory=/var/lib/prometheus/node-exporter`.
|
||
|
||
`pmg.smtp_monitoring` публикует расширенные SMTP метрики в node_exporter:
|
||
- queue total/deferred + age oldest message;
|
||
- SMTP listen/established для портов 25/26;
|
||
- recent window counters (`pmg.smtp_monitoring.log_window_seconds`) по логам postfix:
|
||
sent, received, deferred, bounced, rejected, tls failures, smtp connections.
|
||
|
||
`pmg.cluster_join` делает:
|
||
- precheck passwordless SSH с новой ноды на `pmg.cluster_join.master_ip`;
|
||
- non-interactive `pmgcm join` при заданном `pmg.cluster_join.password`.
|
||
|
||
Важно: `pmgcm join` использует пароль PMG (`root@pam` на master) для получения ticket
|
||
(это не SSH-пароль). Без `pmg.cluster_join.password` state делает skip-уведомление.
|
||
|
||
Рекомендуется передавать пароль через переменную окружения (без сохранения в `pillar/pmg.sls`):
|
||
|
||
```bash
|
||
export PMG_CLUSTER_JOIN_PASSWORD='***'
|
||
PILLAR_B64="$(python3 -c 'import json, os, base64; print(base64.b64encode(json.dumps({\"pmg\": {\"cluster_join\": {\"password\": os.environ[\"PMG_CLUSTER_JOIN_PASSWORD\"]}}}).encode()).decode())')"
|
||
ssh root@p-mailgw-x1-02.lmru.tech "cd /root/mailgw-salt && salt-call --local --id p-mailgw-x1-02.lmru.tech --file-root=. --pillar-root=./pillar state.apply pmg.cluster_join pillar=\"\$(python3 -c \"import base64; print(base64.b64decode(\\\"${PILLAR_B64}\\\").decode())\")\""
|
||
```
|
||
|
||
Для полностью автоматического bootstrap SSH-доверия (без паролей) с управляющей машины:
|
||
|
||
```bash
|
||
make cluster-bootstrap MINION_ID=p-mailgw-x1-02.lmru.tech MASTER_HOST=p-mailgw-x1-01.lmru.tech MASTER_IP=10.80.38.152
|
||
```
|
||
|
||
## Отдельное обновление PMG
|
||
|
||
Перед обновлением:
|
||
|
||
```bash
|
||
make update-check MINION_ID=p-mailgw-x1-01.lmru.tech
|
||
```
|
||
|
||
Применение:
|
||
|
||
```bash
|
||
make update MINION_ID=p-mailgw-x1-01.lmru.tech
|
||
make verify MINION_ID=p-mailgw-x1-01.lmru.tech
|
||
```
|
||
|
||
State `pmg.update` выполняет:
|
||
- precheck кластера (`pmgcm status`);
|
||
- precheck критичных PMG сервисов;
|
||
- пакетное обновление (`pkg.uptodate`, с `dist_upgrade` по `pmg.update_dist_upgrade=true`);
|
||
- postcheck кластера и сервисов;
|
||
- уведомление, если требуется reboot (`/var/run/reboot-required`).
|
||
- опциональный автоперезапуск по `pmg.update_auto_reboot=true` (через `shutdown -r +N`).
|
||
|
||
## PMG custom check (Kaspersky)
|
||
|
||
Коротко про `pmg.custom_check`:
|
||
- готовит окружение (`pwgen`, `/var/log/mail_av`, `/usr/local/bin/pmg-custom-check`);
|
||
- готовит Kaspersky-учетку (`pmg.custom_check.ksc_superuser.*`; сейчас `superuser` + `NOPASSWD`);
|
||
- настраивает исключения KESL из сканирования через `pmg.custom_check.kesl_excluded_paths`
|
||
(по умолчанию: `/var/spool/pmg`, `/var/lib/clamav`, `/tmp/.proxdump_*`) и делает
|
||
`systemctl restart kesl` только при изменении этих настроек;
|
||
- если `kesl/klnagent64` установлены — включает сервисы и `custom_check` в PMG, если нет — выводит уведомление "ставится через Kaspersky Administration Center"; сервисы включатся вторым прогоном после установки пакетов.
|
||
|
||
`pmg.security_agents` дополнительно ставит/настраивает `kesl` и `klnagent64`:
|
||
- для `kesl`:
|
||
- скачивает `.deb` из `pmg.kesl.package_url`;
|
||
- формирует `autoinstall.ini` и запускает `/opt/kaspersky/kesl/bin/kesl-setup.pl --autoinstall=...`;
|
||
- поднимает сервис `kesl`;
|
||
- скачивает `.deb` из `pmg.klnagent.package_url`;
|
||
- формирует файл ответов `KLAUTOANSWERS` (минимум: `KLNAGENT_SERVER`,
|
||
`KLNAGENT_AUTOINSTALL`, `EULA_ACCEPTED`);
|
||
- устанавливает/переустанавливает пакет в тихом режиме и поднимает сервис `klnagent64`.
|