diff --git a/ib.sh b/ib.sh index 74d5515..64f6f2b 100644 --- a/ib.sh +++ b/ib.sh @@ -1,237 +1,208 @@ #!/bin/bash +# ============================================================================= +# 🌍 УНИВЕРСАЛЬНЫЙ СЕРВЕРНЫЙ КОМБАЙН v4.0 +# Поддержка: Ubuntu, Debian, AlmaLinux, Rocky Linux, CentOS, Fedora +# ============================================================================= + GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' +BLUE='\033[0;34m' NC='\033[0m' -if [ "$EUID" -ne 0 ]; then - echo -e "${RED}Запустите скрипт от имени root!${NC}" - exit 1 -fi +# --- ДЕТЕКЦИЯ ОС --- +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS_ID=$ID + OS_VERSION=$VERSION_ID + else + OS_ID=$(uname -s | tr '[:upper:]' '[:lower:]') + fi + + case $OS_ID in + 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 +# --- УТИЛИТЫ --- +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() { USER_COUNT=$(awk -F: '$3 >= 1000 && $3 != 65534 {print $1}' /etc/passwd | wc -l) - if [ "$USER_COUNT" -eq 0 ]; then - 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 + [ "$USER_COUNT" -eq 0 ] && return 1 || return 0 } +# --- ФУНКЦИИ --- setup_timezone_interactive() { - echo -e "${GREEN}🌍 Настройка часового пояса${NC}" - echo "" - echo "Популярные зоны:" - echo "1) Europe/Moscow (МСК)" - echo "2) Europe/Kiev (Киев)" - 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 + echo -e "${GREEN}🌍 Часовой пояс${NC}" + echo "1) Europe/Moscow 2) Europe/Kiev 3) Asia/Almaty" + echo "4) Asia/Yekaterinburg 5) Asia/Novosibirsk 6) Europe/Berlin" + echo "7) America/New_York 8) Asia/Tokyo 0) Ручной" + read -p "► " TZ_CHOICE case $TZ_CHOICE in - 1) TZ="Europe/Moscow" ;; - 2) TZ="Europe/Kiev" ;; - 3) TZ="Asia/Almaty" ;; - 4) TZ="Asia/Yekaterinburg" ;; - 5) TZ="Asia/Novosibirsk" ;; - 6) TZ="Europe/Berlin" ;; - 7) TZ="America/New_York" ;; - 8) TZ="Asia/Tokyo" ;; - 0) - echo "Доступные зоны: timedatectl list-timezones | grep" - read -p "Введите зону (например Europe/Moscow): " TZ - ;; - *) echo "Неверный выбор!"; pause; return ;; + 1) TZ="Europe/Moscow";; 2) TZ="Europe/Kiev";; + 3) TZ="Asia/Almaty";; 4) TZ="Asia/Yekaterinburg";; + 5) TZ="Asia/Novosibirsk";; 6) TZ="Europe/Berlin";; + 7) TZ="America/New_York";; 8) TZ="Asia/Tokyo";; + 0) read -p "Зона: " TZ;; + *) return;; esac - timedatectl set-timezone "$TZ" - timedatectl set-ntp true - echo -e "${GREEN}✅ Часовой пояс: $TZ${NC}" - echo "📅 Текущее время: $(date)" - echo "🔄 NTP синхронизация включена" + timedatectl set-timezone "$TZ" 2>/dev/null || echo "timedatectl недоступен" + timedatectl set-ntp true 2>/dev/null || true + echo -e "${GREEN}✅ $TZ | $(date)${NC}" } -install_audit_with_rotation() { - echo -e "${GREEN}🔒 Установка auditd с ротацией логов...${NC}" - apt update && apt install -y auditd audispd-plugins logrotate +install_base_pkgs() { + echo -e "${GREEN}📦 База${NC}" + 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 --w /etc/sudoers -p wa -k sudoers --w /etc/passwd -p wa -k identity --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}" + # gdu для всех + 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/local/bin/ } create_user_full() { - echo -e "${GREEN}👤 Создание пользователя...${NC}" - read -p "Имя пользователя: " UNAME - - echo -e "${YELLOW}Выберите метод входа:${NC}" - echo "1) Только SSH ключ (рекомендуется)" - echo "2) Пароль + SSH ключ" - read -p "Выбор (1/2): " AUTH_METHOD + echo -e "${GREEN}👤 Пользователь${NC}" + read -p "Имя: " UNAME + echo "1) Только SSH 2) Пароль+SSH" + read -p "► " AUTH_METHOD 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 - echo -e "${GREEN}SSH ключ (вставьте целиком):${NC}" - read -p "> " UKEY + read -p "SSH ключ: " UKEY mkdir -p /home/$UNAME/.ssh echo "$UKEY" > /home/$UNAME/.ssh/authorized_keys passwd -l "$UNAME" - echo -e "${GREEN}✅ Только SSH ключ${NC}" + echo -e "${GREEN}✅ Только SSH${NC}" else - read -s -p "Пароль: " PASS1 - echo - read -s -p "Повторите пароль: " PASS2 - echo - if [ "$PASS1" == "$PASS2" ]; then - 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 + read -s -p "Пароль: " PASS1; echo + read -s -p "Повторить: " PASS2; echo + [ "$PASS1" = "$PASS2" ] && echo "$UNAME:$PASS1" | chpasswd + read -p "SSH ключ (опц.): " UKEY + [ -n "$UKEY" ] && echo "$UKEY" > /home/$UNAME/.ssh/authorized_keys fi - chmod 700 /home/$UNAME/.ssh 2>/dev/null || true - chmod 600 /home/$UNAME/.ssh/authorized_keys 2>/dev/null || true - 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 + chown -R "$UNAME:$UNAME" /home/$UNAME/.ssh + chmod 700 /home/$UNAME/.ssh; chmod 600 /home/$UNAME/.ssh/authorized_keys - 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() { - clear - echo -e "${RED}🔒 НАСТРОЙКА БЕЗОПАСНОСТИ SSH${NC}" + clear; echo -e "${RED}🔒 SSH БЕЗОПАСНОСТЬ${NC}" - if ! check_other_users; then - echo -e "${RED}🚫 Операция отменена!${NC}" - pause - return + if ! check_other_users; then + echo -e "${RED}🚫 Только root! Сначала пункт 3!${NC}" + pause; return fi - echo -e "${YELLOW}⚠️ ВНИМАНИЕ:${NC}" - echo " • Будет ${RED}ЗАПРЕЩЁН${NC} вход под root" - echo " • Будет ${RED}ЗАПРЕЩЁН${NC} вход по паролю" - echo " • Будет ${GREEN}РАЗРЕШЁН${NC} только SSH ключи" - echo "" + echo -e "${YELLOW}⚠️ Будет:${NC}" + echo " ${RED}✖${NC} root, ${RED}✖${NC} пароли, ${GREEN}✔${NC} только ключи" + read -p "ПРОДолжить? (y/N): " CONFIRM - read -p "ПРОДОЛЖИТЬ? (y/N): " CONFIRM - if [ "$CONFIRM" != "y" ]; then - echo "Отменено." - pause - return - fi + [ "$CONFIRM" != "y" ] && { echo "Отменено."; pause; return; } - SSHD_CONFIG="/etc/ssh/sshd_config" + SSHD_CONFIG="/etc/ssh/${SSH_SERVICE}_config" cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak.$(date +%Y%m%d)" sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' "$SSHD_CONFIG" sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' "$SSHD_CONFIG" sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' "$SSHD_CONFIG" - if sshd -t 2>/dev/null; then - systemctl restart ssh + if command -v "$SSH_SERVICE" >/dev/null && "$SSH_SERVICE" -t 2>/dev/null; then + service_restart "$SSH_SERVICE" echo -e "${GREEN}✅ SSH защищён!${NC}" else - echo -e "${RED}❌ Ошибка в sshd_config! Восстановление...${NC}" + echo -e "${RED}❌ Ошибка! Восстановление...${NC}" cp "${SSHD_CONFIG}.bak.$(date +%Y%m%d)" "$SSHD_CONFIG" - systemctl restart ssh + service_restart "$SSH_SERVICE" fi 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 clear echo "=============================================" - echo " 🚀 SERVER ULTIMATE SETUP v3.2 🚀 " + echo " 🚀 SERVER ULTIMATE v4.0 ($OS_ID $OS_VERSION) 🚀" echo "=============================================" - echo "1) 📛 Сменить Hostname" - echo "2) 🌍 ${GREEN}ЧАСОВОЙ ПОЯС${NC} + база (mc, htop, gdu)" - echo "3) 👤 СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ (пароль/ключ)" - echo "4) 🔒 БЕЗОПАСНОСТЬ SSH (только после 3!)" - echo "5) 📊 Аудит + ротация логов" - echo "6) 🐳 Docker + Compose" - echo "7) 🌐 WireGuard" - echo "8) 🔐 OpenVPN (Angristan)" - echo "9) 📈 Мониторинг" - echo "10) 🛡️ Fail2Ban" - echo "11) 🧹 Очистка ядер" - echo "0) ❌ Выход" + echo "1) 📛 Hostname 2) 🌍 ${GREEN}Часовой пояс${NC} + база" + echo "3) 👤 ${GREEN}Пользователь${NC} 4) 🔒 SSH безопасность" + echo "5) 📊 Аудит 6) 🐳 Docker" + echo "7) 🌐 WireGuard 8) 🔐 OpenVPN" + echo "9) 📈 Мониторинг 10) 🛡️ Fail2Ban" + echo "11) 🧹 Очистка 0) ❌ Выход" echo "=============================================" read -p "► " opt case $opt in - 1) read -p "Имя хоста: " HN; hostnamectl set-hostname "$HN"; systemctl restart systemd-hostnamed; 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 ;; - 3) create_user_full ; pause ;; + 1) read -p "Имя: " HN; hostnamectl set-hostname "$HN" 2>/dev/null || hostname "$HN"; pause ;; + 2) setup_timezone_interactive; install_base_pkgs; pause ;; + 3) create_user_full; pause ;; 4) setup_ssh_security ;; - 5) install_audit_with_rotation ; pause ;; - 6) curl -fsSL https://get.docker.com | sh && apt install -y docker-compose-plugin; pause ;; + 5) install_audit_with_rotation; 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 ;; 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 ;; - 10) apt install -y fail2ban && systemctl enable --now fail2ban; pause ;; - 11) apt-get autoremove -y && apt-get autoclean -y; pause ;; + 9) pkg_install glances htop; pause ;; + 10) pkg_install fail2ban; systemctl enable --now fail2ban 2>/dev/null || service fail2ban start; pause ;; + 11) $PKG_MGR autoremove -y; pause ;; 0) break ;; - *) echo -e "${RED}❌ Неверный пункт!${NC}"; sleep 1 ;; + *) echo -e "${RED}❌ Неверно!${NC}"; sleep 1 ;; esac done -echo -e "${GREEN}✅ Настройка завершена!${NC}" +echo -e "${GREEN}🎉 Настройка завершена!${NC}"