192 lines
8 KiB
Bash
192 lines
8 KiB
Bash
#!/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="enp0s3" # 1-й NIC — к HQ-SW (VLAN 100; тег снимает HQ-SW или сетевой адаптер)
|
||
SRV_ADDR="" # адрес HQ-SRV в VLAN 100 (префикс проставится сам: /28)
|
||
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="77.88.8.7" # forwarder: любой общий DNS по заданию (можно 77.88.8.3 и др.)
|
||
# Адрес, на котором слушать DNS (DNS_LISTEN), вычисляется из SRV_ADDR
|
||
|
||
# --- Адреса для записей таблицы 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 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 и listening DNS
|
||
# Префикс VLAN 100 по заданию (достаточно голого IP)
|
||
add_prefix () { if [[ "$2" == */* ]]; then echo "$2"; else echo "$2/$1"; fi; }
|
||
SRV_ADDR=$(add_prefix 28 "$SRV_ADDR")
|
||
|
||
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" <<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 доступен?)"
|