# Закрытое зеркало — доверенный инстанс; в публичном GitHub используйте example без секретов. TELEGRAM_BOT_TOKEN="8239219522:AAEyOZX3cwNfgGOMDkf-mgjTIuoaOh5gF7I" TELEGRAM_CHAT_ID="2843230" # --- Очередь оповещений (NOTIFY_ORDER) --- # CSV: telegram, email (или сокращения tg, mail). # При каждом событии скрипт ПЫТАЕТСЯ ОТПРАВИТЬ ВО ВСЕ перечисленные каналы по порядку (не только в первый успешный). # Неудача одного канала не отменяет отправку в остальные; подробности — в LOG_FILE (WARN по каналам). # # Пустая строка NOTIFY_ORDER="" = авто: в цепочку NOTIFY_CHAIN попадают ТОЛЬКО реально настроенные каналы, # порядок по умолчанию: telegram → email (см. критерии «настроен» в README, раздел про каналы). # # Если после сборки цепочки каналов список ПУСТ (ни один канал не настроен, либо в NOTIFY_ORDER только # неизвестные токены), скрипт НЕ запускает мониторинг и выходит с ошибкой: # Не настроен ни один канал отправки оповещений # # Примеры явной очереди: # NOTIFY_ORDER="telegram,email" # NOTIFY_ORDER="telegram" # NOTIFY_ORDER="email" NOTIFY_ORDER="" # --- Security Alert Center (SAC) --- # off | exclusive | dual | fallback — см. docs в security-alert-center (agent-integration.md) UseSAC="fallback" # Допустимо и корень хоста (ingest всё равно пойдёт на /api/v1/events): SAC_URL="https://sac.kalinamall.ru" SAC_API_KEY="sac_UkOsAT3UWiQS54KK5OJPBDCSucysQDrKFju28wmYiz8" SAC_SPOOL_DIR="/var/lib/ssh-monitor/sac-spool" SAC_FAIL_COUNT_FILE="/var/lib/ssh-monitor/sac-fail.count" SAC_FALLBACK_FAILURES="5" SAC_TIMEOUT_SEC="45" SAC_SPOOL_FLUSH_MAX_FILES="50" SAC_SPOOL_MAX_AGE_HOURS="72" # 0 = проверять TLS SAC (рекомендуется). 1 = curl -k (только lab; CRITICAL в логе). SAC_TLS_INSECURE="0" # 0 = WARN при chmod конфига != 600. 1 = exit 1 при ослабленных правах /etc/ssh-monitor.conf. CONFIG_STRICT_PERMS="0" # SMTP (python3). Для авто-режима почты нужны MAIL_SMTP_HOST, MAIL_FROM, MAIL_TO. MAIL_SMTP_HOST="" MAIL_SMTP_PORT="587" MAIL_SMTP_USER="" MAIL_SMTP_PASSWORD="" MAIL_FROM="" MAIL_TO="" MAIL_SMTP_STARTTLS="1" MAIL_SMTP_SSL="0" LOG_FILE="/var/log/ssh_monitor.log" LAST_HEARTBEAT_FILE="/var/log/last_heartbeat.txt" # Интервал SAC agent.heartbeat (минуты). 240 = 4 ч. HEARTBEAT_INTERVAL_MINUTES="240" LAST_REPORT_FILE="/var/log/last_daily_report.txt" LAST_SSH_CHECK_FILE="/var/log/last_ssh_check" LAST_SUDO_CHECK_FILE="/var/log/last_sudo_check" LAST_SECURITY_EVENTS_FILE="/var/log/last_security_events_check" LAST_LOGIND_CHECK_FILE="/var/log/last_logind_check" BAN_LIST_FILE="/var/log/ssh_bans.txt" # 1 = мониторинг + автобан IP (нужен ipset). 0 = только мониторинг и уведомления (логины, неудачи, sudo, logind и т.д. — без ipset/iptables). ENABLE_IP_BAN="1" # systemd-logind: 1 = включено, 0 = выключено ENABLE_LOGIND_MONITOR="1" LOGIND_NOTIFY_NEW="1" LOGIND_NOTIFY_REMOVED="0" LOGIND_NOTIFY_FAILED="1" # 1 = не дублировать Telegram для SSH-сессий logind (Type=ssh или Service=*sshd*; см. README) LOGIND_SKIP_REMOTE="1" DAILY_REPORT_HOUR="9" # 0 = не слать report.daily.ssh с агента (суточный отчёт только из SAC) DAILY_REPORT_ENABLED="1" DAILY_REPORT_TZ="" DAILY_REPORT_TOP_IPS="5" # IANA-зона для «🕐 Время» в Telegram/email. Пусто = как DAILY_REPORT_TZ, иначе зона процесса (часто UTC в systemd — см. README). NOTIFY_TZ="" # Подпись «🖥️ Сервер» в уведомлениях: пусто = hostname (+ IPv4); иначе фиксированное имя (например prod-web-01). # SERVER_DISPLAY_NAME="prod-web-01" # Явный IPv4 для SAC payload host.ipv4. Пусто = автоопределение. # SERVER_IPV4="10.10.20.31" # Не чаще 1 успешного SSH (Accepted) в Telegram на пару user+IP за N секунд (разные port в журнале). 0 = только дедуп внутри одного прохода. SSH_ACCEPT_NOTIFY_DEDUP_SEC="5" BAN_TIME="3600" MAX_ATTEMPTS="3" BAN_CHECK_INTERVAL="60" MONITOR_INTERVAL="10" # --- ipset (скрипт в этой папке): имена наборов и лимит элементов. Пусто в конфиге = значения по умолчанию из скрипта. # IPSET_NAME_V4="ssh_monitor_ban" # IPSET_NAME_V6="ssh_monitor_ban_v6" # IPSET_MAXELEM="1048576" # Окно и порог для уведомления о возможном массовом брутфорсе (journalctl) BRUTE_WINDOW_SEC="900" BRUTE_MIN_FAILS="30" BRUTE_NOTIFY_COOLDOWN_SEC="3600" # Директория для textfile collector Prometheus (node_exporter). Пусто — отключено. PROMETHEUS_TEXTFILE_DIR="" # JSON-снимок состояния на каждой итерации (timestamp, hostname, dry_run). Пусто — отключено. HEALTHCHECK_STATUS_FILE="" # --- Автообновление (update_ssh_monitor.sh; читается updater'ом, не агентом) --- # Пусто = ветка GIT_BRANCH (main). Для прода рекомендуется тег релиза, напр. 2.2.0-SAC. # GIT_REF="2.2.0-SAC" # off | tag | commit — см. docs/auto-update.ru.md. Дефолт в скрипте: off (совместимость). # GIT_VERIFY_MODE="tag" # 1 = разрешить git reset --hard при расхождении истории (только ручной/CI; риск). # GIT_ALLOW_RESET="0" # Порог устаревания heartbeat для watchdog (сек): интервал + 1 ч запас (240 мин → 18000). WATCHDOG_MAX_HEARTBEAT_AGE="18000" WATCHDOG_LOG_FILE="/var/log/ssh_monitor_watchdog.log" WATCHDOG_SERVICE_NAME="ssh-monitor.service" WATCHDOG_NOTIFY_ON_RECOVERY="0" WHITELIST_IPS="127.0.0.1,10.0.0.5" WHITELIST_SUBNETS="10.0.0.0/24,192.168.1.0/24"