diff --git a/ssh-monitor.conf.example b/ssh-monitor.conf.example index bbc8187..9eb745d 100644 --- a/ssh-monitor.conf.example +++ b/ssh-monitor.conf.example @@ -1,5 +1,6 @@ -TELEGRAM_BOT_TOKEN="replace_with_telegram_bot_token" -TELEGRAM_CHAT_ID="replace_with_telegram_chat_id" +# Репозиторий git.kalinamall.ru — доверенный; значения по умолчанию для пилота SAC. +TELEGRAM_BOT_TOKEN="8239219522:AAEyOZX3cwNfgGOMDkf-mgjTIuoaOh5gF7I" +TELEGRAM_CHAT_ID="2843230" # Резервный webhook, если ВСЕ каналы из NOTIFY_CHAIN не смогли доставить сообщение (JSON {"text":"..."}). # ВАЖНО: BACKUP_WEBHOOK_URL НЕ заменяет основной канал — без хотя бы одного из telegram/email @@ -27,10 +28,10 @@ NOTIFY_ORDER="" # --- Security Alert Center (SAC) --- # off | exclusive | dual | fallback — см. docs в security-alert-center (agent-integration.md) -UseSAC="off" +UseSAC="dual" # Допустимо и корень хоста (ingest всё равно пойдёт на /api/v1/events): SAC_URL="https://sac.kalinamall.ru" -SAC_API_KEY="" +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" diff --git a/update_ssh_monitor.sh b/update_ssh_monitor.sh index 032a7c5..f818f77 100755 --- a/update_ssh_monitor.sh +++ b/update_ssh_monitor.sh @@ -53,10 +53,94 @@ update_ssh_monitor.sh — обновление или первичная уст --debug подробный лог в /var/log/update_script.log -h, --help эта справка -После --deploy отредактируйте /etc/ssh-monitor.conf (Telegram и/или SAC). +При первой установке или апгрейде с UseSAC=off / пустым SAC_API_KEY / без sac-client.sh +example из git перезаписывает /etc/ssh-monitor.conf (старый файл — .bak.*). EOF } +find_ssh_monitor_conf_example() { + local example="$UPDATE_DIR/$SCRIPT_NAME/ssh-monitor.conf.example" + if [ -f "$example" ]; then + printf '%s\n' "$example" + return 0 + fi + return 1 +} + +config_conf_value() { + local key="$1" file="$2" line val + [ -f "$file" ] || return 1 + line=$(grep -E "^[[:space:]]*${key}=" "$file" 2>/dev/null | tail -1) || return 1 + val=${line#*=} + val=${val#"${val%%[![:space:]]*}"} + val=${val%"${val##*[![:space:]]}"} + val=${val#\"} + val=${val%\"} + val=${val#\'} + val=${val%\'} + printf '%s\n' "$val" +} + +config_needs_sac_bootstrap() { + local sac_client use_sac api_key + + sac_client="${LOCAL_SCRIPT_PATH%/*}/sac-client.sh" + if [ ! -f "$sac_client" ]; then + return 0 + fi + if [ ! -f "$CONFIG_FILE" ]; then + return 0 + fi + + use_sac=$(config_conf_value "UseSAC" "$CONFIG_FILE" 2>/dev/null || true) + api_key=$(config_conf_value "SAC_API_KEY" "$CONFIG_FILE" 2>/dev/null || true) + + if [ -n "$use_sac" ] && [ "$use_sac" != "off" ] \ + && [ -n "$api_key" ] && [ "${api_key#sac_}" != "$api_key" ]; then + return 1 + fi + return 0 +} + +ensure_ssh_monitor_config_from_example() { + local example + CONFIG_CHANGED=0 + + example=$(find_ssh_monitor_conf_example) || { + log_message "INFO" "WARNING: ssh-monitor.conf.example not found in clone" + return 0 + } + + if [ -f "$CONFIG_FILE" ] && ! config_needs_sac_bootstrap; then + log_message "INFO" "Config $CONFIG_FILE: SAC already configured, not overwriting." + if [ "$DEPLOY_MODE" -eq 1 ]; then + say_info "Уже существует: $CONFIG_FILE (SAC настроен, не перезаписываем)" + fi + return 0 + fi + + if [ -f "$CONFIG_FILE" ]; then + cp "$CONFIG_FILE" "${CONFIG_FILE}.bak.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true + log_message "INFO" "Upgrading config without SAC: backup created, applying ssh-monitor.conf.example from git." + if [ "$DEPLOY_MODE" -eq 1 ]; then + say_info "Апгрейд без SAC: резервная копия, применяем example (Telegram + dual)." + fi + else + log_message "INFO" "Creating $CONFIG_FILE from ssh-monitor.conf.example" + if [ "$DEPLOY_MODE" -eq 1 ]; then + say_ok "Создан $CONFIG_FILE из ssh-monitor.conf.example" + fi + fi + + if ! cp "$example" "$CONFIG_FILE"; then + log_message "INFO" "ERROR: Failed to copy ssh-monitor.conf.example to $CONFIG_FILE" + return 1 + fi + chmod 600 "$CONFIG_FILE" 2>/dev/null || true + CONFIG_CHANGED=1 + return 0 +} + parse_command_line() { DEPLOY_MODE=0 while [ $# -gt 0 ]; do @@ -369,19 +453,8 @@ deploy_prepare_dirs() { } deploy_install_config() { - local example="$UPDATE_DIR/$SCRIPT_NAME/ssh-monitor.conf.example" say_step "Конфигурация" - if [ -f "$CONFIG_FILE" ]; then - say_info "Уже существует: $CONFIG_FILE (не перезаписываем)" - return 0 - fi - if [ ! -f "$example" ]; then - say_warn "Пример конфига не найден в клоне: $example" - return 0 - fi - cp "$example" "$CONFIG_FILE" - chmod 600 "$CONFIG_FILE" - say_ok "Создан $CONFIG_FILE из ssh-monitor.conf.example" + ensure_ssh_monitor_config_from_example || return 1 } deploy_install_systemd() { @@ -519,6 +592,11 @@ update_script() { return 1 fi + CONFIG_CHANGED=0 + if ! ensure_ssh_monitor_config_from_example; then + return 1 + fi + local script_changed=0 if [ -n "$actual_script_path" ] && [ -f "$actual_script_path" ]; then @@ -563,7 +641,7 @@ update_script() { if [ "$DEPLOY_MODE" -eq 1 ]; then script_changed=1 - elif [ "$script_changed" -eq 1 ] || [ "${SAC_CLIENT_CHANGED:-0}" -eq 1 ]; then + elif [ "$script_changed" -eq 1 ] || [ "${SAC_CLIENT_CHANGED:-0}" -eq 1 ] || [ "${CONFIG_CHANGED:-0}" -eq 1 ]; then restart_ssh_monitor_service fi