This commit is contained in:
2026-01-12 20:08:31 +07:00
parent c67a2fe0e1
commit 959afaddcf

297
ib.sh
View File

@@ -1,237 +1,208 @@
#!/bin/bash #!/bin/bash
# =============================================================================
# 🌍 УНИВЕРСАЛЬНЫЙ СЕРВЕРНЫЙ КОМБАЙН v4.0
# Поддержка: Ubuntu, Debian, AlmaLinux, Rocky Linux, CentOS, Fedora
# =============================================================================
GREEN='\033[0;32m' GREEN='\033[0;32m'
RED='\033[0;31m' RED='\033[0;31m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' NC='\033[0m'
if [ "$EUID" -ne 0 ]; then # --- ДЕТЕКЦИЯ ОС ---
echo -e "${RED}Запустите скрипт от имени root!${NC}" detect_os() {
exit 1 if [ -f /etc/os-release ]; then
fi . /etc/os-release
OS_ID=$ID
OS_VERSION=$VERSION_ID
else
OS_ID=$(uname -s | tr '[:upper:]' '[:lower:]')
fi
pause(){ case $OS_ID in
read -p "Нажмите [Enter], чтобы продолжить..." fackEnterKey ubuntu|debian)
PKG_MGR="apt"
SSH_SERVICE="ssh"
DOCKER_CMD="curl -fsSL https://get.docker.com | sh"
;;
"almalinux"|"rocky"|"centos"|"fedora")
PKG_MGR="dnf"
SSH_SERVICE="sshd"
DOCKER_CMD="dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin"
;;
*) echo -e "${RED}❌ Неподдерживаемая ОС: $OS_ID${NC}"; exit 1 ;;
esac
echo -e "${BLUE}🖥️ ОС: ${OS_ID}${NC} | Пакеты: ${PKG_MGR} | SSH: ${SSH_SERVICE}"
}
# --- УТИЛИТЫ ---
pause(){ read -p "Нажмите [Enter]..." fackEnterKey; }
pkg_install() { $PKG_MGR update -y && $PKG_MGR install -y "$@"; }
service_restart() {
if command -v systemctl >/dev/null; then
systemctl restart "$1"
else
service "$1" restart
fi
} }
check_other_users() { check_other_users() {
USER_COUNT=$(awk -F: '$3 >= 1000 && $3 != 65534 {print $1}' /etc/passwd | wc -l) USER_COUNT=$(awk -F: '$3 >= 1000 && $3 != 65534 {print $1}' /etc/passwd | wc -l)
if [ "$USER_COUNT" -eq 0 ]; then [ "$USER_COUNT" -eq 0 ] && return 1 || return 0
echo -e "${RED}🚫 ОШИБКА: В системе ТОЛЬКО root пользователь!${NC}"
echo -e "${YELLOW}⚠️ НАСТРОЙКА SSH БЕЗОПАСНОСТИ НЕВОЗМОЖНА!${NC}"
echo ""
echo -e "${GREEN}✅ РЕШЕНИЕ:${NC}"
echo " 1. Выберите пункт ${YELLOW}3${NC} — Создать пользователя"
echo " 2. Введите имя и SSH ключ"
echo " 3. Проверьте подключение по SSH ключу"
echo " 4. ТОЛЬКО ПОТОМ пункт ${YELLOW}4${NC} — Безопасность SSH"
echo ""
read -p "Вернуться в меню? (y/n): " BACK
return 1
fi
echo -e "${GREEN}✅ Найдено пользователей: $USER_COUNT${NC}"
return 0
} }
# --- ФУНКЦИИ ---
setup_timezone_interactive() { setup_timezone_interactive() {
echo -e "${GREEN}🌍 Настройка часового пояса${NC}" echo -e "${GREEN}🌍 Часовой пояс${NC}"
echo "" echo "1) Europe/Moscow 2) Europe/Kiev 3) Asia/Almaty"
echo "Популярные зоны:" echo "4) Asia/Yekaterinburg 5) Asia/Novosibirsk 6) Europe/Berlin"
echo "1) Europe/Moscow (МСК)" echo "7) America/New_York 8) Asia/Tokyo 0) Ручной"
echo "2) Europe/Kiev (Киев)" read -p "► " TZ_CHOICE
echo "3) Asia/Almaty (Алматы)"
echo "4) Asia/Yekaterinburg (Екатеринбург)"
echo "5) Asia/Novosibirsk (Новосибирск)"
echo "6) Europe/Berlin (Берлин)"
echo "7) America/New_York (Нью-Йорк)"
echo "8) Asia/Tokyo (Токио)"
echo "0) Ручной ввод"
echo ""
read -p "Выберите зону (0-8): " TZ_CHOICE
case $TZ_CHOICE in case $TZ_CHOICE in
1) TZ="Europe/Moscow" ;; 1) TZ="Europe/Moscow";; 2) TZ="Europe/Kiev";;
2) TZ="Europe/Kiev" ;; 3) TZ="Asia/Almaty";; 4) TZ="Asia/Yekaterinburg";;
3) TZ="Asia/Almaty" ;; 5) TZ="Asia/Novosibirsk";; 6) TZ="Europe/Berlin";;
4) TZ="Asia/Yekaterinburg" ;; 7) TZ="America/New_York";; 8) TZ="Asia/Tokyo";;
5) TZ="Asia/Novosibirsk" ;; 0) read -p "Зона: " TZ;;
6) TZ="Europe/Berlin" ;; *) return;;
7) TZ="America/New_York" ;;
8) TZ="Asia/Tokyo" ;;
0)
echo "Доступные зоны: timedatectl list-timezones | grep"
read -p "Введите зону (например Europe/Moscow): " TZ
;;
*) echo "Неверный выбор!"; pause; return ;;
esac esac
timedatectl set-timezone "$TZ" timedatectl set-timezone "$TZ" 2>/dev/null || echo "timedatectl недоступен"
timedatectl set-ntp true timedatectl set-ntp true 2>/dev/null || true
echo -e "${GREEN}Часовой пояс: $TZ${NC}" echo -e "${GREEN}$TZ | $(date)${NC}"
echo "📅 Текущее время: $(date)"
echo "🔄 NTP синхронизация включена"
} }
install_audit_with_rotation() { install_base_pkgs() {
echo -e "${GREEN}🔒 Установка auditd с ротацией логов...${NC}" echo -e "${GREEN}📦 База${NC}"
apt update && apt install -y auditd audispd-plugins logrotate case $PKG_MGR in
apt) pkg_install mc htop zip wget curl git net-tools gnupg2 unzip ;;
dnf) pkg_install mc htop zip wget curl git net-tools gnupg2 unzip ;;
esac
cat > /etc/audit/rules.d/server-setup.rules << EOF # gdu для всех
-w /etc/sudoers -p wa -k sudoers curl -L "https://github.com/dundee/gdu/releases/latest/download/gdu_linux_amd64.tgz" | tar xz
-w /etc/passwd -p wa -k identity chmod +x gdu_linux_amd64 && mv gdu_linux_amd64 /usr/local/bin/
-w /etc/group -p wa -k identity
-w /etc/ssh/sshd_config -p wa -k ssh_config
-a always,exit -F arch=b64 -S execve -k process_exec
EOF
cat >> /etc/audit/auditd.conf << EOF
max_log_file = 50
max_log_file_action = rotate
num_logs = 8
space_left = 100
space_left_action = rotate
EOF
cat > /etc/logrotate.d/auditd << EOF
/var/log/audit/audit.log {
weekly
rotate 12
create 640 root root
postrotate
/bin/kill -HUP \`cat /var/run/auditd.pid 2> /dev/null\` 2> /dev/null || true
endscript
}
EOF
systemctl restart auditd rsyslog
systemctl enable auditd
echo -e "${GREEN}✅ Аудит настроен. Логи: /var/log/audit/audit.log${NC}"
echo " Просмотр: ${YELLOW}ausearch -k ssh_config${NC}"
} }
create_user_full() { create_user_full() {
echo -e "${GREEN}👤 Создание пользователя...${NC}" echo -e "${GREEN}👤 Пользователь${NC}"
read -p "Имя пользователя: " UNAME read -p "Имя: " UNAME
echo "1) Только SSH 2) Пароль+SSH"
echo -e "${YELLOW}Выберите метод входа:${NC}" read -p "► " AUTH_METHOD
echo "1) Только SSH ключ (рекомендуется)"
echo "2) Пароль + SSH ключ"
read -p "Выбор (1/2): " AUTH_METHOD
useradd -m -s /bin/bash "$UNAME" useradd -m -s /bin/bash "$UNAME"
usermod -aG sudo "$UNAME" usermod -aG wheel,sudo "$UNAME" 2>/dev/null || usermod -aG sudo "$UNAME"
if [ "$AUTH_METHOD" == "1" ]; then if [ "$AUTH_METHOD" == "1" ]; then
echo -e "${GREEN}SSH ключ (вставьте целиком):${NC}" read -p "SSH ключ: " UKEY
read -p "> " UKEY
mkdir -p /home/$UNAME/.ssh mkdir -p /home/$UNAME/.ssh
echo "$UKEY" > /home/$UNAME/.ssh/authorized_keys echo "$UKEY" > /home/$UNAME/.ssh/authorized_keys
passwd -l "$UNAME" passwd -l "$UNAME"
echo -e "${GREEN}✅ Только SSH ключ${NC}" echo -e "${GREEN}✅ Только SSH${NC}"
else else
read -s -p "Пароль: " PASS1 read -s -p "Пароль: " PASS1; echo
echo read -s -p "Повторить: " PASS2; echo
read -s -p "Повторите пароль: " PASS2 [ "$PASS1" = "$PASS2" ] && echo "$UNAME:$PASS1" | chpasswd
echo read -p "SSH ключ (опц.): " UKEY
if [ "$PASS1" == "$PASS2" ]; then [ -n "$UKEY" ] && echo "$UKEY" > /home/$UNAME/.ssh/authorized_keys
echo "$UNAME:$PASS1" | chpasswd
echo -e "${GREEN}✅ Пароль установлен${NC}"
read -p "SSH ключ (опционально): " UKEY
if [ ! -z "$UKEY" ]; then
mkdir -p /home/$UNAME/.ssh
echo "$UKEY" > /home/$UNAME/.ssh/authorized_keys
fi
fi
fi fi
chmod 700 /home/$UNAME/.ssh 2>/dev/null || true chown -R "$UNAME:$UNAME" /home/$UNAME/.ssh
chmod 600 /home/$UNAME/.ssh/authorized_keys 2>/dev/null || true chmod 700 /home/$UNAME/.ssh; chmod 600 /home/$UNAME/.ssh/authorized_keys
chown -R $UNAME:$UNAME /home/$UNAME/.ssh 2>/dev/null || true
echo "$UNAME ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/$UNAME
chmod 440 /etc/sudoers.d/$UNAME
echo -e "${GREEN}✅ Пользователь $UNAME готов!${NC}" # Sudo без пароля
echo "$UNAME ALL=(ALL) NOPASSWD: ALL" > "/etc/sudoers.d/${UNAME}"
chmod 440 "/etc/sudoers.d/${UNAME}"
} }
setup_ssh_security() { setup_ssh_security() {
clear clear; echo -e "${RED}🔒 SSH БЕЗОПАСНОСТЬ${NC}"
echo -e "${RED}🔒 НАСТРОЙКА БЕЗОПАСНОСТИ SSH${NC}"
if ! check_other_users; then if ! check_other_users; then
echo -e "${RED}🚫 Операция отменена!${NC}" echo -e "${RED}🚫 Только root! Сначала пункт 3!${NC}"
pause pause; return
return
fi fi
echo -e "${YELLOW}⚠️ ВНИМАНИЕ:${NC}" echo -e "${YELLOW}⚠️ Будет:${NC}"
echo " • Будет ${RED}ЗАПРЕЩЁН${NC} вход под root" echo " ${RED}${NC} root, ${RED}${NC} пароли, ${GREEN}${NC} только ключи"
echo " • Будет ${RED}ЗАПРЕЩЁН${NC} вход по паролю" read -p "ПРОДолжить? (y/N): " CONFIRM
echo " • Будет ${GREEN}РАЗРЕШЁН${NC} только SSH ключи"
echo ""
read -p "ПРОДОЛЖИТЬ? (y/N): " CONFIRM [ "$CONFIRM" != "y" ] && { echo "Отменено."; pause; return; }
if [ "$CONFIRM" != "y" ]; then
echo "Отменено."
pause
return
fi
SSHD_CONFIG="/etc/ssh/sshd_config" SSHD_CONFIG="/etc/ssh/${SSH_SERVICE}_config"
cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak.$(date +%Y%m%d)" cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak.$(date +%Y%m%d)"
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' "$SSHD_CONFIG" sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' "$SSHD_CONFIG"
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' "$SSHD_CONFIG" sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' "$SSHD_CONFIG"
sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' "$SSHD_CONFIG" sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' "$SSHD_CONFIG"
if sshd -t 2>/dev/null; then if command -v "$SSH_SERVICE" >/dev/null && "$SSH_SERVICE" -t 2>/dev/null; then
systemctl restart ssh service_restart "$SSH_SERVICE"
echo -e "${GREEN}✅ SSH защищён!${NC}" echo -e "${GREEN}✅ SSH защищён!${NC}"
else else
echo -e "${RED}❌ Ошибка в sshd_config! Восстановление...${NC}" echo -e "${RED}❌ Ошибка! Восстановление...${NC}"
cp "${SSHD_CONFIG}.bak.$(date +%Y%m%d)" "$SSHD_CONFIG" cp "${SSHD_CONFIG}.bak.$(date +%Y%m%d)" "$SSHD_CONFIG"
systemctl restart ssh service_restart "$SSH_SERVICE"
fi fi
pause pause
} }
# --- ОСНОВНОЕ МЕНЮ --- install_audit_with_rotation() {
echo -e "${GREEN}🔒 Аудит${NC}"
case $PKG_MGR in
apt) pkg_install auditd audispd-plugins logrotate ;;
dnf) pkg_install audit policycoreutils-python-utils logrotate ;;
esac
cat > /etc/audit/rules.d/server-setup.rules << 'EOF'
-w /etc/sudoers -p wa -k sudoers
-w /etc/passwd -p wa -k identity
-w /etc/ssh/sshd_config -p wa -k ssh_config
EOF
sed -i '/^max_log_file/c\max_log_file = 50' /etc/audit/auditd.conf 2>/dev/null || \
echo 'max_log_file = 50' >> /etc/audit/auditd.conf
systemctl restart auditd rsyslog 2>/dev/null || service auditd restart
systemctl enable auditd 2>/dev/null || chkconfig auditd on
}
# --- МЕНЮ ---
detect_os
while true; do while true; do
clear clear
echo "=============================================" echo "============================================="
echo " 🚀 SERVER ULTIMATE SETUP v3.2 🚀 " echo " 🚀 SERVER ULTIMATE v4.0 ($OS_ID $OS_VERSION) 🚀"
echo "=============================================" echo "============================================="
echo "1) 📛 Сменить Hostname" echo "1) 📛 Hostname 2) 🌍 ${GREEN}Часовой пояс${NC} + база"
echo "2) 🌍 ${GREEN}ЧАСОВОЙ ПОЯС${NC} + база (mc, htop, gdu)" echo "3) 👤 ${GREEN}Пользователь${NC} 4) 🔒 SSH безопасность"
echo "3) 👤 СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ (пароль/ключ)" echo "5) 📊 Аудит 6) 🐳 Docker"
echo "4) 🔒 БЕЗОПАСНОСТЬ SSH (только после 3!)" echo "7) 🌐 WireGuard 8) 🔐 OpenVPN"
echo "5) 📊 Аудит + ротация логов" echo "9) 📈 Мониторинг 10) 🛡️ Fail2Ban"
echo "6) 🐳 Docker + Compose" echo "11) 🧹 Очистка 0) ❌ Выход"
echo "7) 🌐 WireGuard"
echo "8) 🔐 OpenVPN (Angristan)"
echo "9) 📈 Мониторинг"
echo "10) 🛡️ Fail2Ban"
echo "11) 🧹 Очистка ядер"
echo "0) ❌ Выход"
echo "=============================================" echo "============================================="
read -p "► " opt read -p "► " opt
case $opt in case $opt in
1) read -p "Имя хоста: " HN; hostnamectl set-hostname "$HN"; systemctl restart systemd-hostnamed; pause ;; 1) read -p "Имя: " HN; hostnamectl set-hostname "$HN" 2>/dev/null || hostname "$HN"; pause ;;
2) setup_timezone_interactive; apt update -y && apt install -y mc htop zip wget curl git net-tools gnupg2; curl -L "https://github.com/dundee/gdu/releases/latest/download/gdu_linux_amd64.tgz" | tar xz && chmod +x gdu_linux_amd64 && mv gdu_linux_amd64 /usr/bin/; pause ;; 2) setup_timezone_interactive; install_base_pkgs; pause ;;
3) create_user_full ; pause ;; 3) create_user_full; pause ;;
4) setup_ssh_security ;; 4) setup_ssh_security ;;
5) install_audit_with_rotation ; pause ;; 5) install_audit_with_rotation; pause ;;
6) curl -fsSL https://get.docker.com | sh && apt install -y docker-compose-plugin; pause ;; 6) $DOCKER_CMD; systemctl enable --now docker 2>/dev/null || service docker start; pause ;;
7) curl -fsSL https://git.io/wireguard -o wg.sh && bash wg.sh; pause ;; 7) curl -fsSL https://git.io/wireguard -o wg.sh && bash wg.sh; pause ;;
8) curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh && chmod +x openvpn-install.sh && ./openvpn-install.sh; pause ;; 8) curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh && chmod +x openvpn-install.sh && ./openvpn-install.sh; pause ;;
9) apt install -y glances; pause ;; 9) pkg_install glances htop; pause ;;
10) apt install -y fail2ban && systemctl enable --now fail2ban; pause ;; 10) pkg_install fail2ban; systemctl enable --now fail2ban 2>/dev/null || service fail2ban start; pause ;;
11) apt-get autoremove -y && apt-get autoclean -y; pause ;; 11) $PKG_MGR autoremove -y; pause ;;
0) break ;; 0) break ;;
*) echo -e "${RED}❌ Неверный пункт!${NC}"; sleep 1 ;; *) echo -e "${RED}❌ Неверно!${NC}"; sleep 1 ;;
esac esac
done done
echo -e "${GREEN} Настройка завершена!${NC}" echo -e "${GREEN}🎉 Настройка завершена!${NC}"