183 lines
9.4 KiB
Bash
183 lines
9.4 KiB
Bash
#!/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)"
|