net/zadanie3/hq-srv.sh

183 lines
9.4 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 (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="Asia/Yekaterinburg" # по заданию — Екатеринбург
# --- 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)"