#!/bin/bash # ============================================================ # ЗАДАНИЕ 1. Настройка HQ-SRV (Linux / РЕД ОС 8) # Имя, адрес в VLAN 100, пользователь sshuser (UID 2027, sudo без пароля), # SSH: порт 2027, только sshuser, 2 попытки, баннер, # DNS-сервер (dnsmasq): зона au-team.irpo по таблице 3, forwarder, # часовой пояс. # ============================================================ # --- Проверка прав root --- if [[ $EUID -ne 0 ]]; then echo "Запустите скрипт с правами root (sudo bash hq-srv.sh)" exit 1 fi # ================= ПЕРЕМЕННЫЕ (заполните перед запуском) ================= HOSTNAME_FQDN="hq-srv.au-team.irpo" # таблица 3, запись hq-srv.au-team.irpo # --- Единственные адресные переменные --- # Схема HQ: VLAN100 = HQ_BASE+0 /27 (HQ-RTR = сеть+1, HQ-SRV = сеть+2 — # адрес HQ-SRV и шлюз вычисляются automátически) HQ_BASE="10.10.100.0/24" # поменяйте на свой расчёт при необходимости HQ_CLI_IP="" # адрес HQ-CLI — вписать ПОСЛЕ того, как он получит адрес по DHCP SRV_IF="enp0s3" # 1-й NIC — к HQ-SW (VLAN 100; тег снимает HQ-SW или сетевой адаптер) DNS_SRV="8.8.8.8" # внешний DNS для самого сервера (необязательно) # --- Пользователь sshuser (значения из задания) --- SSH_USER="sshuser" SSH_USER_PASS="P@ssw0rd" SSH_USER_UID="2027" # --- SSH (значения из задания) --- SSH_PORT="2027" # порт подключения SSH_BANNER_TEXT="Authorized access only" SSH_BANNER_FILE="/etc/ssh/exam-banner" SSHD_CONF="/etc/ssh/sshd_config" # --- DNS-сервер (dnsmasq; ПРОВЕРИТЬ: пакет/служба на РЕД ОС 8) --- DNS_PACKAGE="dnsmasq" DNS_SERVICE="dnsmasq" DNS_HOSTS_FILE="/etc/exam.hosts" # наши записи A/PTR, перезаписывается целиком DNS_EXTRA_CONF="/etc/dnsmasq.d/exam.conf" DNS_DOMAIN="au-team.irpo" DNS_UPSTREAM="8.8.8.8" # forwarder: любой общий DNS по заданию (можно 77.88.8.7, 77.88.8.3 и др. по заданию) # Адрес, на котором слушать DNS (DNS_LISTEN), вычисляется из SRV_ADDR # Все адреса DNS-записей, кроме HQ_CLI_IP, берутся из HQ_BASE/BR_BASE-схемы # --- Прочее --- EXAM_TZ="Asia/Yekaterinburg" # по заданию — Екатеринбург BR_BASE="10.10.200.0/24" # базовая сеть офиса BR (для DNS-записей BR-устройств) NM_CONF_DIR="/etc/NetworkManager/system-connections" # ============ Проверка заполнения переменных ============ MISSING=() for NAME in HOSTNAME_FQDN SRV_IF HQ_BASE SSH_USER SSH_USER_PASS SSH_USER_UID \ SSH_PORT DNS_UPSTREAM HQ_CLI_IP EXAM_TZ; do [[ -z "${!NAME}" ]] && MISSING+=("$NAME") done if [[ ${#MISSING[@]} -gt 0 ]]; then echo "Заполните переменные в начале скрипта: ${MISSING[*]}" exit 1 fi # ==== Автозаполнение адресации (план по схеме — tools/subnets.py) ==== REPO_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) eval "$(python3 "$REPO_ROOT/tools/subnets.py" hq "$HQ_BASE")" eval "$(python3 "$REPO_ROOT/tools/subnets.py" br "$BR_BASE")" # SRV_ADDR и SRV_GW приходят из схемы echo "Адресация: сервер $SRV_ADDR (сеть $VLAN100_NET), шлюз $SRV_GW" # Адрес HQ-SRV без префикса — для записей A/PTR и listening DNS SRV_ADDR_HOST="${SRV_ADDR%/*}" DNS_LISTEN="$SRV_ADDR_HOST" echo "=== Настройка HQ-SRV ===" # --- 1. Имя хоста --- hostnamectl set-hostname "$HOSTNAME_FQDN" echo "Имя хоста: $(hostname)" # --- 2. Сеть --- echo "--- Профиль $SRV_IF ---" cat > "$NM_CONF_DIR/$SRV_IF.nmconnection" </dev/null; then echo "DNS уже прописан: $(grep '^nameserver' /etc/resolv.conf)" else echo "nameserver $DNS_SRV" > /etc/resolv.conf fi fi # --- 3. Пользователь sshuser: UID 2027, пароль, sudo без пароля --- if id "$SSH_USER" &>/dev/null; then echo "Пользователь уже существует" else useradd -u "$SSH_USER_UID" -m "$SSH_USER" fi echo "$SSH_USER:$SSH_USER_PASS" | chpasswd echo "$SSH_USER ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/sshuser chmod 440 /etc/sudoers.d/sshuser echo "Проверка UID: id $SSH_USER" # --- 4. SSH: порт 2027, только sshuser, MaxAuthTries 2, баннер --- echo "--- Настройка SSH (порт $SSH_PORT) ---" echo "$SSH_BANNER_TEXT" > "$SSH_BANNER_FILE" # Удаляем старые значения (в т.ч. закомментированные), затем дописываем новые. # Повторный запуск не создаёт дублей: сначала чистим, потом пишем. for KEY in Port AllowUsers MaxAuthTries Banner; do sed -riE "s/^[[:space:]]*[#]*[[:space:]]*${KEY}[[:space:]].*$//" "$SSHD_CONF" done cat >> "$SSHD_CONF" </dev/null 2>&1 && [[ $(getenforce) == "Enforcing" ]]; then if ! semanage port -l | grep -qw "$SSH_PORT" 2>/dev/null; then semanage port -a -t ssh_port_t -p tcp "$SSH_PORT" 2>/dev/null \ || echo "ПРОВЕРИТЬ: не удалось добавить SELinux-порт $SSH_PORT" fi fi sshd -t && echo "Конфиг sshd корректен" || echo "ПРОВЕРИТЬ: sshd -t вернул ошибку" systemctl restart sshd || systemctl restart ssh echo "Проверка: ss -tlnp | grep ':$SSH_PORT'" # --- 5. DNS-сервер (dnsmasq): зона au-team.irpo по таблице 3 --- echo "--- DNS ($DNS_PACKAGE) ---" dnf install -y "$DNS_PACKAGE" || echo "ПРОВЕРИТЬ: пакет $DNS_PACKAGE не установился" # Записи A и PTR (PTR появляется автоматически по записям hosts — # убедитесь на стенде, что обратные зоны отвечают) cat > "$DNS_HOSTS_FILE" < "$DNS_EXTRA_CONF" <