Скрипты проверки задания 3

This commit is contained in:
parent 6d14ced402
commit 1de8b01194
4 changed files with 342 additions and 0 deletions

73
check/zadanie3/br-srv.sh Normal file
View file

@ -0,0 +1,73 @@
#!/bin/bash
# ============================================================
# ПРОВЕРКА ЗАДАНИЕ 3 — BR-SRV: импорт пользователей, PC-INFO
# (только читает состояние; samba-tool требует root)
# Кибер Бэкап сервер — вручную (в конце список).
# ============================================================
NAME="br-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; }
# ================= ПЕРЕМЕННЫЕ (заполните для проверки) =================
EXPECTED_USERS="" # список имён из users.csv через пробел (заполните после импорта)
# если пусто — пункт [ПРОПУЩЕНО], проверяем только факт import
ANSIBLE_DIR="/etc/ansible"
REPORT_DIR="$ANSIBLE_DIR/PC-INFO" # отчёты инвентаризации по заданию
EXPECTED_REPORTS="hq-srv hq-cli" # имена файлов-отчётов = имена ПК (коротные из hostname,
# без домена — уточните: с точками или подчёркиваниями?)
main () {
echo "=== Проверка задания 3: BR-SRV ==="
# --- 1. Импорт пользователей из users.csv ---
if root_or_skip "samba-tool (требует root)"; then
if ! command -v samba-tool &>/dev/null; then
skip "samba-tool — не найден"
elif [[ -n "$EXPECTED_USERS" ]]; then
USER_LIST=$(samba-tool user list 2>/dev/null)
for USER in $EXPECTED_USERS; do
if grep -qx "$USER" <<<"$USER_LIST"; then ok "импортирован $USER"
else fail "импорт $USER" "не найден в списке домена"; fi
done
else
N_TOTAL=$(samba-tool user list 2>/dev/null | wc -l)
if [[ $N_TOTAL -gt 5 ]]; then
ok "доменных пользователей больше 5 (сверх hquser1–5): $N_TOTAL"
else fail "импорт пользователей" "в домене только $N_TOTAL пользователей — import.sh не выполнен?"
fi
fi
fi
# --- 2. Отчёты PC-INFO (.yml, имя файла = имя ПК) ---
if [[ -d "$REPORT_DIR" ]]; then
YML_COUNT=$(ls "$REPORT_DIR"/*.yml 2>/dev/null | wc -l)
if [[ $YML_COUNT -ge 2 ]]; then ok "в $REPORT_DIR есть $YML_COUNT отчёт(ов) .yml"
else fail "отчёты $REPORT_DIR" "ожидалось ≥2 .yml файлов, найдено $YML_COUNT"; fi
for PC in $EXPECTED_REPORTS; do
if ls "$REPORT_DIR"/$PC*.yml &>/dev/null; then ok "отчёт для $PC присутствует ($(ls "$REPORT_DIR"/$PC*.yml 2>/dev/null | head -1))"
else fail "отчёт $PC" "файла вида $PC*.yml нет (имена могут отличаться — см. переменную EXPECTED_REPORTS)"; fi
done
else
fail "каталог $REPORT_DIR" "не существует"
fi
echo ""
echo "=== Проверить вручную ==="
echo " — открыть один .yml файл: там имя ПК и IP-адрес"
echo " — Кибер Бэкап сервер HQ-SRV работает (скриншот консоли/данные резервных проверок)"
echo ""
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
[[ $FAIL -eq 0 ]]
}
main 2>&1 | tee "$LOG"
STATUS=${PIPESTATUS[0]}
echo "Лог сохранён: $LOG"
exit $STATUS

80
check/zadanie3/hq-cli.sh Normal file
View file

@ -0,0 +1,80 @@
#!/bin/bash
# ============================================================
# ПРОВЕРКА ЗАДАНИЯ 3 — HQ-CLI: доверие CA, https без -k,
# принтер по умолчанию, каталог /backup
# (только читает состояние!) Агент Кибер Бэкап — вручную.
# ============================================================
NAME="hq-cli"
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)); }
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_ANCHORS_DIR="/etc/pki/ca-trust/source/anchors" # ПРОВЕРИТЬ на РЕД ОС 8
CA_CN="au-team-CA" # CN корневого сертификата (переменная CA_SUBJECT)
WEB_DOMAIN="web.au-team.irpo"
DOCKER_DOMAIN="docker.au-team.irpo"
WEB_LOGIN="WEB" # по заданию 3 п. 3
WEB_PASS="P@ssw0rd"
CLIENT_PRINTER="pdf_printer" # локальное имя принтера на HQ-CLI
BACKUP_DIR="/backup" # каталог хранилища по заданию 3 п. 9
main () {
echo "=== Проверка задания 3: HQ-CLI ==="
# --- 1. Доверие корневому сертификату (установлен в хранилище) ---
if [[ -d "$CA_ANCHORS_DIR" ]] && ls "$CA_ANCHORS_DIR" | grep -q .; then
LISTED=$(ls "$CA_ANCHORS_DIR" | tr '\n' ' ')
echo "[ИНФО] в anchors: $LISTED"
SKIP=$((SKIP+1)) # ПРОВЕРИТЬ: имя файла бывает любым — критерий ниже через trust list
if command -v trust &>/dev/null; then
if trust list 2>/dev/null | grep -q "cn.*$CA_CN"; then ok "корневой сертификат ($CA_CN) в хранилище"
else fail "корневой CA" "$CA_CN не найден в trust list"; fi
else skip "trust list — команда trust не найдена (ПРОВЕРИТЬ на РЕД ОС 8)"
fi
else
fail "anchors $CA_ANCHORS_DIR" "каталог не найден или пуст — файл CA доставлен вручную?"
fi
# --- 2. https без предупреждений (curl без -k) ---
check_var "web-домен" WEB_DOMAIN &&
{ CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "$WEB_LOGIN:$WEB_PASS" "https://$WEB_DOMAIN/" 2>/dev/null)
if grep -qE "^(200|301|302)$" <<<"$CODE"; then ok "https://$WEB_DOMAIN — соединение без ошибок сертификата (код $CODE)"
else fail "https $WEB_DOMAIN" "код '$CODE' (0 = ошибка соединения/сертификата)"; fi; }
check_var "docker-домен" DOCKER_DOMAIN &&
{ CODE=$(curl -s -o /dev/null -w "%{http_code}" "https://$DOCKER_DOMAIN/" 2>/dev/null)
if grep -qE "^(200|301|302)$" <<<"$CODE"; then ok "https://$DOCKER_DOMAIN — без ошибок сертификата ($CODE)"
else fail "https $DOCKER_DOMAIN" "код '$CODE'"; fi; }
# --- 3. Принтер по умолчанию ---
if command -v lpstat &>/dev/null; then
DEFAULT_P=$(lpstat -d 2>/dev/null | awk '{print $NF}')
expect_eq "принтер по умолчанию" "$CLIENT_PRINTER" "$DEFAULT_P"
if lpstat -p "$CLIENT_PRINTER" &>/dev/null; then ok "принтер $CLIENT_PRINTER зарегистрирован"
else fail "принтер $CLIENT_PRINTER" "не найден в lpstat -p"; fi
else skip "lpstat — утилита CUPS не найдена (dnf install cups)"; fi
# --- 4. Каталог /backup (узел хранилища) ---
if [[ -d "$BACKUP_DIR" ]]; then ok "каталог $BACKUP_DIR существует"
else fail "каталог $BACKUP_DIR" "не найден"; fi
echo ""
echo "=== Проверить вручную ==="
echo " — установка агента Кибер Бэкап на HQ-CLI (GUI), подключение к HQ-SRV"
echo " — предупреждения браузера (откройте страницу в Яндекс Браузере)"
echo " — печать: echo test | lp -d $CLIENT_PRINTER; проверьте появление pdf у принтера"
echo ""
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
[[ $FAIL -eq 0 ]]
}
main 2>&1 | tee "$LOG"
STATUS=${PIPESTATUS[0]}
echo "Лог сохранён: $LOG"
exit $STATUS

116
check/zadanie3/hq-srv.sh Normal file
View file

@ -0,0 +1,116 @@
#!/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

73
check/zadanie3/isp.sh Normal file
View file

@ -0,0 +1,73 @@
# ПРОВЕРКА ЗАДАНИЕ 3 — ISP: реверс-прокси, web-аутентификация
# Проверяем через curl на самом ISP (nginx слушает 80/443 на всех
# интерфейсах; доменные имена подставляем HOST-заголовком, т.к.
# собственный DNS ISP про локальные записи не знает).
# ============================================================
NAME="isp"
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)); }
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; }
# ================= ПЕРЕМЕННЫЕ (заполните для проверки) =================
WEB_DOMAIN="web.au-team.irpo" # таблица 3
DOCKER_DOMAIN="docker.au-team.irpo" # таблица 3
WEB_LOGIN="WEB" # по заданию
WEB_PASS="P@ssw0rd" # по заданию
TLS_MODE="" # "https" — если прокси уже на 443, иначе пусто
TLS_CERT_FILE="" # путь к сертификату на ISP (для пункта 4)
main () {
echo "=== Проверка задания 3: ISP (реверс-прокси) ==="
# --- 1. Служба прокси ---
if [[ "$TLS_MODE" == "https" ]]; then
EXPECT_PORT="443"
else
EXPECT_PORT="80"
fi
if ss -tln 2>/dev/null | grep -q "80 "; then ok "сервер слушает порт 80"
else fail "порт 80" "не слушает (nginx?)"; fi
if [[ "$TLS_MODE" == "https" ]]; then
if ss -tln 2>/dev/null | grep -q "443 "; then ok "сервер слушает порт 443 (TLS)"
else fail "порт 443" "не слушает — TLS не настроен"; fi
fi
# --- 2. docker.au-team.irpo — открывается testapp (без пароля) ---
check_var "docker-домен" DOCKER_DOMAIN &&
{ CODE=$(curl -s -o /dev/null -w "%{http_code}" -H "Host: $DOCKER_DOMAIN" "http://127.0.0.1/" 2>/dev/null)
if grep -qE "^(200|301|302)$" <<<"$CODE"; then ok "$DOCKER_DOMAIN: testapp отвечает ($CODE)"
else fail "$DOCKER_DOMAIN" "ожидалось 200/301/302, получено '$CODE'"; fi; }
# --- 3. web.au-team.irpo — аутентификация: 401 без пароля, 200 с паролем ---
check_var "web-домен" WEB_DOMAIN &&
{ CODE=$(curl -s -o /dev/null -w "%{http_code}" -H "Host: $WEB_DOMAIN" "http://127.0.0.1/" 2>/dev/null)
if [[ "$CODE" == "401" ]]; then ok "$WEB_DOMAIN без пароля: 401 (требует аутентификации)"
else fail "$WEB_DOMAIN без пароля" "ожидалось 401, получено '$CODE'"; fi
CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "$WEB_LOGIN:$WEB_PASS" -H "Host: $WEB_DOMAIN" "http://127.0.0.1/" 2>/dev/null)
if grep -qE "^(200|301|302)$" <<<"$CODE"; then ok "$WEB_DOMAIN c $WEB_LOGIN:$WEB_PASS: $CODE"
else fail "$WEB_DOMAIN с паролем" "ожидалось 200/301/302, получено '$CODE'"; fi; }
# --- 4. TLS-сертификаты (для режима https) ---
check_var "сертификат TLS" TLS_CERT_FILE &&
{ if openssl x509 -in "$TLS_CERT_FILE" -noout 2>/dev/null; then ok "tls cert поднят: $TLS_CERT_FILE"
else fail "TLS сертификат" "файл не читается: $TLS_CERT_FILE"; fi; }
echo ""
echo "=== Проверить вручную ==="
echo " — браузер клиента: https://web.au-team.irpo (без предупреждений, ввод логина)"
echo " — https://docker.au-team.irpo без предупреждений (снято на HQ-CLI/hq-cli.sh)"
echo ""
echo "=== Итог: OK=$OK FAIL=$FAIL ПРОПУЩЕНО=$SKIP ==="
[[ $FAIL -eq 0 ]]
}
main 2>&1 | tee "$LOG"
STATUS=${PIPESTATUS[0]}
echo "Лог сохранён: $LOG"
exit $STATUS