net/check/zadanie3/hq-srv.sh

117 lines
6.9 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# ============================================================
# ПРОВЕРКА ЗАДАНИЯ 3 — HQ-SRV: сертификаты, atop, CUPS, fail2ban
# (только читает состояние; openssl / lpstat / fail2ban-client
# могут требовать root — иначе ПРОПУЩЕНО)
# Кибер Бэкап — вручную (в конце список).
# ============================================================
NAME="hq-srv"
LOG="check_${NAME}_z3.txt"
OK=0; FAIL=0; SKIP=0
ok() { echo "[OK] $1"; OK=$((OK+1)); }
fail() { echo "[FAIL] $1 — $2"; FAIL=$((FAIL+1)); }
skip() { echo "[ПРОПУЩЕНО] $1"; SKIP=$((SKIP+1)); }
root_or_skip() { if [[ $EUID -ne 0 ]]; then skip "$1 (нужен root)"; return 1; fi; return 0; }
check_var() { if [[ -z "${!2}" ]]; then skip "$1 — не задано $2"; return 1; fi; return 0; }
expect_eq() { if [[ "$3" == "$2" ]]; then ok "$1"; else fail "$1" "ожидалось '$2', получено '$3'"; fi; }
# ================= ПЕРЕМЕННЫЕ (заполните для проверки) =================
CA_DIR="/etc/CA" # каталог ЦС из настройки
CERT_NAMES="web.au-team.irpo docker.au-team.irpo" # домены, которые выданы
ATOP_CONF="/etc/sysconfig/atop" # ПРОВЕРИТЬ путь на РЕД ОС 8
ATOP_INTERVAL="420" # интервал 7 минут (в секундах)
PDF_PRINTER="pdf" # принтер по заданию
F2B_SSH_PORT="2027" # порт ssh (fail2ban)
F2B_JAIL="/etc/fail2ban/jail.d/exam.local"
F2B_BANTIME="60" # бан 1 минута (в секундах)
F2B_MAXRETRY="3" # 3 попытки
BACKUP_SERVICE_PATTERN="cyber|backup" # ПРОВЕРИТЬ: как называется служба на стенде
main () {
echo "=== Проверка задания 3: HQ-SRV ==="
# --- 1. Сертификаты: срок (не менее ~29 дней) и цепочка ---
if command -v openssl &>/dev/null; then
KNOWN_DAYS_LEFT=$((29*24*3600)) # допустимая погрешность округления (выдан "на 30 дней")
check_var "каталог ЦС" CA_DIR &&
for NAME in $CERT_NAMES; do
CRT="$CA_DIR/$NAME.crt"
if [[ -f "$CRT" ]]; then
# проверка срока действия через -checkend
if openssl x509 -in "$CRT" -checkend "$KNOWN_DAYS_LEFT" &>/dev/null; then
ok "сертификат $NAME: срок действия ≥ 29 дней (выдан на 30)"
else fail "срок $NAME" "остаётся < 29 дней или сертификат не читается: $(openssl x509 -in "$CRT" -dates 2>&1)"; fi
# цепочка: подписан нашим CA
if openssl verify -CAfile "$CA_DIR/root.crt" "$CRT" 2>/dev/null | grep -q "OK"; then
ok "сертификат $NAME — подписан корневым $CA_DIR/root.crt"
else fail "цепочка $NAME" "verify: $(openssl verify -CAfile "$CA_DIR/root.crt" "$CRT" 2>&1)"; fi
# SAN
if openssl x509 -in "$CRT" -noout -ext subjectAltName 2>/dev/null | grep -qF "DNS:$NAME"; then
ok "SAN $NAME корректен"
else fail "SAN $NAME" "нет DNS:$NAME в subjectAltName"; fi
else
fail "сертификат $NAME" "файл $CRT не найден"; fi
done
else
skip "сертификаты — openssl не установлен"
fi
# --- 2. atop: интервал 420 c и служба ---
if [[ -f "$ATOP_CONF" ]]; then
GOT_INT=$(grep -E "^INTERVAL=|^LOGINTERVAL=" "$ATOP_CONF" | head -1)
if grep -qE "(=|=)$ATOP_INTERVAL" <<<"$GOT_INT"; then ok "atop: интервал $ATOP_INTERVAL с (7 минут)"
else fail "atop интервал" "ожидалось $ATOP_INTERVAL: $GOT_INT"; fi
else skip "atop конфиг — $ATOP_CONF не найден (ПРОВЕРИТЬ путь/имя параметров на РЕД ОС 8)"; fi
if systemctl is-active atop &>/dev/null; then ok "служба atop активна"
else fail "atop служба" "не активна (ПРОВЕРИТЬ имя службы)"; fi
# --- 3. CUPS: pdf-принтер, слушает 631 ---
if command -v lpstat &>/dev/null; then
PINFO=$(lpstat -p 2>/dev/null)
if grep -qw "$PDF_PRINTER" <<<"$PINFO" && ! grep -q "disabled" <<<"$PINFO"; then
ok "принтер $PDF_PRINTER опубликован и активен"
else fail "принтер $PDF_PRINTER" "не активен/отсутствует: $PINFO"; fi
if root_or_skip "проверка порта 631"; then
if ss -tln 2>/dev/null | grep -q ":631 "; then ok "CUPS слушает порт 631"
else fail "порт 631" "не слушает (сеть HQ-CLI не подключится к CUPS)"; fi
fi
else skip "CUPS — не установлен (ПРОВЕРИТЬ пакет cups)"; fi
# --- 4. fail2ban: порт 2027, попыток 3, ban 60 c ---
if command -v fail2ban-client &>/dev/null; then
if root_or_skip "fail2ban-client статус"; then
if fail2ban-client status sshd &>/dev/null; then ok "fail2ban: jail sshd активен"
else fail "fail2ban sshd" "статус не получен: $(fail2ban-client status sshd 2>&1)"; fi
BT=$(fail2ban-client get sshd bantime 2>/dev/null)
expect_eq "fail2ban bantime" "$F2B_BANTIME" "$BT"
MR=$(fail2ban-client get sshd maxretry 2>/dev/null)
expect_eq "fail2ban maxretry" "$F2B_MAXRETRY" "$MR"
fi
if grep -Eq "port.*$F2B_SSH_PORT" "$F2B_JAIL" 2>/dev/null; then ok "jail использует порт $F2B_SSH_PORT"
else fail "fail2ban порт" "нет $F2B_SSH_PORT в $F2B_JAIL"; fi
else skip "fail2ban — не установлен (ПРОВЕРИТЬ пакет/репозиторий на РЕД ОС 8)"; fi
# --- 5. Служба резервного копирования (Кибер Бэкап) ---
if systemctl list-unit-files 2>/dev/null | grep -qiE "$BACKUP_SERVICE_PATTERN"; then
echo "[ИНФО] найдены службы: $(systemctl list-unit-files 2>/dev/null | grep -iE "$BACKUP_SERVICE_PATTERN" | awk '{print $1}' | tr '\n' ' ')"
SKIP=$((SKIP+1))
else fail "служба резервного копирования" "ничего не найдено по шаблону '$BACKUP_SERVICE_PATTERN' (ПРОВЕРИТЬ имя службы в QUESTIONS.md)"; fi
echo ""
echo "=== Проверить вручную ==="
echo " — единица бэкапа настроена (GUI Кибер Бэкап на HQ-SRV)"
echo " — бэкап директории /etc выполняется на узел HQ-CLI (скриншоты)"
echo ""
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
[[ $FAIL -eq 0 ]]
}
main 2>&1 | tee "$LOG"
STATUS=${PIPESTATUS[0]}
echo "Лог сохранён: $LOG"
exit $STATUS