#!/bin/bash # SSH配置保护脚本 # 用于防止恶意程序修改或阻止SSH连接 set -e echo "==================================================================================" echo "🛡️ SSH配置保护脚本" echo "==================================================================================" # 1. 设置SSH配置文件为不可变(immutable) echo "" echo "1. 设置SSH配置文件为不可变..." if command -v chattr >/dev/null 2>&1; then # 移除现有的不可变标志(如果存在) chattr -i /etc/ssh/sshd_config 2>/dev/null || true # 设置不可变标志 chattr +i /etc/ssh/sshd_config echo " ✅ SSH配置文件已设置为不可变(immutable)" # 验证设置 if lsattr /etc/ssh/sshd_config | grep -q 'i'; then echo " ✅ 验证成功:文件已设置为不可变" else echo " ⚠️ 警告:无法验证不可变标志" fi else echo " ⚠️ chattr命令不可用,跳过不可变标志设置" fi # 2. 设置SSH目录权限 echo "" echo "2. 设置SSH目录权限..." chmod 755 /etc/ssh chmod 600 /etc/ssh/sshd_config chown root:root /etc/ssh/sshd_config echo " ✅ SSH目录和文件权限已设置" # 3. 创建SSH配置备份 echo "" echo "3. 创建SSH配置备份..." BACKUP_DIR="/root/ssh_backups" mkdir -p "$BACKUP_DIR" cp /etc/ssh/sshd_config "$BACKUP_DIR/sshd_config.$(date +%Y%m%d_%H%M%S)" # 只保留最近10个备份 ls -t "$BACKUP_DIR"/sshd_config.* 2>/dev/null | tail -n +11 | xargs rm -f 2>/dev/null || true echo " ✅ SSH配置已备份到 $BACKUP_DIR" # 4. 创建SSH配置监控脚本 echo "" echo "4. 创建SSH配置监控脚本..." cat > /usr/local/bin/monitor-ssh-config.sh << 'MONITOREOF' #!/bin/bash # SSH配置监控脚本 # 检测SSH配置文件是否被修改 SSH_CONFIG="/etc/ssh/sshd_config" BACKUP_DIR="/root/ssh_backups" LOG_FILE="/var/log/ssh-config-monitor.log" # 创建日志文件(如果不存在) touch "$LOG_FILE" # 获取当前配置文件的MD5值 CURRENT_MD5=$(md5sum "$SSH_CONFIG" 2>/dev/null | awk '{print $1}') # 获取最新备份的MD5值 LATEST_BACKUP=$(ls -t "$BACKUP_DIR"/sshd_config.* 2>/dev/null | head -1) if [ -n "$LATEST_BACKUP" ]; then BACKUP_MD5=$(md5sum "$LATEST_BACKUP" | awk '{print $1}') # 如果MD5不匹配,说明文件被修改 if [ "$CURRENT_MD5" != "$BACKUP_MD5" ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 警告:SSH配置文件被修改!" >> "$LOG_FILE" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 当前MD5: $CURRENT_MD5" >> "$LOG_FILE" echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份MD5: $BACKUP_MD5" >> "$LOG_FILE" # 尝试恢复配置文件 if [ -f "$LATEST_BACKUP" ]; then # 临时移除不可变标志 chattr -i "$SSH_CONFIG" 2>/dev/null || true cp "$LATEST_BACKUP" "$SSH_CONFIG" chmod 600 "$SSH_CONFIG" chown root:root "$SSH_CONFIG" chattr +i "$SSH_CONFIG" 2>/dev/null || true echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 已恢复SSH配置文件" >> "$LOG_FILE" # 重启SSH服务 systemctl restart sshd 2>/dev/null || service sshd restart 2>/dev/null || true fi fi fi # 检查SSH服务是否运行 if ! systemctl is-active --quiet sshd && ! service sshd status >/dev/null 2>&1; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 警告:SSH服务未运行!" >> "$LOG_FILE" # 尝试启动SSH服务 systemctl start sshd 2>/dev/null || service sshd start 2>/dev/null || true fi MONITOREOF chmod +x /usr/local/bin/monitor-ssh-config.sh echo " ✅ SSH配置监控脚本已创建" # 5. 设置定时监控任务 echo "" echo "5. 设置定时监控任务..." # 移除现有的监控任务(如果存在) crontab -l 2>/dev/null | grep -v "monitor-ssh-config" | crontab - 2>/dev/null || true # 添加新的监控任务(每5分钟检查一次) (crontab -l 2>/dev/null; echo "*/5 * * * * /usr/local/bin/monitor-ssh-config.sh") | crontab - echo " ✅ 定时监控任务已设置(每5分钟检查一次)" # 6. 创建SSH服务保护脚本 echo "" echo "6. 创建SSH服务保护脚本..." cat > /usr/local/bin/protect-ssh-service.sh << 'PROTECTEOF' #!/bin/bash # SSH服务保护脚本 # 确保SSH服务始终运行 SSH_SERVICE="sshd" # 检查SSH服务状态 if ! systemctl is-active --quiet "$SSH_SERVICE" && ! service "$SSH_SERVICE" status >/dev/null 2>&1; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ 警告:SSH服务未运行,正在启动..." | tee -a /var/log/ssh-service-protect.log # 尝试启动SSH服务 systemctl start "$SSH_SERVICE" 2>/dev/null || service "$SSH_SERVICE" start 2>/dev/null || true # 等待服务启动 sleep 2 # 再次检查 if systemctl is-active --quiet "$SSH_SERVICE" || service "$SSH_SERVICE" status >/dev/null 2>&1; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ SSH服务已启动" | tee -a /var/log/ssh-service-protect.log else echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ SSH服务启动失败!" | tee -a /var/log/ssh-service-protect.log fi fi PROTECTEOF chmod +x /usr/local/bin/protect-ssh-service.sh echo " ✅ SSH服务保护脚本已创建" # 7. 设置SSH服务保护定时任务 echo "" echo "7. 设置SSH服务保护定时任务..." # 移除现有的保护任务(如果存在) crontab -l 2>/dev/null | grep -v "protect-ssh-service" | crontab - 2>/dev/null || true # 添加新的保护任务(每2分钟检查一次) (crontab -l 2>/dev/null; echo "*/2 * * * * /usr/local/bin/protect-ssh-service.sh") | crontab - echo " ✅ SSH服务保护定时任务已设置(每2分钟检查一次)" # 8. 配置SSH服务自动启动 echo "" echo "8. 配置SSH服务自动启动..." systemctl enable sshd 2>/dev/null || chkconfig sshd on 2>/dev/null || true echo " ✅ SSH服务已设置为开机自启" # 9. 验证SSH配置 echo "" echo "9. 验证SSH配置..." if sshd -t 2>/dev/null; then echo " ✅ SSH配置语法正确" else echo " ⚠️ 警告:SSH配置语法可能有误" fi # 10. 重启SSH服务(应用配置) echo "" echo "10. 重启SSH服务..." systemctl restart sshd 2>/dev/null || service sshd restart 2>/dev/null || true sleep 2 if systemctl is-active --quiet sshd || service sshd status >/dev/null 2>&1; then echo " ✅ SSH服务已重启并运行正常" else echo " ⚠️ 警告:SSH服务重启后状态异常" fi echo "" echo "==================================================================================" echo "✅ SSH配置保护已完成!" echo "==================================================================================" echo "" echo "📋 保护措施总结:" echo " 1. ✅ SSH配置文件已设置为不可变(immutable)" echo " 2. ✅ SSH目录和文件权限已设置" echo " 3. ✅ SSH配置已备份" echo " 4. ✅ SSH配置监控脚本已创建(每5分钟检查)" echo " 5. ✅ SSH服务保护脚本已创建(每2分钟检查)" echo " 6. ✅ SSH服务已设置为开机自启" echo "" echo "📝 查看监控日志:" echo " - SSH配置监控: tail -f /var/log/ssh-config-monitor.log" echo " - SSH服务保护: tail -f /var/log/ssh-service-protect.log" echo "" echo "⚠️ 重要提示:" echo " - 如果需要修改SSH配置,请先运行: chattr -i /etc/ssh/sshd_config" echo " - 修改完成后,请运行: chattr +i /etc/ssh/sshd_config" echo " - 配置文件备份位置: /root/ssh_backups/" echo ""