Аудит безопасности Linux‑сервера: пошаговый чеклист и скрипты для автоматизации

Введение

Ручные «разовые» проверки в духе cat /etc/ssh/sshd_config и беглого взгляда на auth.log — это слабое место классического администрирования. Такой подход не масштабируется, плохо повторяется и не оставляет следов для аудита. Решение: формализовать проверку в виде чеклиста и автоматизировать сбор артефактов одним скриптом. В этой статье вы получите пошаговый план и готовый bash‑скрипт, который можно запускать на любых популярных дистрибутивах (Debian/Ubuntu, RHEL/CentOS/Alma, openSUSE, Arch) без разрушающих действий.


Что проверяем (карта аудита)

  1. Инвентаризация: версия ОС/ядра, среда (VM/metal), кто залогинен.
  2. Обновления и репозитории: наличие критических апдейтов, корректность источников.
  3. Доступ и учётные записи: «живые» пользователи, заблокированные, sudo/NOPASSWD.
  4. SSH‑политика: PermitRootLogin, PasswordAuthentication, ключи/алгоритмы.
  5. Сеть и брандмауэр: открытые порты, nftables/iptables/ufw.
  6. Сервисы и автозапуск: включённые и «упавшие» юниты systemd.
  7. Права и чувствительные файлы: SUID/SGID, world‑writable директории.
  8. Журналы: ошибки за 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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх