Задание 3

This commit is contained in:
parent 89c288b52d
commit 072e4c85b3
4 changed files with 519 additions and 0 deletions

95
zadanie3/br-srv.sh Normal file
View 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
View 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
View 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
View 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"