#!/bin/bash ################################################################################ # 服务器自动化加固脚本 # 作者: Mercas # 日期: 2025-11-09 # 说明: 本脚本用于自动化加固Ubuntu 22.04服务器安全配置 # 版本: v1.4 (多选项菜单版 - 简化交互流程) # 新增功能: # - 全菜单式操作界面 # - 模块化选择加固项目 # - 预设配置选项 # - 一键快速加固 ################################################################################ # 终端类型兼容性处理 if [[ "$TERM" == "xterm-kitty" ]]; then export TERM=xterm-color log_info "检测到xterm-kitty终端,已自动切换到xterm-color" elif [[ -z "$TERM" ]] || [[ "$TERM" == "unknown" ]]; then export TERM=xterm-color log_info "检测到未知终端类型,已设置为xterm-color" fi # 设置脚本使用的基本终端类型(避免颜色问题) export TERM=xterm-color # 禁用一些可能引起终端问题的选项 set +H # 禁用历史扩展 set +e # 暂时禁用错误退出 set -e # 遇到错误立即退出 trap 'echo "错误发生在第 $LINENO 行"' ERR # 颜色定义(使用更兼容的方式) if command -v tput &> /dev/null && [[ -n "$TERM" ]]; then RED=$(tput setaf 1 2>/dev/null || echo '\033[0;31m') GREEN=$(tput setaf 2 2>/dev/null || echo '\033[0;32m') YELLOW=$(tput setaf 3 2>/dev/null || echo '\033[1;33m') BLUE=$(tput setaf 4 2>/dev/null || echo '\033[0;34m') PURPLE=$(tput setaf 5 2>/dev/null || echo '\033[0;35m') CYAN=$(tput setaf 6 2>/dev/null || echo '\033[0;36m') NC=$(tput sgr0 2>/dev/null || echo '\033[0m') else # 回退到简单颜色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' fi # 日志文件 LOG_FILE="/var/log/server_hardening_$(date +%Y%m%d_%H%M%S).log" BACKUP_DIR="/root/security_backup_$(date +%Y%m%d_%H%M%S)" # 配置变量 SSH_PORT=22 ADMIN_USERNAME="admin" ENABLE_AUTO_REBOOT=true ################################################################################ # 工具函数 ################################################################################ log() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE" } log_info() { echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE" } log_error() { echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE" } log_section() { echo -e "\n${BLUE}========================================${NC}" | tee -a "$LOG_FILE" echo -e "${BLUE}$1${NC}" | tee -a "$LOG_FILE" echo -e "${BLUE}========================================${NC}\n" | tee -a "$LOG_FILE" } check_root() { if [[ $EUID -ne 0 ]]; then log_error "此脚本必须以root权限运行" exit 1 fi } backup_file() { local file=$1 if [[ -f "$file" ]]; then mkdir -p "$BACKUP_DIR" cp -p "$file" "$BACKUP_DIR/$(basename $file).bak" 2>/dev/null log_info "备份文件: $file -> $BACKUP_DIR/$(basename $file).bak" fi } safe_execute() { local cmd="$1" local description="$2" log_info "执行: $description" if eval "$cmd" >> "$LOG_FILE" 2>&1; then log_info "成功: $description" return 0 else local exit_code=$? log_warning "警告: $description 失败 (退出码: $exit_code)" return $exit_code fi } # 菜单选择函数 show_menu() { clear echo -e "${BLUE}" cat << "EOF" ╔══════════════════════════════════════════════════════════════╗ ║ Ubuntu 22.04 服务器安全加固脚本 ║ ║ 多选项菜单版 (v1.4) ║ ║ 简化操作 • 模块选择 • 快速加固 ║ ╚══════════════════════════════════════════════════════════════╝ EOF echo -e "${NC}" } show_main_menu() { show_menu echo -e "${CYAN}请选择加固模式:${NC}" echo "" echo -e "${GREEN}1)${NC} 快速加固 (推荐) - 关键安全工具 + 核心加固" echo -e "${GREEN}2)${NC} 自定义加固 - 逐项选择要应用的设置" echo -e "${GREEN}3)${NC} 系统更新 - 仅更新系统包" echo -e "${GREEN}4)${NC} 查看当前安全状态" echo -e "${GREEN}5)${NC} 退出" echo "" echo -e "${YELLOW}请输入选择 [1-5]: ${NC}\c" } get_menu_choice() { local min_choice=$1 local max_choice=$2 local choice while true; do read -p "" choice if [[ "$choice" =~ ^[0-9]+$ ]] && [[ "$choice" -ge "$min_choice" ]] && [[ "$choice" -le "$max_choice" ]]; then echo "$choice" return 0 else echo -e "${RED}无效选择,请输入 $min_choice-$max_choice 之间的数字: ${NC}\c" fi done } show_custom_menu() { show_menu echo -e "${CYAN}自定义加固选项 (可多选):${NC}" echo "" echo -e "${GREEN}1)${NC} 系统更新和包管理" echo -e "${GREEN}2)${NC} SSH安全加固" echo -e "${GREEN}3)${NC} 创建管理用户和SSH密钥" echo -e "${GREEN}4)${NC} 配置防火墙 (UFW)" echo -e "${GREEN}5)${NC} 安装和配置Fail2ban" echo -e "${GREEN}6)${NC} 用户和权限管理" echo -e "${GREEN}7)${NC} 禁用不必要服务" echo -e "${GREEN}8)${NC} 内核参数安全配置" echo -e "${GREEN}9)${NC} 文件系统权限加固" echo -e "${GREEN}10)${NC} 配置自动安全更新" echo -e "${GREEN}11)${NC} 安装完整安全工具套件 (AIDE+Rkhunter+Logwatch+Auditd+Chkrootkit)" echo -e "${GREEN}12)${NC} 生成安全加固报告" echo -e "${GREEN}13)${NC} 返回主菜单" echo "" echo -e "${YELLOW}请输入要执行的项目编号 (多个用逗号分隔,如: 1,2,3): ${NC}\c" } show_security_status() { show_menu echo -e "${CYAN}当前系统安全状态检查:${NC}" echo "" # SSH状态 echo -e "${YELLOW}SSH配置状态:${NC}" if [[ -f "/etc/ssh/sshd_config" ]]; then echo -e "${GREEN}✓${NC} SSH配置文件存在" echo " 端口: $(grep "^Port" /etc/ssh/sshd_config | awk '{print $2}' || echo "22 (默认)")" echo " Root登录: $(grep "^PermitRootLogin" /etc/ssh/sshd_config | awk '{print $2}' || echo "未明确配置")" echo " 密码认证: $(grep "^PasswordAuthentication" /etc/ssh/sshd_config | awk '{print $2}' || echo "未明确配置")" else echo -e "${RED}✗${NC} SSH配置文件不存在" fi echo "" # 防火墙状态 echo -e "${YELLOW}防火墙状态:${NC}" if command -v ufw &> /dev/null; then if ufw status | grep -q "Status: active"; then echo -e "${GREEN}✓${NC} UFW防火墙已启用" ufw status | head -10 else echo -e "${YELLOW}!${NC} UFW防火墙已安装但未启用" fi else echo -e "${RED}✗${NC} UFW防火墙未安装" fi echo "" # Fail2ban状态 echo -e "${YELLOW}Fail2ban状态:${NC}" if command -v fail2ban-client &> /dev/null; then if systemctl is-active --quiet fail2ban; then echo -e "${GREEN}✓${NC} Fail2ban服务正在运行" fail2ban-client status 2>/dev/null | head -5 else echo -e "${YELLOW}!${NC} Fail2ban已安装但未运行" fi else echo -e "${RED}✗${NC} Fail2ban未安装" fi echo "" # 系统用户 echo -e "${YELLOW}系统用户管理:${NC}" local admin_users=$(grep -E ":(sudo|admin)" /etc/group | cut -d: -f4 | head -5) if [[ -n "$admin_users" ]]; then echo -e "${GREEN}✓${NC} 管理员用户: $admin_users" else echo -e "${YELLOW}!${NC} 未检测到管理用户组" fi echo "" echo -e "${CYAN}按回车键返回主菜单...${NC}" read } ################################################################################ # 主要加固功能 ################################################################################ # 1. 系统信息收集 collect_system_info() { log_section "收集系统信息" log_info "操作系统: $(lsb_release -d 2>/dev/null | cut -f2 || echo "Unknown")" log_info "内核版本: $(uname -r)" log_info "主机名: $(hostname)" # 安全获取IP地址 local ip=$(hostname -I 2>/dev/null | awk '{print $1}' || echo "无法获取") log_info "IP地址: $ip" log_info "开始加固时间: $(date)" echo "系统信息收集完成" >> "$LOG_FILE" } # 2. 系统更新 update_system() { log_section "系统更新与安全补丁" log_info "开始系统更新..." safe_execute "apt update -y" "更新软件包列表" safe_execute "apt upgrade -y" "升级已安装的软件包" safe_execute "apt dist-upgrade -y" "安装安全更新" safe_execute "apt autoremove -y" "清理不需要的软件包" safe_execute "apt autoclean -y" "清理缓存" log_success "系统更新完成" } # 3. SSH安全加固 harden_ssh() { log_section "SSH安全加固" local ssh_config="/etc/ssh/sshd_config" if [[ -f "$ssh_config" ]]; then backup_file "$ssh_config" log_info "配置SSH安全参数..." # 应用预设配置 safe_execute "sed -i 's/^#*PermitRootLogin.*/PermitRootLogin no/' '$ssh_config'" "禁用root登录" safe_execute "sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' '$ssh_config'" "禁用密码认证" safe_execute "sed -i 's/^#*Port.*/Port $SSH_PORT/' '$ssh_config'" "设置SSH端口为$SSH_PORT" # 其他SSH安全配置 local ssh_config_addition=' # 安全加固配置 Protocol 2 MaxAuthTries 3 MaxSessions 2 LoginGraceTime 60 ClientAliveInterval 300 ClientAliveCountMax 2 PermitEmptyPasswords no X11Forwarding no UseDNS no ' echo "$ssh_config_addition" >> "$ssh_config" # 重启SSH服务 safe_execute "systemctl restart sshd" "重启SSH服务" log_success "SSH加固完成 - 端口: $SSH_PORT, Root登录: 禁用, 密码认证: 禁用" log_warning "请确保已在防火墙中开放端口 $SSH_PORT" log_warning "请确保已配置SSH密钥认证" else log_error "SSH配置文件不存在: $ssh_config" fi } # 4. 用户管理和SSH密钥配置 manage_users() { log_section "创建管理用户和配置SSH密钥" local username=$ADMIN_USERNAME local user_home=$(eval echo "~$username") # 检查用户是否已存在 if id "$username" &>/dev/null 2>&1; then log_info "用户 $username 已存在,跳过创建" else # 创建用户 log_info "创建用户: $username" safe_execute "useradd -m -s /bin/bash '$username'" "创建用户 $username" # 设置随机密码 local temp_password=$(openssl rand -base64 32) echo "$username:$temp_password" | chpasswd log_success "用户 $username 创建成功" log_info "临时密码: $temp_password (建议首次登录后修改)" # 将用户添加到sudo组 safe_execute "usermod -aG sudo '$username'" "将 $username 添加到sudo组" fi # 配置SSH密钥 local ssh_dir="$user_home/.ssh" local authorized_keys="$ssh_dir/authorized_keys" # 确保用户有.ssh目录 mkdir -p "$ssh_dir" chown "$username:$username" "$ssh_dir" # 生成SSH密钥对 log_info "生成SSH密钥对..." cd "$user_home" if [[ ! -f "$ssh_dir/id_rsa" ]]; then su - "$username" -c "ssh-keygen -t rsa -b 4096 -f $ssh_dir/id_rsa -N '' -C '$username@$(hostname)'" if [[ -f "$ssh_dir/id_rsa" ]]; then log_success "SSH密钥对生成成功" log_info "私钥文件: $ssh_dir/id_rsa" log_info "公钥文件: $ssh_dir/id_rsa.pub" log_warning "请妥善保管私钥文件,不要上传到公共服务器" # 设置公钥到authorized_keys cat "$ssh_dir/id_rsa.pub" > "$authorized_keys" else log_error "SSH密钥生成失败" return 1 fi else log_info "SSH密钥已存在" fi # 设置sudo无密码 local sudoers_file="/etc/sudoers.d/$username" echo "$username ALL=(ALL) NOPASSWD:ALL" > "$sudoers_file" chmod 440 "$sudoers_file" log_success "已配置 $username sudo无密码权限" # 设置文件权限 safe_execute "chown -R $username:$username '$ssh_dir'" "设置SSH目录权限" safe_execute "chmod 700 '$ssh_dir'" "设置SSH目录权限为700" safe_execute "chmod 600 '$authorized_keys'" "设置公钥文件权限为600" log_success "用户管理完成 - 用户: $username" } # 5. 防火墙配置 configure_firewall() { log_section "配置UFW防火墙" if ! command -v ufw &> /dev/null; then safe_execute "apt install ufw -y" "安装UFW" fi log_info "配置UFW规则..." # 默认策略 safe_execute "ufw default deny incoming" "设置默认入站策略:拒绝" safe_execute "ufw default allow outgoing" "设置默认出站策略:允许" # 允许SSH safe_execute "ufw allow $SSH_PORT/tcp comment 'SSH'" "允许SSH端口: $SSH_PORT" # 允许常用端口 local common_ports=("80/tcp" "443/tcp" "53/udp" "123/udp") local port_comments=("HTTP" "HTTPS" "DNS" "NTP") for i in "${!common_ports[@]}"; do log_info "开放端口 ${common_ports[$i]} (${port_comments[$i]})" safe_execute "ufw allow ${common_ports[$i]} comment '${port_comments[$i]}'" "开放${port_comments[$i]}端口" done # 启用UFW log_info "启用UFW防火墙..." safe_execute "ufw --force enable" "强制启用UFW" # 显示状态 log_success "防火墙配置完成" ufw status | head -15 } # 6. 安装和配置Fail2ban install_fail2ban() { log_section "安装和配置Fail2ban" if ! command -v fail2ban-client &> /dev/null; then safe_execute "apt install fail2ban -y" "安装Fail2ban" else log_info "Fail2ban已安装" fi # 配置fail2ban local jail_local="/etc/fail2ban/jail.local" backup_file "$jail_local" 2>/dev/null || true log_info "创建Fail2ban配置..." cat > "$jail_local" << EOF [DEFAULT] # 封禁时间(秒) bantime = 3600 # 查找时间窗口(秒) findtime = 600 # 最大尝试次数 maxretry = 5 [sshd] enabled = true port = $SSH_PORT filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 7200 [sshd-ddos] enabled = true port = $SSH_PORT filter = sshd-ddos logpath = /var/log/auth.log maxretry = 2 bantime = 7200 EOF safe_execute "systemctl enable fail2ban" "启用Fail2ban服务" safe_execute "systemctl restart fail2ban" "重启Fail2ban服务" sleep 2 if command -v fail2ban-client &> /dev/null; then log_success "Fail2ban配置完成" fail2ban-client status 2>/dev/null | head -5 fi } # 7. 用户和权限管理 harden_users() { log_section "用户和权限加固" # 密码策略 log_info "配置密码策略..." if ! dpkg -l | grep -q libpam-pwquality; then safe_execute "apt install libpam-pwquality -y" "安装密码质量检查工具" fi local pwquality_file="/etc/security/pwquality.conf" backup_file "$pwquality_file" cat >> "$pwquality_file" << 'EOF' # 密码安全策略 minlen = 12 dcredit = -1 ucredit = -1 lcredit = -1 ocredit = -1 maxrepeat = 3 EOF # 密码过期策略 local login_defs="/etc/login.defs" if [[ -f "$login_defs" ]]; then backup_file "$login_defs" safe_execute "sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' '$login_defs'" "设置密码最大有效期" safe_execute "sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 1/' '$login_defs'" "设置密码最小间隔" safe_execute "sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE 14/' '$login_defs'" "设置密码警告时间" fi log_success "密码策略配置完成" # 锁定不必要的系统账户 log_info "锁定系统账户..." local system_users=("bin" "daemon" "adm" "lp" "sync" "shutdown" "halt" "mail" "news" "uucp" "operator" "games" "gopher" "ftp") for user in "${system_users[@]}"; do if id "$user" &>/dev/null 2>&1; then usermod -L -s /usr/sbin/nologin "$user" 2>/dev/null || true fi done log_success "用户加固完成" } # 8. 禁用不必要的服务 disable_services() { log_section "禁用不必要的服务" local services_to_disable=("avahi-daemon" "cups" "isc-dhcp-server" "isc-dhcp-server6" "bluetooth") for service in "${services_to_disable[@]}"; do if systemctl is-enabled "$service" &>/dev/null 2>&1; then safe_execute "systemctl stop '$service'" "停止服务: $service" safe_execute "systemctl disable '$service'" "禁用服务: $service" log_info "已禁用服务: $service" fi done log_success "不必要服务禁用完成" } # 9. 内核参数安全配置 harden_kernel() { log_section "内核参数安全配置" local sysctl_conf="/etc/sysctl.d/99-security.conf" backup_file "$sysctl_conf" 2>/dev/null || true log_info "配置内核安全参数..." cat > "$sysctl_conf" << 'EOF' # IP转发禁用 net.ipv4.ip_forward = 0 net.ipv6.conf.all.forwarding = 0 # SYN cookies保护 net.ipv4.tcp_syncookies = 1 # 忽略ICMP重定向 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv6.conf.default.accept_redirects = 0 # 忽略安全ICMP重定向 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 # 禁用源路由 net.ipv4.conf.all.accept_source_route = 0 net.ipv6.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv6.conf.default.accept_source_route = 0 # 记录可疑包 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 # 忽略ICMP ping请求 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 反向路径过滤 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 保护系统免受SYN flood攻击 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_syn_retries = 5 EOF if command -v sysctl &> /dev/null; then safe_execute "sysctl -p '$sysctl_conf'" "应用内核参数配置" fi log_success "内核参数配置完成" } # 10. 文件系统和权限加固 harden_filesystem() { log_section "文件系统权限加固" log_info "设置重要文件权限..." # 关键配置文件权限 local files_to_protect=( "/etc/ssh/sshd_config:600" "/etc/passwd:644" "/etc/shadow:640" "/etc/group:644" "/etc/gshadow:600" ) for file_perm in "${files_to_protect[@]}"; do local file="${file_perm%:*}" local perm="${file_perm#*:}" if [[ -f "$file" ]]; then safe_execute "chmod $perm '$file'" "设置文件权限: $file -> $perm" fi done log_success "重要文件权限已加固" # 查找并报告可疑权限文件 log_info "查找具有SUID/SGID权限的文件(记录到日志)..." if command -v find &> /dev/null; then find / -perm /6000 -type f 2>/dev/null >> "$LOG_FILE" || true fi } # 11. 配置自动安全更新 configure_auto_updates() { log_section "配置自动安全更新" if ! dpkg -l | grep -q unattended-upgrades; then safe_execute "apt install unattended-upgrades apt-listchanges -y" "安装自动更新工具" fi if command -v dpkg-reconfigure &> /dev/null; then safe_execute "echo unattended-upgrades unattended-upgrades/enable_auto_updates boolean true | debconf-set-selections && debconf-show unattended-upgrades" "配置自动更新" fi log_success "自动安全更新已启用" } # 12. 安装其他安全工具 install_security_tools() { log_section "安装额外安全工具" # 优先级安全工具 - 快速加固中最重要的 local priority_tools=("aide" "rkhunter") # 完整的工具列表 - 自定义模式中可选择 local all_tools=("aide" "rkhunter" "logwatch" "auditd" "chkrootkit") # 智能选择 - 根据加固模式选择工具 local tools=() if [[ "${INSTALL_MODE:-full}" == "priority" ]]; then tools=("${priority_tools[@]}") log_info "快速加固模式: 安装关键安全工具" else tools=("${all_tools[@]}") log_info "完整安装模式: 安装所有推荐安全工具" fi for tool in "${tools[@]}"; do if apt list --installed 2>/dev/null | grep -q "^$tool/"; then log_info "$tool 已安装" continue fi # 智能安装 - 跳过可能的不可用工具 case "$tool" in "auditd") if ! dpkg -l | grep -q "auditd"; then if safe_execute "apt install '$tool' -y" "安装安全工具: $tool"; then safe_execute "systemctl enable auditd" "启用auditd服务" safe_execute "systemctl start auditd" "启动auditd服务" log_success "已安装并启用: $tool" else log_warning "跳过 $tool 安装" fi fi ;; "chkrootkit") if safe_execute "apt install '$tool' -y" "安装安全工具: $tool"; then log_success "已安装: $tool" else log_warning "跳过 $tool 安装" fi ;; *) if safe_execute "apt install '$tool' -y" "安装安全工具: $tool"; then # 特殊配置 case "$tool" in "rkhunter") if command -v rkhunter &> /dev/null; then safe_execute "rkhunter --update" "更新rkhunter数据库" safe_execute "rkhunter --propupd" "更新rkhunter属性" fi ;; esac log_success "已安装: $tool" else log_warning "跳过 $tool 安装" fi ;; esac done # 显示安装总结 log_info "安全工具安装总结:" for tool in "${tools[@]}"; do if command -v "$tool" &>/dev/null; then log_success "✓ $tool - 已安装" else log_info "- $tool - 跳过或安装失败" fi done } # 13. 生成加固报告 generate_report() { log_section "生成安全加固报告" local report_file="/root/security_hardening_report_$(date +%Y%m%d_%H%M%S).txt" # 安全获取系统信息 local os_info=$(lsb_release -d 2>/dev/null | cut -f2 || echo "Unknown") local kernel_info=$(uname -r) local hostname_info=$(hostname) cat > "$report_file" << EOF ================================================================================ 服务器安全加固报告 ================================================================================ 生成时间: $(date) 主机名: $hostname_info 操作系统: $os_info 内核版本: $kernel_info -------------------------------------------------------------------------------- 1. SSH配置 -------------------------------------------------------------------------------- $(grep -E "^(Port|PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config 2>/dev/null || echo "SSH配置不可读") -------------------------------------------------------------------------------- 2. 防火墙状态 -------------------------------------------------------------------------------- $(ufw status verbose 2>/dev/null || echo "UFW不可用") -------------------------------------------------------------------------------- 3. Fail2ban状态 -------------------------------------------------------------------------------- $(fail2ban-client status 2>/dev/null || echo "Fail2ban未运行") -------------------------------------------------------------------------------- 4. 已安装的安全工具 -------------------------------------------------------------------------------- $(dpkg -l 2>/dev/null | grep -E "fail2ban|ufw|aide|rkhunter|logwatch|unattended-upgrades" | awk '{print $2 " " $3}' | column -t || echo "无法获取包信息") -------------------------------------------------------------------------------- 5. 活动监听端口 -------------------------------------------------------------------------------- $(ss -tunlp 2>/dev/null || netstat -tunlp 2>/dev/null || echo "端口信息不可用") -------------------------------------------------------------------------------- 6. 管理用户 -------------------------------------------------------------------------------- $(grep -E ":(sudo|admin)" /etc/group 2>/dev/null | head -5 || echo "无管理用户组") -------------------------------------------------------------------------------- 备份目录: $BACKUP_DIR 日志文件: $LOG_FILE 配置完成时间: $(date) -------------------------------------------------------------------------------- EOF log_success "安全加固报告已生成: $report_file" # 显示报告摘要 echo -e "${CYAN}报告摘要:${NC}" echo "- 操作系统: $os_info" echo "- SSH端口: $SSH_PORT" echo "- 管理员用户: $ADMIN_USERNAME" echo "- 防火墙: $(ufw status 2>/dev/null | grep -q "active" && echo "已启用" || echo "未启用")" echo "- Fail2ban: $(systemctl is-active fail2ban 2>/dev/null || echo "未运行")" echo "" echo -e "${YELLOW}完整报告请查看: $report_file${NC}" } ################################################################################ # 快速加固流程 ################################################################################ quick_hardening() { log_section "开始快速加固" log_warning "这将应用所有推荐的安全设置" # 设置快速加固模式 - 优先安装关键安全工具 export INSTALL_MODE="priority" # 执行所有加固步骤 collect_system_info update_system harden_ssh manage_users configure_firewall install_fail2ban harden_users disable_services harden_kernel harden_filesystem configure_auto_updates install_security_tools generate_report log_section "快速加固完成" show_completion_message } ################################################################################ # 自定义加固流程 ################################################################################ custom_hardening() { while true; do show_custom_menu local choice=$(get_menu_choice 1 13) case $choice in 1) collect_system_info update_system ;; 2) show_ssh_config_menu ;; 3) show_user_config_menu ;; 4) configure_firewall ;; 5) install_fail2ban ;; 6) harden_users ;; 7) disable_services ;; 8) harden_kernel ;; 9) harden_filesystem ;; 10) configure_auto_updates ;; 11) export INSTALL_MODE="full" install_security_tools ;; 12) generate_report ;; 13) return 0 ;; esac echo "" echo -e "${YELLOW}按回车键继续...${NC}" read done } show_ssh_config_menu() { show_menu echo -e "${CYAN}SSH配置选项:${NC}" echo "" echo -e "${GREEN}1)${NC} 标准配置 (端口2222, 禁用root, 禁用密码)" echo -e "${GREEN}2)${NC} 安全配置 (端口22, 禁用root, 禁用密码)" echo -e "${GREEN}3)${NC} 自定义端口 (输入端口号)" echo -e "${GREEN}4)${NC} 返回" echo "" echo -e "${YELLOW}请选择SSH配置 [1-4]: ${NC}\c" local ssh_choice=$(get_menu_choice 1 4) case $ssh_choice in 1) SSH_PORT=2222 harden_ssh ;; 2) SSH_PORT=22 harden_ssh ;; 3) echo -e "${YELLOW}请输入SSH端口号 (1024-65535): ${NC}\c" read -p "" custom_port if [[ "$custom_port" =~ ^[0-9]+$ ]] && [[ "$custom_port" -gt 1024 ]] && [[ "$custom_port" -lt 65536 ]]; then SSH_PORT=$custom_port harden_ssh else log_error "无效的端口号" fi ;; 4) return 0 ;; esac } show_user_config_menu() { show_menu echo -e "${CYAN}用户管理配置选项:${NC}" echo "" echo -e "${GREEN}1)${NC} 创建admin用户 (推荐)" echo -e "${GREEN}2)${NC} 创建operator用户" echo -e "${GREEN}3)${NC} 自定义用户名" echo -e "${GREEN}4)${NC} 跳过用户创建" echo "" echo -e "${YELLOW}请选择用户配置 [1-4]: ${NC}\c" local user_choice=$(get_menu_choice 1 4) case $user_choice in 1) ADMIN_USERNAME="admin" manage_users ;; 2) ADMIN_USERNAME="operator" manage_users ;; 3) echo -e "${YELLOW}请输入用户名: ${NC}\c" read -p "" ADMIN_USERNAME if [[ -n "$ADMIN_USERNAME" ]] && [[ "$ADMIN_USERNAME" =~ ^[a-z_][a-z0-9_-]*$ ]]; then manage_users else log_error "无效的用户名" fi ;; 4) log_info "跳过用户创建" ;; esac } ################################################################################ # 完成消息 ################################################################################ show_completion_message() { echo -e "${GREEN}" cat << EOF ╔══════════════════════════════════════════════════════════════╗ ║ 安全加固已完成! ║ ╚══════════════════════════════════════════════════════════════╝ 重要提醒: 1. SSH访问信息: - 端口: $SSH_PORT - 用户: $ADMIN_USERNAME - 认证方式: SSH密钥 (推荐) 2. 文件位置: - 配置备份: $BACKUP_DIR - 详细日志: $LOG_FILE - 安全报告: /root/security_hardening_report_*.txt 3. 后续步骤: - 使用SSH密钥登录新用户账户 - 验证防火墙规则: ufw status - 检查Fail2ban状态: fail2ban-client status - 重启服务器以确保所有更改生效 4. 安全检查: - 定期检查 /var/log/auth.log - 运行: rkhunter --check (如已安装) - 监控fail2ban日志: tail -f /var/log/fail2ban.log EOF echo -e "${NC}" if [[ "$ENABLE_AUTO_REBOOT" == "true" ]]; then echo -e "${YELLOW}是否重启服务器以确保所有更改生效?${NC}" echo -e "${GREEN}1)${NC} 是,立即重启" echo -e "${GREEN}2)${NC} 否,稍后手动重启" echo "" echo -e "${YELLOW}请选择 [1-2]: ${NC}\c" local reboot_choice=$(get_menu_choice 1 2) case $reboot_choice in 1) log "系统将在10秒后重启..." sleep 10 if command -v reboot &> /dev/null; then reboot else shutdown -r now fi ;; 2) log_info "请记得稍后手动重启服务器" ;; esac fi } ################################################################################ # 主程序 ################################################################################ main() { # 检查root权限 check_root while true; do show_main_menu local choice=$(get_menu_choice 1 5) case $choice in 1) log "开始快速加固流程..." quick_hardening break ;; 2) log "开始自定义加固流程..." custom_hardening ;; 3) log "开始系统更新..." collect_system_info update_system echo "" echo -e "${YELLOW}按回车键返回主菜单...${NC}" read ;; 4) show_security_status ;; 5) log "退出脚本" exit 0 ;; esac done } # 运行主程序 main "$@"