Задание 3: скрипты настройки и проверки
This commit is contained in:
parent
d995ba80ab
commit
14b5b2ee95
73
check/zadanie3/br-srv.sh
Normal file
73
check/zadanie3/br-srv.sh
Normal 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
80
check/zadanie3/hq-cli.sh
Normal 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
116
check/zadanie3/hq-srv.sh
Normal 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
73
check/zadanie3/isp.sh
Normal 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
|
||||||
95
zadanie3/br-srv.sh
Normal file
95
zadanie3/br-srv.sh
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ============================================================
|
||||||
|
# ЗАДАНИЕ 3. Настройка BR-SRV (Linux / РЕД ОС 8)
|
||||||
|
# 1. Импорт пользователей: import.sh + users.csv из Additional.iso
|
||||||
|
# (import.sh сам запрашивает путь к файлу-источнику)
|
||||||
|
# 7. Инвентаризация через Ansible: плейбук из образа, отчёты в
|
||||||
|
# /etc/ansible/PC-INFO в формате .yml (имя файла = имя ПК)
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# --- Проверка прав root ---
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "Запустите скрипт с правами root (sudo bash br-srv.sh)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||||
|
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||||
|
ISO_DIR="/mnt/iso" # точка монтирования Additional.iso
|
||||||
|
|
||||||
|
# --- 1. Импорт пользователей ---
|
||||||
|
IMPORT_SCRIPT="$ISO_DIR/import.sh" # по заданию — в корне образа
|
||||||
|
USERS_CSV="$ISO_DIR/users.csv" # файл-источник по заданию
|
||||||
|
|
||||||
|
# --- 7. Плейбук для инвентаризации ---
|
||||||
|
ANSIBLE_DIR="/etc/ansible"
|
||||||
|
PLAYBOOK_SRC="$ISO_DIR/playbook" # директория плейбука в образе
|
||||||
|
PLAYBOOK_DST="$ANSIBLE_DIR/playbook" # куда копируем на BR-SRV
|
||||||
|
REPORT_DIR="$ANSIBLE_DIR/PC-INFO" # отчёты .yml по имени ПК
|
||||||
|
|
||||||
|
# ============ Проверка заполнения переменных ============
|
||||||
|
MISSING=()
|
||||||
|
for NAME in EXAM_TZ; do
|
||||||
|
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||||
|
done
|
||||||
|
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||||
|
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Настройка BR-SRV, задание 3 ==="
|
||||||
|
|
||||||
|
# --- 1. Импорт пользователей (import.sh сам спрашивает путь) ---
|
||||||
|
echo "--- Импорт пользователей из $USERS_CSV ---"
|
||||||
|
if [[ -x "$IMPORT_SCRIPT" || -f "$IMPORT_SCRIPT" ]]; then
|
||||||
|
echo "Скрипт найден: $IMPORT_SCRIPT"
|
||||||
|
echo "Он интерактивно запрашивает файл-источник — запустите вручную:"
|
||||||
|
echo " bash $IMPORT_SCRIPT и в ответ на вопрос укажите $USERS_CSV"
|
||||||
|
echo "После импорта проверьте: samba-tool user list"
|
||||||
|
# Проверку запускаем только если обе вещи на месте:
|
||||||
|
bash "$IMPORT_SCRIPT" || echo "ЗАПУСТИТЕ ВРУЧНУЮ с указанием $USERS_CSV (см. выше)"
|
||||||
|
else
|
||||||
|
echo "ДЕЛАЕТСЯ ВРУЧНУЮ: $IMPORT_SCRIPT не найден — смонтируйте Additional.iso в $ISO_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- 2. Плейбук для инвентаризации машин HQ-SRV и HQ-CLI ---
|
||||||
|
echo "--- Плейбук инвентаризации ---"
|
||||||
|
if [[ -d "$PLAYBOOK_SRC" ]]; then
|
||||||
|
mkdir -p "$PLAYBOOK_DST"
|
||||||
|
cp -f "$PLAYBOOK_SRC"/* "$PLAYBOOK_DST/" 2>/dev/null \
|
||||||
|
|| echo "ПРОВЕРИТЬ: в $PLAYBOOK_SRC нет файлов?"
|
||||||
|
ls -l "$PLAYBOOK_DST"
|
||||||
|
else
|
||||||
|
echo "ДЕЛАЕТСЯ ВРУЧНУЮ: нет $PLAYBOOK_SRC — смонтируйте Additional.iso в $ISO_DIR"
|
||||||
|
fi
|
||||||
|
mkdir -p "$REPORT_DIR"
|
||||||
|
echo "Плейбуки в $PLAYBOOK_DST. Запуск (с BR-SRV, из задания 2 настроен ansible):"
|
||||||
|
# Запускаем первый найденный .yml (имя файла в образе нам неизвестно заранее)
|
||||||
|
PLAYBOOK_YML=""
|
||||||
|
shopt -s nullglob
|
||||||
|
for F in "$PLAYBOOK_DST"/*.yml "$PLAYBOOK_DST"/*.yaml; do
|
||||||
|
PLAYBOOK_YML="$F"
|
||||||
|
break
|
||||||
|
done
|
||||||
|
shopt -u nullglob
|
||||||
|
if [[ -n "$PLAYBOOK_YML" ]]; then
|
||||||
|
echo " ansible-playbook $PLAYBOOK_YML"
|
||||||
|
ansible-playbook "$PLAYBOOK_YML" \
|
||||||
|
|| echo "ПРОВЕРИТЬ: плейбук не отработал — посмотрите его содержимое и ошибки"
|
||||||
|
else
|
||||||
|
echo "ДЕЛАЕТСЯ ВРУЧНУЮ: .yml не найден в $PLAYBOOK_DST"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Отчёты должны появиться в $REPORT_DIR (имя файла = имя ПК):"
|
||||||
|
ls -l "$REPORT_DIR" || true
|
||||||
|
|
||||||
|
timedatectl set-timezone "$EXAM_TZ"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Самопроверка на BR-SRV ==="
|
||||||
|
echo "Импортированные пользователи (должны появиться из users.csv):"
|
||||||
|
samba-tool user list
|
||||||
|
echo ""
|
||||||
|
echo "Отчёты инвентаризации:"
|
||||||
|
ls -l "$REPORT_DIR"
|
||||||
87
zadanie3/hq-cli.sh
Normal file
87
zadanie3/hq-cli.sh
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ============================================================
|
||||||
|
# ЗАДАНИЕ 3. Настройка HQ-CLI (Linux / РЕД ОС 8)
|
||||||
|
# 4. Доверие корневому сертификату ЦС (HQ-SRV)
|
||||||
|
# 6. Подключение виртуального pdf-принтера как принтера по умолчанию
|
||||||
|
# 9. Агент Кибер Бэкап — ДЕЛАЕТСЯ ВРУЧНУЮ (MANUAL.md)
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# --- Проверка прав root ---
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "Запустите скрипт с правами root (sudo bash hq-cli.sh)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||||
|
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||||
|
|
||||||
|
# --- 4. Доверие корневому сертификату ---
|
||||||
|
CA_ROOT_FILE="" # путь к скопированному корневому сертификату
|
||||||
|
# (root.crt копируется с HQ-SRV вручную — MANUAL.md)
|
||||||
|
CA_ANCHORS_DIR="/etc/pki/ca-trust/source/anchors" # ПРОВЕРИТЬ на РЕД ОС 8
|
||||||
|
CA_TRUST_CMD="update-ca-trust" # ПРОВЕРИТЬ команду обновления хранилища
|
||||||
|
|
||||||
|
# --- 6. Принтер по умолчанию (виртуальный pdf с HQ-SRV) ---
|
||||||
|
CUPS_SERVER="" # адрес HQ-SRV (без префикса)
|
||||||
|
PRINTER_NAME="pdf" # имя принтера, как он опубликован на HQ-SRV
|
||||||
|
CLIENT_PRINTER="pdf_printer" # локальное имя подключения на HQ-CLI
|
||||||
|
CUPS_PACKAGE="cups" # клиенту нужны утилиты lpadmin/lpstat
|
||||||
|
|
||||||
|
# ============ Проверка заполнения переменных ============
|
||||||
|
MISSING=()
|
||||||
|
for NAME in CA_ROOT_FILE CUPS_SERVER EXAM_TZ; do
|
||||||
|
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||||
|
done
|
||||||
|
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||||
|
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Настройка HQ-CLI, задание 3 ==="
|
||||||
|
|
||||||
|
# --- 1. Доверие корневому сертификату ЦС ---
|
||||||
|
echo "--- Доверие CA ---"
|
||||||
|
if [[ ! -f "$CA_ROOT_FILE" ]]; then
|
||||||
|
echo "ДЕЛАЕТСЯ ВРУЧНУЮ: файла $CA_ROOT_FILE нет — скопируйте root.crt с HQ-SRV"
|
||||||
|
echo " scp root@<адрес HQ-SRV>:$CA_ROOT_FILE "
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
cp "$CA_ROOT_FILE" "$CA_ANCHORS_DIR/"
|
||||||
|
"$CA_TRUST_CMD" && echo "Хранилище сертификатов обновлено" \
|
||||||
|
|| echo "ПРОВЕРИТЬ: $CA_TRUST_CMD не выполнился"
|
||||||
|
echo "Проверка: curl -I https://web.au-team.irpo (не должен писать про сертификат)"
|
||||||
|
|
||||||
|
# --- 2. Принтер по умолчанию ---
|
||||||
|
echo "--- Подключение принтера — $CLIENT_PRINTER <- $CUPS_SERVER:$PRINTER_NAME ---"
|
||||||
|
dnf install -y "$CUPS_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $CUPS_PACKAGE не установился"
|
||||||
|
if lpstat -p 2>/dev/null | grep -qw "$CLIENT_PRINTER"; then
|
||||||
|
echo "Принтер $CLIENT_PRINTER уже подключён"
|
||||||
|
else
|
||||||
|
lpadmin -p "$CLIENT_PRINTER" \
|
||||||
|
-v "ipp://$CUPS_SERVER:631/printers/$PRINTER_NAME" -E \
|
||||||
|
&& echo "Принтер добавлен" \
|
||||||
|
|| echo "ПРОВЕРИТЬ: lpadmin не смог добавить принтер (CUPS на HQ-SRV слушает 631?)"
|
||||||
|
fi
|
||||||
|
# Назначить принтер по умолчанию (повторно безопасно)
|
||||||
|
lpoptions -d "$CLIENT_PRINTER" >/dev/null && echo "Принтер по умолчанию: $CLIENT_PRINTER"
|
||||||
|
lpstat -p -d
|
||||||
|
|
||||||
|
# --- 3. Агент Кибер Бэкап — вручную ---
|
||||||
|
echo ""
|
||||||
|
echo "ДЕЛАЕТСЯ ВРУЧНУЮ (MANUAL.md): установить агент с функциями узла"
|
||||||
|
echo "хранилища, подключить к серверу HQ-SRV, создать /backup и выбрать"
|
||||||
|
echo "её как устройство хранения. Директорию /backup можно создать сейчас:"
|
||||||
|
mkdir -p /backup && echo " Директория /backup создана"
|
||||||
|
|
||||||
|
# --- 4. Часовой пояс ---
|
||||||
|
timedatectl set-timezone "$EXAM_TZ"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Самопроверка на HQ-CLI ==="
|
||||||
|
lpstat -p -d
|
||||||
|
echo ""
|
||||||
|
echo "Дополнительные проверки вручную:"
|
||||||
|
echo " curl -I https://web.au-team.irpo (без предупреждений о сертификате)"
|
||||||
|
echo " curl -I https://docker.au-team.irpo (без предупреждений + логин WEB/P@ssw0rd на web)"
|
||||||
|
echo " echo test | lp -d $CLIENT_PRINTER (печать в pdf-принтер)"
|
||||||
|
echo " ls /var/spool/cups-pdf на HQ-SRV (pdf появился у принтера?)"
|
||||||
182
zadanie3/hq-srv.sh
Normal file
182
zadanie3/hq-srv.sh
Normal file
|
|
@ -0,0 +1,182 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ============================================================
|
||||||
|
# ЗАДАНИЕ 3. Настройка HQ-SRV (Linux / РЕД ОС 8)
|
||||||
|
# 4. Центр сертификации: root-CA, сертификаты веб-серверам на 30 дней
|
||||||
|
# (поставка на ISP и HQ-CLI — вручную, MANUAL.md)
|
||||||
|
# 5. atop: мониторинг с интервалом 7 минут (420 секунд)
|
||||||
|
# 6. Спринт-сервер cups: публикация виртуального pdf-принтера
|
||||||
|
# 8. fail2ban для ssh: порт 2027, 3 попытки, бан 1 минута
|
||||||
|
# 9. Кибер Бэкап — ДЕЛАЕТСЯ ВРУЧНУЮ (MANUAL.md)
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# --- Проверка прав root ---
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "Запустите скрипт с правами root (sudo bash hq-srv.sh)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||||
|
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||||
|
|
||||||
|
# --- 4. Центр сертификации (openssl; ПРОВЕРИТЬ: по заданию рекомендуются
|
||||||
|
# отечественные алгоритмы — стандартный openssl гост-подписи не умеет,
|
||||||
|
# обсудите требования и инструменты с экзаменатором, см. QUESTIONS.md) ---
|
||||||
|
CA_DIR="/etc/CA" # каталог ЦС (создаётся)
|
||||||
|
CA_CERT="root.crt" # публичный корневой сертификат
|
||||||
|
CA_KEY="root.key" # ключ корневого CA
|
||||||
|
CA_DAYS="3650" # срок корневого сертификата (срок выдачи задан ниже)
|
||||||
|
CA_SUBJECT="/CN=au-team-CA/O=AU-TEAM" # изменить при желании
|
||||||
|
CERT_DAYS="30" # срок сертификатов веб-серверов ПО ЗАДАНИЮ
|
||||||
|
CERT_NAMES="web.au-team.irpo docker.au-team.irpo" # домены по таблице 3
|
||||||
|
|
||||||
|
# --- 5. atop ---
|
||||||
|
ATOP_PACKAGE="atop" # ПРОВЕРИТЬ: пакет atop на РЕД ОС 8
|
||||||
|
ATOP_SERVICE="atop"
|
||||||
|
ATOP_CONF="/etc/sysconfig/atop" # ПРОВЕРИТЬ путь конфига atop на РЕД ОС 8
|
||||||
|
ATOP_INTERVAL="420" # 7 минут по заданию (в секундах)
|
||||||
|
|
||||||
|
# --- 6. cups + pdf-принтер ---
|
||||||
|
CUPS_PACKAGE="cups" # ПРОВЕРИТЬ: пакет/служба CUPS на РЕД ОС 8
|
||||||
|
CUPS_SERVICE="cups"
|
||||||
|
CUPS_PDF_PACKAGE="cups-pdf" # ПРОВЕРИТЬ: наличие пакета cups-pdf
|
||||||
|
PDF_PRINTER="pdf" # имя виртуального pdf-принтера
|
||||||
|
|
||||||
|
# --- 8. fail2ban ---
|
||||||
|
F2B_PACKAGE="fail2ban" # ПРОВЕРИТЬ: пакет и репозиторий fail2ban на РЕД ОС 8
|
||||||
|
F2B_SERVICE="fail2ban"
|
||||||
|
F2B_JAIL="/etc/fail2ban/jail.d/exam.local" # перезаписывается целиком
|
||||||
|
F2B_SSH_PORT="2027" # порт ssh (задание 1, п. 5)
|
||||||
|
F2B_MAXRETRY="3" # 3 неуспешные попытки по заданию
|
||||||
|
F2B_BANTIME="60" # бан 1 минута (60 с) по заданию
|
||||||
|
|
||||||
|
# ============ Проверка заполнения переменных ============
|
||||||
|
MISSING=()
|
||||||
|
for NAME in CA_DIR CA_CERT CA_KEY CA_SUBJECT CERT_NAMES EXAM_TZ; do
|
||||||
|
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||||
|
done
|
||||||
|
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||||
|
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Настройка HQ-SRV, задание 3 ==="
|
||||||
|
|
||||||
|
# --- 1. Центр сертификации ---
|
||||||
|
echo "--- ЦС (openssl) ---"
|
||||||
|
mkdir -p "$CA_DIR" || exit 1
|
||||||
|
cd "$CA_DIR" || exit 1
|
||||||
|
if [[ ! -f "$CA_CERT" ]]; then
|
||||||
|
openssl req -x509 -newkey rsa:2048 -nodes \
|
||||||
|
-keyout "$CA_KEY" -out "$CA_CERT" -days "$CA_DAYS" \
|
||||||
|
-subj "${CA_SUBJECT}" \
|
||||||
|
&& echo "Создан корневой сертификат: $CA_CERT"
|
||||||
|
else
|
||||||
|
echo "Корневой сертификат уже существует"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Сертификаты веб-серверам (для каждого домена: ключ + сертификат со SAN)
|
||||||
|
for NAME in $CERT_NAMES; do
|
||||||
|
if [[ -f "$NAME.crt" ]]; then
|
||||||
|
echo "Сертификат $NAME.crt уже существует"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
openssl req -newkey rsa:2048 -nodes -keyout "$NAME.key" \
|
||||||
|
-out "$NAME.csr" -subj "/CN=$NAME/O=AU-TEAM" \
|
||||||
|
-addext "subjectAltName=DNS:$NAME"
|
||||||
|
# Подписываем корневым CA на CERT_DAYS
|
||||||
|
if openssl x509 -req -in "$NAME.csr" \
|
||||||
|
-CA "$CA_CERT" -CAkey "$CA_KEY" -CAcreateserial \
|
||||||
|
-out "$NAME.crt" -days "$CERT_DAYS" \
|
||||||
|
-extfile <(printf "subjectAltName=DNS:%s" "$NAME"); then
|
||||||
|
echo "Сертификат выдан: $NAME.crt (на $CERT_DAYS дней)"
|
||||||
|
else
|
||||||
|
echo "ПРОВЕРИТЬ: не удалось подписать сертификат $NAME"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
openssl x509 -in "$CA_CERT" -noout -subject -dates
|
||||||
|
echo ""
|
||||||
|
echo "ПРОВЕРИТЬ SAN и срок каждого сертификата:"
|
||||||
|
for NAME in $CERT_NAMES; do
|
||||||
|
openssl x509 -in "$NAME.crt" -noout -subject -ext subjectAltName -dates 2>/dev/null
|
||||||
|
done
|
||||||
|
|
||||||
|
# --- 2. atop: интервал 420 с ---
|
||||||
|
echo "--- atop (интервал $ATOP_INTERVAL c) ---"
|
||||||
|
dnf install -y "$ATOP_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $ATOP_PACKAGE не установился"
|
||||||
|
if [[ -f "$ATOP_CONF" ]]; then
|
||||||
|
if grep -qE "^(LOG)?INTERVAL=" "$ATOP_CONF"; then
|
||||||
|
sed -ri "s/^(LOG)?INTERVAL=[0-9]+/INTERVAL=$ATOP_INTERVAL/" "$ATOP_CONF"
|
||||||
|
else
|
||||||
|
echo "INTERVAL=$ATOP_INTERVAL" >> "$ATOP_CONF"
|
||||||
|
fi
|
||||||
|
echo "Интервал задан в $ATOP_CONF"
|
||||||
|
else
|
||||||
|
echo "INTERVAL=$ATOP_INTERVAL" > "$ATOP_CONF"
|
||||||
|
echo "Создан $ATOP_CONF (ПРОВЕРИТЬ, подхватывается ли конфиг службой)"
|
||||||
|
fi
|
||||||
|
systemctl enable --now "$ATOP_SERVICE" \
|
||||||
|
|| { echo "ПРОВЕРИТЬ: служба $ATOP_SERVICE не запустилась"; systemctl status "$ATOP_SERVICE" --no-pager; }
|
||||||
|
|
||||||
|
# --- 3. cups + виртуальный pdf-принтер ---
|
||||||
|
echo "--- cups / pdf-принтер ---"
|
||||||
|
dnf install -y "$CUPS_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $CUPS_PACKAGE не установился"
|
||||||
|
dnf install -y "$CUPS_PDF_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $CUPS_PDF_PACKAGE не установился (нет ли аналога в репозитории?)"
|
||||||
|
systemctl enable --now "$CUPS_SERVICE" \
|
||||||
|
|| { echo "ПРОВЕРИТЬ: служба $CUPS_SERVICE не запустилась"; systemctl status "$CUPS_SERVICE" --no-pager; }
|
||||||
|
# Публикация принтера (создание + включение как общий) — без дублей
|
||||||
|
if lpstat -p 2>/dev/null | grep -qw "$PDF_PRINTER"; then
|
||||||
|
echo "Принтер $PDF_PRINTER уже есть"
|
||||||
|
else
|
||||||
|
lpadmin -p "$PDF_PRINTER" -v cups-pdf:/ -E -o printer-is-shared=true \
|
||||||
|
&& echo "Публикуем принтер $PDF_PRINTER" \
|
||||||
|
|| echo "ПРОВЕРИТЬ: не удалось опубликовать принтер — сделать через веб-интерфейс CUPS вручную"
|
||||||
|
fi
|
||||||
|
# Слушать на всех интерфейсах, чтобы HQ-CLI подключился по сети (ПРОВЕРИТЬ)
|
||||||
|
if ! grep -qE "^Port 631|^Listen [^[:space:]]*:631" /etc/cups/cupsd.conf 2>/dev/null \
|
||||||
|
|| grep -qE "^Listen localhost:631" /etc/cups/cupsd.conf 2>/dev/null; then
|
||||||
|
sed -i "s/^Listen localhost:631/Port 631/" /etc/cups/cupsd.conf
|
||||||
|
if ! grep -qE "^Port 631|^Listen [^[:space:]]*:631" /etc/cups/cupsd.conf; then
|
||||||
|
echo "Port 631" >> /etc/cups/cupsd.conf
|
||||||
|
fi
|
||||||
|
systemctl restart "$CUPS_SERVICE"
|
||||||
|
fi
|
||||||
|
lpstat -p
|
||||||
|
|
||||||
|
# --- 4. fail2ban для ssh ---
|
||||||
|
echo "--- fail2ban (порт $F2B_SSH_PORT, $F2B_MAXRETRY попыток, $F2B_BANTIME c) ---"
|
||||||
|
dnf install -y "$F2B_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $F2B_PACKAGE не установился (репозиторий EPEL?)"
|
||||||
|
mkdir -p /etc/fail2ban/jail.d
|
||||||
|
cat > "$F2B_JAIL" <<EOF
|
||||||
|
[DEFAULT]
|
||||||
|
bantime = $F2B_BANTIME
|
||||||
|
maxretry = $F2B_MAXRETRY
|
||||||
|
|
||||||
|
[sshd]
|
||||||
|
enabled = true
|
||||||
|
port = $F2B_SSH_PORT
|
||||||
|
EOF
|
||||||
|
mkdir -p /var/run/fail2ban
|
||||||
|
systemctl enable --now "$F2B_SERVICE" \
|
||||||
|
|| { echo "ПРОВЕРИТЬ: служба $F2B_SERVICE не запустилась"; systemctl status "$F2B_SERVICE" --no-pager; }
|
||||||
|
|
||||||
|
# --- 5. Кибер Бэкап — вручную ---
|
||||||
|
echo ""
|
||||||
|
echo "ДЕЛАЕТСЯ ВРУЧНУЮ (MANUAL.md): развёртывание Кибер Бэкап, подразделение"
|
||||||
|
echo "ирпо, пользователь irpoadmin / P@ssw0rd, план копирования /etc на узел HQ-CLI."
|
||||||
|
|
||||||
|
# --- 6. Часовой пояс ---
|
||||||
|
timedatectl set-timezone "$EXAM_TZ"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Самопроверка на HQ-SRV ==="
|
||||||
|
echo "Корневой сертификат и сертификаты:"
|
||||||
|
ls -l "$CA_DIR"
|
||||||
|
echo ""
|
||||||
|
echo "fail2ban статус:"
|
||||||
|
fail2ban-client status sshd 2>/dev/null || echo "ПРОВЕРИТЬ: fail2ban-client status sshd"
|
||||||
|
echo ""
|
||||||
|
echo "Дополнительные проверки вручную:"
|
||||||
|
echo " systemd-analyze verify atop 2>/dev/null; journalctl -u $ATOP_SERVICE --since -5min"
|
||||||
|
echo " cat $ATOP_CONF (INTERVAL=420?)"
|
||||||
|
echo " lpstat -p (принтер $PDF_PRINTER и активен?)"
|
||||||
|
echo " ssh -p $F2B_SSH_PORT wronguser@localhost (3 раза с неверным паролем -> fail2ban-client status sshd => banned)"
|
||||||
155
zadanie3/isp.sh
Normal file
155
zadanie3/isp.sh
Normal file
|
|
@ -0,0 +1,155 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# ============================================================
|
||||||
|
# ЗАДАНИЕ 3. Обратный прокси-сервер на ISP (Linux / РЕД ОС 8)
|
||||||
|
# 2. Реверс-прокси на nginx:
|
||||||
|
# web.au-team.irpo -> веб-приложение на HQ-SRV
|
||||||
|
# docker.au-team.irpo -> testapp на BR-SRV
|
||||||
|
# 3. Web-based аутентификация на web.au-team.irpo (WEB / P@ssw0rd)
|
||||||
|
# 4. HTTPS: сертификаты выдаёт ЦС на HQ-SRV (zadanie3/hq-srv.sh) и
|
||||||
|
# доставляются вручную (MANUAL.md) — после этого задайте
|
||||||
|
# TLS_CERT_FILE/TLS_KEY_FILE и запустите скрипт повторно.
|
||||||
|
# ВНИМАНИЕ: проброс 8080 с роутеров (задание 2) больше не основной
|
||||||
|
# путь — клиенты заходят через ISP по доменному имени на 80/443.
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# --- Проверка прав root ---
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "Запустите скрипт с правами root (sudo bash isp.sh)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ================= ПЕРЕМЕННЫЕ (заполните перед запуском) =================
|
||||||
|
NGINX_PACKAGE="nginx" # ПРОВЕРИТЬ: пакет reverse-proxy на РЕД ОС 8
|
||||||
|
NGINX_SERVICE="nginx"
|
||||||
|
PROXY_CONF="/etc/nginx/conf.d/exam-proxy.conf" # перезаписывается целиком
|
||||||
|
|
||||||
|
WEB_DOMAIN="web.au-team.irpo" # из таблицы 3
|
||||||
|
DOCKER_DOMAIN="docker.au-team.irpo" # из таблицы 3
|
||||||
|
|
||||||
|
HQ_SRV_WEB="" # адрес:порт веб-приложения HQ-SRV, формат IP:порт (apache:80)
|
||||||
|
BR_SRV_APP="" # адрес:порт testapp на BR-SRV, формат IP:порт (8080)
|
||||||
|
|
||||||
|
WEB_LOGIN="WEB" # логин web-аутентификации по заданию
|
||||||
|
WEB_PASS="P@ssw0rd" # пароль web-аутентификации по заданию
|
||||||
|
HTPASSWD_FILE="/etc/nginx/exam-web.htpasswd"
|
||||||
|
|
||||||
|
# --- HTTPS (п. 4 задания 3): после ручной доставки сертификатов — заполнить ---
|
||||||
|
TLS_CERT_FILE="" # путь к сертификату на этом ISP (web/docker domain, SAN)
|
||||||
|
TLS_KEY_FILE="" # путь к связанному ключу
|
||||||
|
|
||||||
|
EXAM_TZ="Europe/Moscow" # проверить на экзамене
|
||||||
|
|
||||||
|
# ============ Проверка заполнения переменных ============
|
||||||
|
MISSING=()
|
||||||
|
for NAME in HQ_SRV_WEB BR_SRV_APP EXAM_TZ; do
|
||||||
|
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
|
||||||
|
done
|
||||||
|
if [[ ${#MISSING[@]} -gt 0 ]]; then
|
||||||
|
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== Обратный прокси на ISP ==="
|
||||||
|
|
||||||
|
dnf install -y "$NGINX_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $NGINX_PACKAGE не установился"
|
||||||
|
|
||||||
|
# --- 1. Файл с паролем web-аутентификации (htpasswd через openssl) ---
|
||||||
|
echo "--- Базовая аутентификация ($WEB_DOMAIN) ---"
|
||||||
|
PASS_HASH=$(openssl passwd -apr1 "$WEB_PASS")
|
||||||
|
printf "%s:%s\n" "$WEB_LOGIN" "$PASS_HASH" > "$HTPASSWD_FILE"
|
||||||
|
chmod 640 "$HTPASSWD_FILE"
|
||||||
|
echo "Записан $HTPASSWD_FILE (логин $WEB_LOGIN)"
|
||||||
|
|
||||||
|
# --- 2. Конфигурация прокси ---
|
||||||
|
echo "--- Конфиг прокси ---"
|
||||||
|
if [[ -n "$TLS_CERT_FILE" && -n "$TLS_KEY_FILE" ]]; then
|
||||||
|
if [[ ! -f "$TLS_CERT_FILE" || ! -f "$TLS_KEY_FILE" ]]; then
|
||||||
|
echo "Ошибка: TLS_CERT_FILE/TLS_KEY_FILE указаны, но файлов нет!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
cat > "$PROXY_CONF" <<EOF
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $WEB_DOMAIN;
|
||||||
|
return 301 https://\$host\$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name $WEB_DOMAIN;
|
||||||
|
ssl_certificate $TLS_CERT_FILE;
|
||||||
|
ssl_certificate_key $TLS_KEY_FILE;
|
||||||
|
auth_basic "Authorized access only";
|
||||||
|
auth_basic_user_file $HTPASSWD_FILE;
|
||||||
|
location / {
|
||||||
|
proxy_pass http://$HQ_SRV_WEB;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $DOCKER_DOMAIN;
|
||||||
|
return 301 https://\$host\$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name $DOCKER_DOMAIN;
|
||||||
|
ssl_certificate $TLS_CERT_FILE;
|
||||||
|
ssl_certificate_key $TLS_KEY_FILE;
|
||||||
|
location / {
|
||||||
|
proxy_pass http://$BR_SRV_APP;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
echo "Режим: HTTPS (443) + редирект с 80"
|
||||||
|
else
|
||||||
|
# Временный вариант до доставки сертификатов: чистый HTTP
|
||||||
|
cat > "$PROXY_CONF" <<EOF
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $WEB_DOMAIN;
|
||||||
|
auth_basic "Authorized access only";
|
||||||
|
auth_basic_user_file $HTPASSWD_FILE;
|
||||||
|
location / {
|
||||||
|
proxy_pass http://$HQ_SRV_WEB;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name $DOCKER_DOMAIN;
|
||||||
|
location / {
|
||||||
|
proxy_pass http://$BR_SRV_APP;
|
||||||
|
proxy_set_header Host \$host;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
echo "Обходный режим: HTTP. После выдачи сертификата (hq-srv.sh) и копирования"
|
||||||
|
echo " cert/key вручную задайте TLS_CERT_FILE/TLS_KEY_FILE и ПОВТОРИТЕ скрипт."
|
||||||
|
fi
|
||||||
|
|
||||||
|
nginx -t && echo "Конфиг nginx корректен" || { echo "ОШИБКА nginx -t"; exit 1; }
|
||||||
|
systemctl enable --now "$NGINX_SERVICE" \
|
||||||
|
|| { echo "ПРОВЕРИТЬ: служба $NGINX_SERVICE не запустилась"; systemctl status "$NGINX_SERVICE" --no-pager; }
|
||||||
|
|
||||||
|
# --- 3. Доступность серверов из ISP ---
|
||||||
|
# ISP напрямую знает только сети линков /28 к маршрутизаторам. До
|
||||||
|
# HQ-SRV/BR-SRV трафик идёт через офисы — если curl с ISP не работает,
|
||||||
|
# добавьте статические маршруты вручную:
|
||||||
|
echo "Если curl не работает от ISP до HQ-SRV/BR-SRV — добавьте маршруты вручную:"
|
||||||
|
echo " ip route add <сеть офиса HQ а/п> via <адрес HQ-RTR на линке>"
|
||||||
|
echo " ip route add <сеть офиса BR а/п> via <адрес BR-RTR на линке>"
|
||||||
|
|
||||||
|
# --- 4. Часовой пояс ---
|
||||||
|
timedatectl set-timezone "$EXAM_TZ"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Самопроверка на ISP ==="
|
||||||
|
echo "curl для проверки прокси (HTTP-режим, с аутентификацией):"
|
||||||
|
echo " curl -u $WEB_LOGIN:$WEB_PASS http://$WEB_DOMAIN -I"
|
||||||
|
echo " curl http://$DOCKER_DOMAIN -I"
|
||||||
|
echo "curl для режима HTTPS: замените http на https"
|
||||||
Loading…
Reference in a new issue