117 lines
6.9 KiB
Bash
117 lines
6.9 KiB
Bash
#!/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
|