Введение
Ручные «разовые» проверки в духе cat /etc/ssh/sshd_config и беглого взгляда на auth.log — это слабое место классического администрирования. Такой подход не масштабируется, плохо повторяется и не оставляет следов для аудита. Решение: формализовать проверку в виде чеклиста и автоматизировать сбор артефактов одним скриптом. В этой статье вы получите пошаговый план и готовый bash‑скрипт, который можно запускать на любых популярных дистрибутивах (Debian/Ubuntu, RHEL/CentOS/Alma, openSUSE, Arch) без разрушающих действий.
Что проверяем (карта аудита)
- Инвентаризация: версия ОС/ядра, среда (VM/metal), кто залогинен.
- Обновления и репозитории: наличие критических апдейтов, корректность источников.
- Доступ и учётные записи: «живые» пользователи, заблокированные, sudo/NOPASSWD.
- SSH‑политика:
PermitRootLogin,PasswordAuthentication, ключи/алгоритмы. - Сеть и брандмауэр: открытые порты, nftables/iptables/ufw.
- Сервисы и автозапуск: включённые и «упавшие» юниты systemd.
- Права и чувствительные файлы: SUID/SGID, world‑writable директории.
- Журналы: ошибки за 7 дней, брутфорс, нестабильные сервисы.
Пошаговый чеклист (коротко)
1) Инвентаризация
hostnamectl # Название ОС/ядра/виртуализация
who -a # Активные сессии
last -n 20 # Последние логины
2) Обновления
# Debian/Ubuntu:
apt-get -s upgrade | grep -E "upgraded|security"
# RHEL/Alma:
dnf check-update || yum check-update
# openSUSE:
zypper lu
# Arch:
pacman -Sup 2>/dev/null
3) Учётные записи и группы
getent passwd | awk -F: '$3>=1000 && $7!="/usr/sbin/nologin"{print $1,$7}' # «Человеческие» пользователи
grep '^sudo\|^wheel' /etc/group # Кто в sudo/wheel
grep -R --no-color -h "NOPASSWD" /etc/sudoers /etc/sudoers.d/* 2>/dev/null # Без пароля?
4) SSH‑настройки
# Фактическая конфигурация, учитывая Include:
sshd -T | egrep 'permitrootlogin|passwordauthentication|pubkeyauthentication|kexalgorithms|ciphers'
ss -tulpn | grep ':22 ' # Кто слушает SSH‑порт
5) Сеть и фаервол
ss -tulpn # Все слушающие порты
nft list ruleset || iptables -S || ufw status verbose
6) Сервисы и автозапуск
systemctl list-unit-files --type=service --state=enabled
systemctl --failed
7) Права и чувствительные файлы
# SUID/SGID (исключаем ядро /proc, /sys, /dev):
find / -path /proc -prune -o -path /sys -prune -o -path /dev -prune \
-o -type f \( -perm -4000 -o -perm -2000 \) -print
# Мирозаписываемые директории только в нужных местах:
find / -xdev -type d -perm -0002 ! -path "/tmp" ! -path "/var/tmp" -print
8) Журналы
journalctl -p err..alert -S -7d # Ошибки/аварии за неделю
grep -iE "failed password|invalid user" /var/log/auth.log* 2>/dev/null | tail -n 200
Автоматизация: один скрипт — один отчёт
Скрипт ниже не вносит изменений, собирает артефакты и делает лог‑файл. Запускайте как root.
#!/usr/bin/env bash
# linux_audit.sh — сбор технического отчёта безопасности
# Использование: sudo bash linux_audit.sh
set -euo pipefail
[[ ${EUID} -ne 0 ]] && { echo "Запустите как root"; exit 1; }
TS="$(date +%Y%m%d-%H%M%S)"
OUTDIR="./audit-${TS}"
LOG="${OUTDIR}/audit.log"
mkdir -p "${OUTDIR}"
# Логируем всё в файл и на экран
exec > >(tee -a "${LOG}") 2>&1
detect_pkg_mgr() {
if command -v apt-get >/dev/null; then echo "apt"; return; fi
if command -v dnf >/dev/null; then echo "dnf"; return; fi
if command -v yum >/dev/null; then echo "yum"; return; fi
if command -v zypper >/dev/null; then echo "zypper"; return; fi
if command -v pacman >/dev/null; then echo "pacman"; return; fi
echo "unknown"
}
PKG_MGR="$(detect_pkg_mgr)"
section() { echo -e "\n=== $* ==="; }
section "Инвентаризация"
hostnamectl || true
echo "Kernel: $(uname -r)"
echo "OS: $(source /etc/os-release 2>/dev/null; echo ${PRETTY_NAME:-unknown})"
who -a
last -n 20 || true
section "Обновления (${PKG_MGR})"
case "${PKG_MGR}" in
apt) apt-get -s upgrade | tee "${OUTDIR}/updates.txt" ;;
dnf) dnf -q check-update || true ;;
yum) yum -q check-update || true ;;
zypper) zypper -q lu || true ;;
pacman) pacman -Sup 2>/dev/null || true ;;
*) echo "Неизвестный менеджер пакетов";;
esac
section "Учётные записи и sudo"
getent passwd | awk -F: '$3>=1000{printf "USER=%s SHELL=%s\n",$1,$7}' | tee "${OUTDIR}/users.txt"
grep -E '^(sudo|wheel):' /etc/group || true
grep -R --no-color -n "NOPASSWD" /etc/sudoers /etc/sudoers.d/* 2>/dev/null || echo "NOPASSWD не найдено"
section "SSH‑настройки и порт"
(sshd -T 2>/dev/null | egrep 'permitrootlogin|passwordauthentication|pubkeyauthentication|kexalgorithms|ciphers') \
| tee "${OUTDIR}/ssh_effective.txt" || echo "sshd -T недоступен"
ss -tulpn | grep -E '(:22\s)|\bsshd\b' || echo "Порт 22 не слушается"
section "Сеть и фаервол"
ss -tulpn | tee "${OUTDIR}/listening.txt"
(nft list ruleset || iptables -S || ufw status verbose) | tee "${OUTDIR}/firewall.txt"
section "Сервисы systemd"
systemctl list-unit-files --type=service --state=enabled | tee "${OUTDIR}/enabled_services.txt"
systemctl --failed || true
section "Права: SUID/SGID и world-writable"
find / -path /proc -prune -o -path /sys -prune -o -path /dev -prune \
-o -type f \( -perm -4000 -o -perm -2000 \) -print | tee "${OUTDIR}/suid_sgid.txt"
find / -xdev -type d -perm -0002 ! -path "/tmp" ! -path "/var/tmp" -print | tee "${OUTDIR}/world_writable_dirs.txt"
section "Журналы за 7 дней"
journalctl -p err..alert -S -7d | tail -n 500 | tee "${OUTDIR}/journal_errors_7d.txt"
grep -iE "failed password|invalid user" /var/log/auth.log* 2>/dev/null | tail -n 300 \
| tee "${OUTDIR}/ssh_bruteforce.txt"
echo -e "\nОтчёт сохранён в: ${OUTDIR}"
Что дальше? Прикладывайте каталог audit-YYYYmmdd-HHMMSS к заявке/тикету, храните в SIEM/ELK или закрепляйте в change‑request.
Мини‑харднинг: базовый sshd_config
# /etc/ssh/sshd_config (фрагмент)
Protocol 2
PermitRootLogin prohibit-password # Лучше 'no', если есть аварийный канал доступа
PasswordAuthentication no # Только ключи; включать временно при онбординге
PubkeyAuthentication yes
KexAlgorithms curve25519-sha256@libssh.org
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512,hmac-sha2-256
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers admin@10.0.0.0/8 devops@192.168.0.0/16 # Ограничьте по пользователям/подсетям
AI‑лайфхак: быстрый разбор логов и плана ремедиации
Скопируйте 50–200 строк из ssh_bruteforce.txt или journal_errors_7d.txt и используйте шаблон:
Ты — эксперт по безопасности Linux. На вход — фрагменты логов (ниже).
1) Сгруппируй инциденты по типам и частоте, выдели активные источники атаки.
2) Дай приоритетный план ремедиации (1–5 шагов) с командами.
3) Сформируй список детектов для systemd-journald/rsyslog и предложения по rate-limit.
Логи:
<вставьте строки журналов>
Контекст: хост prod, SSH по ключам, sudo через группу wheel, есть nftables.
Вывод — в Markdown‑чеклисте.
Что мы узнали
- Структурированный чеклист превращает хаотичный «осмотр сервера» в повторяемую процедуру.
- Один скрипт собирает артефакты по ключевым направлениям: доступ, сеть, журналы, права.
- Мини‑харднинг SSH и анализ логов через AI экономят часы рутины и снижают риск.
Теги: #linux #security #hardening #automation #bash #ai4admin
(Начало рекламного блока)
🚀 Хотите стать архитектором будущего, а не просто админом? Эта статья — лишь верхушка айсберга. В нашем Telegram-канале «Admin Future» мы каждый день публикуем системные гайды, готовые скрипты, AI-лайфхаки и чеклисты, которые не найти в Google. Мы не просто постим команды — мы строим библиотеку знаний для тех, кто хочет расти от админа до архитектора. Подписывайтесь и становитесь экспертом: Admin Future