net/zadanie1/hq-srv.sh

187 lines
7.7 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
# ============================================================
# ЗАДАНИЕ 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
# --- Сеть ---
SRV_IF="" # интерфейс в сторону HQ-SW (VLAN 100)
SRV_ADDR="" # адрес HQ-SRV в VLAN 100, формат адрес/префикс
SRV_GW="" # шлюз — адрес HQ-RTR в VLAN 100
DNS_SRV="" # внешний DNS для самого сервера (необязательно, напр. 77.88.8.7)
# --- Пользователь 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="" # forwarder по заданию: любой общий DNS (77.88.8.7 / 77.88.8.3 / др.)
DNS_LISTEN="" # адрес, на котором слушать DNS (адрес HQ-SRV в VLAN 100)
# --- Адреса для записей таблицы 3 (все без префикса) ---
HQ_RTR_IP="" # hq-rtr.au-team.irpo
BR_RTR_IP="" # br-rtr.au-team.irpo
BR_FW_IP="" # br-fw.au-team.irpo
HQ_CLI_IP="" # hq-cli.au-team.irpo
BR_SRV_IP="" # br-srv.au-team.irpo
ISP_TO_HQ_IP="" # docker.au-team.irpo — ISP со стороны HQ-RTR
ISP_TO_BR_IP="" # web.au-team.irpo — ISP со стороны BR-RTR
# --- Прочее ---
EXAM_TZ="Europe/Moscow" # проверить на экзамене
NM_CONF_DIR="/etc/NetworkManager/system-connections"
# ============ Проверка заполнения переменных ============
MISSING=()
for NAME in HOSTNAME_FQDN SRV_IF SRV_ADDR SRV_GW SSH_USER SSH_USER_PASS SSH_USER_UID \
SSH_PORT DNS_UPSTREAM DNS_LISTEN HQ_RTR_IP BR_RTR_IP BR_FW_IP HQ_CLI_IP \
BR_SRV_IP ISP_TO_HQ_IP ISP_TO_BR_IP EXAM_TZ; do
[[ -z "${!NAME}" ]] && MISSING+=("$NAME")
done
if [[ ${#MISSING[@]} -gt 0 ]]; then
echo "Заполните переменные в начале скрипта: ${MISSING[*]}"
exit 1
fi
# Адрес HQ-SRV без префикса — для записи A/PTR на себя
SRV_ADDR_HOST="${SRV_ADDR%/*}"
echo "=== Настройка HQ-SRV ==="
# --- 1. Имя хоста ---
hostnamectl set-hostname "$HOSTNAME_FQDN"
echo "Имя хоста: $(hostname)"
# --- 2. Сеть ---
echo "--- Профиль $SRV_IF ---"
cat > "$NM_CONF_DIR/$SRV_IF.nmconnection" <<EOF
[connection]
id=$SRV_IF
type=ethernet
autoconnect=yes
interface-name=$SRV_IF
[ethernet]
[ipv4]
address1=$SRV_ADDR
gateway=$SRV_GW
method=manual
[ipv6]
method=disabled
[proxy]
EOF
chmod 600 "$NM_CONF_DIR/$SRV_IF.nmconnection"
nmcli connection reload
nmcli connection up "$SRV_IF" || echo "ВНИМАНИЕ: не поднялся $SRV_IF"
if [[ -n "$DNS_SRV" ]]; then
if grep -q "^nameserver" /etc/resolv.conf 2>/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" <<EOF
Port $SSH_PORT
AllowUsers $SSH_USER
MaxAuthTries 2
Banner $SSH_BANNER_FILE
EOF
# Если включён SELinux, порт 2027 нужно разрешить политике sshd
# (ПРОВЕРИТЬ на РЕД ОС 8; для semanage может понадобиться пакет
# policycoreutils-python-utils)
if command -v getenforce >/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" <<EOF
$HQ_RTR_IP hq-rtr.au-team.irpo hq-rtr
$BR_RTR_IP br-rtr.au-team.irpo br-rtr
$BR_FW_IP br-fw.au-team.irpo br-fw
$SRV_ADDR_HOST hq-srv.au-team.irpo hq-srv
$HQ_CLI_IP hq-cli.au-team.irpo hq-cli
$BR_SRV_IP br-srv.au-team.irpo br-srv
$ISP_TO_HQ_IP docker.au-team.irpo docker
$ISP_TO_BR_IP web.au-team.irpo web
EOF
cat > "$DNS_EXTRA_CONF" <<EOF
domain=$DNS_DOMAIN
local=/$DNS_DOMAIN/
listen-address=127.0.0.1,$DNS_LISTEN
server=$DNS_UPSTREAM
addn-hosts=$DNS_HOSTS_FILE
EOF
systemctl enable --now "$DNS_SERVICE" \
|| { echo "ПРОВЕРИТЬ: служба $DNS_SERVICE не запустилась"; systemctl status "$DNS_SERVICE" --no-pager; }
# --- 6. Часовой пояс ---
timedatectl set-timezone "$EXAM_TZ"
echo ""
echo "=== Самопроверка для HQ-SRV ==="
ip -4 -br address show
echo ""
echo "Дополнительные проверки вручную:"
echo " ss -tlnp | grep ':$SSH_PORT' (SSH на порту 2027?)"
echo " ss -uln | grep ':53' (DNS слушает?)"
echo " dig +short hq-rtr.$DNS_DOMAIN @127.0.0.1"
echo " dig +short -x $SRV_ADDR_HOST @127.0.0.1 (проверка PTR HQ-SRV)"
echo " ping -c2 $SRV_GW (шлюз HQ-RTR доступен?)"