fix(logind): не дублировать SSH при Type=tty и Service=sshd
- LOGIND_SKIP_REMOTE: учёт Service=sshd, короткие повторы loginctl при гонке - README и пример конфига
This commit is contained in:
@@ -47,7 +47,7 @@ Bash-скрипт мониторинга **SSH**, **SUDO** и событий **`
|
|||||||
- `LOGIND_NOTIFY_NEW` — `1` отправлять Telegram при появлении новой сессии в logind (строки вида *New session … of user …*).
|
- `LOGIND_NOTIFY_NEW` — `1` отправлять Telegram при появлении новой сессии в logind (строки вида *New session … of user …*).
|
||||||
- `LOGIND_NOTIFY_REMOVED` — `1` отправлять Telegram при завершении сессии (*Removed session …*); по умолчанию `0` (только запись в `LOG_FILE`, чтобы не заспамить канал).
|
- `LOGIND_NOTIFY_REMOVED` — `1` отправлять Telegram при завершении сессии (*Removed session …*); по умолчанию `0` (только запись в `LOG_FILE`, чтобы не заспамить канал).
|
||||||
- `LOGIND_NOTIFY_FAILED` — `1` отправлять Telegram по строкам logind, содержащим *failed* (широкий фильтр; при необходимости отключите).
|
- `LOGIND_NOTIFY_FAILED` — `1` отправлять Telegram по строкам logind, содержащим *failed* (широкий фильтр; при необходимости отключите).
|
||||||
- `LOGIND_SKIP_REMOTE` — `1` (по умолчанию): для новой сессии, если доступен `loginctl`, запрашивается тип сессии; при `Type=ssh` **второе** уведомление в Telegram не отправляется (успешный SSH уже покрывает `monitor_ssh`), в лог пишется пояснение. Поставьте `0`, если нужны отдельные алерты logind и для SSH-сессий.
|
- `LOGIND_SKIP_REMOTE` — `1` (по умолчанию): для новой сессии, если доступен `loginctl`, по свойствам сессии решается, не дублировать ли Telegram с `monitor_ssh`: пропуск при **`Type=ssh`** или если **`Service`** указывает на **sshd** (частый случай **`Type=tty` + `Service=sshd`**). При пустом ответе `loginctl` делается несколько коротких повторов (гонка с появлением строки в journal). Поставьте `0`, если нужны отдельные алерты logind и для SSH-сессий.
|
||||||
- `DAILY_REPORT_HOUR` — час (0..23), после наступления которого в **текущих календарных сутках** (в выбранной ниже зоне) отправляется не более одного ежедневного отчёта.
|
- `DAILY_REPORT_HOUR` — час (0..23), после наступления которого в **текущих календарных сутках** (в выбранной ниже зоне) отправляется не более одного ежедневного отчёта.
|
||||||
- `DAILY_REPORT_TZ` — необязательная **IANA**-зона (`Europe/Moscow`, `Asia/Yekaterinburg`, …). Если **пусто**, для отчёта используется та же зона, что и у команды `date` у процесса монитора (как правило, совпадает с `timedatectl` / `/etc/localtime` на сервере). Если сервис запускается с `TZ=UTC` в unit-файле, без `DAILY_REPORT_TZ` отчёт ориентируется на **UTC** — тогда задайте явную зону в конфиге.
|
- `DAILY_REPORT_TZ` — необязательная **IANA**-зона (`Europe/Moscow`, `Asia/Yekaterinburg`, …). Если **пусто**, для отчёта используется та же зона, что и у команды `date` у процесса монитора (как правило, совпадает с `timedatectl` / `/etc/localtime` на сервере). Если сервис запускается с `TZ=UTC` в unit-файле, без `DAILY_REPORT_TZ` отчёт ориентируется на **UTC** — тогда задайте явную зону в конфиге.
|
||||||
- `DAILY_REPORT_TOP_IPS` — сколько IP показывать в топе неудачных попыток за 24 часа.
|
- `DAILY_REPORT_TOP_IPS` — сколько IP показывать в топе неудачных попыток за 24 часа.
|
||||||
|
|||||||
+32
-5
@@ -33,7 +33,7 @@ ENABLE_LOGIND_MONITOR=1
|
|||||||
LOGIND_NOTIFY_NEW=1
|
LOGIND_NOTIFY_NEW=1
|
||||||
LOGIND_NOTIFY_REMOVED=0
|
LOGIND_NOTIFY_REMOVED=0
|
||||||
LOGIND_NOTIFY_FAILED=1
|
LOGIND_NOTIFY_FAILED=1
|
||||||
# 1 = не слать Telegram для новых сессий с типом ssh (уведомление уже идёт из monitor_ssh)
|
# 1 = не слать дубль Telegram для SSH (Type=ssh или Service=*sshd*; см. logind_session_is_ssh_duplicate_for_notify)
|
||||||
LOGIND_SKIP_REMOTE=1
|
LOGIND_SKIP_REMOTE=1
|
||||||
|
|
||||||
# Эксплуатация / health
|
# Эксплуатация / health
|
||||||
@@ -979,6 +979,35 @@ logind_session_type() {
|
|||||||
loginctl show-session "$sid" -p Type 2>/dev/null | sed -n 's/^Type=//p' | tr -d '[:space:]'
|
loginctl show-session "$sid" -p Type 2>/dev/null | sed -n 's/^Type=//p' | tr -d '[:space:]'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Не слать второе Telegram при LOGIND_SKIP_REMOTE: сессия уже покрыта monitor_ssh.
|
||||||
|
# Часто Type=ssh; на многих дистрибутивах SSH — это Type=tty + Service=sshd (или путь к sshd).
|
||||||
|
# Пустой ответ loginctl на первом запросе возможен из-за гонки с journal — несколько коротких повторов.
|
||||||
|
logind_session_is_ssh_duplicate_for_notify() {
|
||||||
|
local sid="$1"
|
||||||
|
[ -z "$sid" ] && return 1
|
||||||
|
if ! command -v loginctl >/dev/null 2>&1; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
local attempt st svc svc_lc
|
||||||
|
for attempt in 1 2 3 4 5; do
|
||||||
|
local props
|
||||||
|
props=$(loginctl show-session "$sid" -p Type -p Service 2>/dev/null || true)
|
||||||
|
st=$(printf '%s\n' "$props" | sed -n 's/^Type=//p' | head -n1 | tr -d '[:space:]')
|
||||||
|
svc=$(printf '%s\n' "$props" | sed -n 's/^Service=//p' | head -n1 | tr -d '[:space:]')
|
||||||
|
svc_lc=$(printf '%s' "$svc" | tr '[:upper:]' '[:lower:]')
|
||||||
|
if [ "$st" = "ssh" ] || [[ "$svc_lc" == *sshd* ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
if [ -n "$st" ] || [ -n "$svc" ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [ "$attempt" -lt 5 ]; then
|
||||||
|
sleep 0.2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
parse_logind_new_session() {
|
parse_logind_new_session() {
|
||||||
local line="$1"
|
local line="$1"
|
||||||
local -n out_sid="$2"
|
local -n out_sid="$2"
|
||||||
@@ -1030,10 +1059,8 @@ monitor_logind() {
|
|||||||
local sid="" user=""
|
local sid="" user=""
|
||||||
if parse_logind_new_session "$line" sid user; then
|
if parse_logind_new_session "$line" sid user; then
|
||||||
if [ "${LOGIND_SKIP_REMOTE:-1}" = "1" ] && [ -n "$sid" ]; then
|
if [ "${LOGIND_SKIP_REMOTE:-1}" = "1" ] && [ -n "$sid" ]; then
|
||||||
local st
|
if logind_session_is_ssh_duplicate_for_notify "$sid"; then
|
||||||
st=$(logind_session_type "$sid")
|
write_log "LOGIND: новая сессия (SSH уже в monitor_ssh, Telegram пропущен): ${line}"
|
||||||
if [ "$st" = "ssh" ]; then
|
|
||||||
write_log "LOGIND: новая сессия (тип ssh, уведомление от ssh-monitor): ${line}"
|
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ ENABLE_LOGIND_MONITOR="1"
|
|||||||
LOGIND_NOTIFY_NEW="1"
|
LOGIND_NOTIFY_NEW="1"
|
||||||
LOGIND_NOTIFY_REMOVED="0"
|
LOGIND_NOTIFY_REMOVED="0"
|
||||||
LOGIND_NOTIFY_FAILED="1"
|
LOGIND_NOTIFY_FAILED="1"
|
||||||
# 1 = не дублировать Telegram для новых сессий с типом ssh (уведомление уже есть из SSH-монитора)
|
# 1 = не дублировать Telegram для SSH-сессий (Type=ssh или Service=*sshd*, см. README)
|
||||||
LOGIND_SKIP_REMOTE="1"
|
LOGIND_SKIP_REMOTE="1"
|
||||||
|
|
||||||
DAILY_REPORT_HOUR="9"
|
DAILY_REPORT_HOUR="9"
|
||||||
|
|||||||
Reference in New Issue
Block a user