Skip to content

Instantly share code, notes, and snippets.

@YogSottot
Created January 31, 2025 15:25
Show Gist options
  • Save YogSottot/0d59f202b1078329c75dd54f6d398552 to your computer and use it in GitHub Desktop.
Save YogSottot/0d59f202b1078329c75dd54f6d398552 to your computer and use it in GitHub Desktop.
zabbix SSH-Local Auth Linux
#!/usr/bin/env bash
# 21.06.2022 Рабочий Авторизованные пользователи Linux
# Автор Мамзиков Артём Андреевич
# https://diyit.ru/viewtopic.php?t=1994
IP=$1
PORT=${2:-10050}
HOSTHOST=$3
# Get the ignore lists from macros
SSH_IP_IGNORE=${4:-""}
SSH_USER_IGNORE=${5:-""}
# На основе команды who будем формировать лог/журнал для передачи в заббикс
authlist=$(zabbix_get -s $IP -p $PORT -k system.run["who -dsTu"] | grep -v tmux | sed 's/\s\+/ /g')
# Обработаем построчно
IFS=$'\n'
for strokami in $authlist; do
# Выбираем строки авторизации, кроме строк выхода
strauth=$(echo "$strokami" | grep -Eiv 'exit|выход')
if [[ "$strauth" != "" ]]; then
# Получим ID сессии для ключа
idsession=$(echo "$strokami" | sed -E 's|.*[0-9]+:[0-9]+ ||' | sed 's|^[A-Za-zA-Яа-я]\+ ||' | sed 's/(.*\|id.*//' | tr -d ' ' | grep -oe '[0-9]\+')
# Пользователь
authuser=$(echo "$strauth" | awk '{print $1}')
# IP адрес (извлекаем из скобок)
authip=$(echo "$strauth" | grep -oP '\(\K[^\)]+' || echo "N/A")
# Check if the user or IP is in the ignore list
if [[ ! "$authip" =~ (^|[[:space:]])$SSH_IP_IGNORE($|[[:space:]]) ]] && [[ ! "$authuser" =~ (^|[[:space:]])$SSH_USER_IGNORE($|[[:space:]]) ]]; then
# Формируем список
JSON=$JSON"$SEP\n{\"{#AUTHID}\":\"$idsession\",\"{#AUTHUSER}\":\"$authuser\", \"{#AUTHIP}\":\"$authip\", \"{#STAUTH}\":\"$strauth\"}"
SEP=", "
fi
fi
done
# Выводим результат в json
JSON="["$JSON"\n]"
echo -e "${JSON}"
# Для того чтоб ввести триггер сразу в ошибку нужно передать данные в элемент сразу после обнаружения, еще раз цикл(
# IFS=$'\n'
# for strokami in $authlist;do
# strauth=$(echo "$strokami" | grep -Eiv 'exit|выход')
# idsession=$(echo "$strokami" | sed -E 's|.*[0-9]+:[0-9]+ ||' | sed 's|^[A-Za-zA-Яа-я]\+ ||' | sed 's/(.*\|id.*//' | tr -d ' ' | grep -oe '[0-9]\+')
# if [[ "$strauth" != "" ]]; then
# zabbix_sender -z 127.0.0.1 -p 10051 -s "${HOSTHOST}" -k authuser[\""${idsession}"\"] -o "1" > /dev/null
# fi
# done
zabbix_export:
version: '7.0'
template_groups:
- uuid: 6bdf2c96bf374172a0e108c0e1ddb355
name: 'Линукс Сервера/Linux servers'
templates:
- uuid: a809457c33424690851a69f7777f5882
template: 'SSH-Local Auth Linux'
name: 'SSH-Local Auth Linux'
description: |
На основе команд
who
lsof -n -a -itcp -stcp:established -c sshd
netstat -tnpa | grep 'ESTABLISHED.*sshd' устаревшая команда
ss -o state established '( dport = :ssh or sport = :ssh )'
*Если вход выполнен под user а после сделан переход в терминале под su (root) Этого будет не видно! останется user!
groups:
- name: 'Линукс Сервера/Linux servers'
items:
- uuid: 6916f72e03c54663a3d5977e9e525d0c
name: 'who Кто в системе'
key: 'system.run["who -dsTu"]'
history: 1h
value_type: TEXT
trends: '0'
status: DISABLED
description: |
system.run["who -a|tail -n +3"]
system.run["who -aH"]
информации о пользователях, которые подключены к системе
-a (--all) — включает в себя все основные опции.
- b (--boot) — показывает время загрузки операционной системы.
-d (--dead) — выводит перечень зомби-процессов.
- H (--heading) — никак не влияет на получаемую информацию, зато добавляет колонкам заголовки и помогает понять что где находится.
-m — показать пользователя, который сейчас работает в терминале.
-r — вывести текущий уровень запуска (runinit);
-t — показать последнее изменение системных часов;
-s — вывести только имя, терминальную сессию и время.
-q — вывести количество авторизованных пользователей.
-T — данные о терминальной сессии.
-u — показать активных пользователей.
--ips — вместо названия хостов показывает ips.
--lookup — используется в сочетании с --ips, выводит данные, которые основываются на сохраненном IP, если он доступен, а не на названии хоста
-a В состав этой опции входят опции -b, -d, --login, -p, -r, -t, -T, -u
tags:
- tag: Application
value: 'Авторизация SSH'
discovery_rules:
- uuid: ed895f4708344efb9c97b7e54450a80d
name: 'Обнаружение пользователей выполнивших вход в ОС'
type: EXTERNAL
key: 'authlinuxlld.sh[{HOST.CONN},{$HOST.PORTS},{HOST.HOST},{$SSH_IP_IGNORE},{$SSH_USER_IGNORE}]'
lifetime_type: DELETE_IMMEDIATELY
lifetime: '0'
description: |
На основе вывода команды who -dsTu
Найденные пользователи сразу будут выводить триггер в ошибку, после пропадания в списке обнаружения пользователя, пропадание триггера.
item_prototypes:
- uuid: fc221c64ef0d4ca1886b98bed05b9f87
name: 'Auth-User: {#STAUTH}'
type: TRAP
key: 'authuser["{#AUTHID}"]'
delay: '0'
history: 1h
trends: 0d
description: 'Временный элемент, создается пока пользователь {#AUTHUSER} находится в ОС Linux .'
tags:
- tag: Application
value: 'Авторизация SSH'
trigger_prototypes:
- uuid: 5f14dd35f8dc44bda99ec38716a7e399
expression: |
last(/SSH-Local Auth Linux/authuser["{#AUTHID}"])=1 or
nodata(/SSH-Local Auth Linux/authuser["{#AUTHID}"],35s)=1
name: 'Auth-User: {#STAUTH}'
priority: INFO
description: |
Триггер создается пока пользователь: {#AUTHUSER} находится на {HOSTNAME}
(:0) - Локальный Вход
{#STAUTH}
manual_close: 'YES'
macros:
- macro: '{$HOST.PORTS}'
value: '10050'
- macro: '{$SSH_IP_IGNORE}'
value: (1.1.1.1|2.2.2.2)
description: 'List in parentheses separated by a vertical line'
- macro: '{$SSH_USER_IGNORE}'
description: 'List in parentheses separated by a vertical line'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment