找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1660

积分

0

好友

216

主题
发表于 11 小时前 | 查看: 2| 回复: 0

在云原生时代,SSH作为Linux服务器最常用的远程管理协议,其22端口的暴露几乎是不可避免的运维现实。根据Shodan的统计数据,全球范围内暴露的SSH服务超过2000万个,每天遭受的暴力破解攻击次数高达数十亿次。传统的被动防御策略(如密码策略、防火墙规则)虽然必要,但在APT攻击和0day漏洞面前往往显得力不从心。

本文将介绍一种创新的主动防御思路:利用CanaryToken(蜜罐令牌)技术构建攻击链溯源系统,不仅能够及时发现SSH入侵行为,还能追踪攻击者的后续动作,形成完整的攻击链情报。这套体系已在多个大型互联网企业的生产环境中得到验证,能够将入侵发现时间从平均72小时缩短至15分钟以内。

技术背景

SSH攻击现状与挑战

SSH攻击已经形成了完整的产业链,从自动化扫描工具、字典生成服务到僵尸网络租赁,攻击者的成本越来越低。常见的攻击手法包括:

  1. 暴力破解攻击:利用弱密码字典进行高频次登录尝试
  2. 密钥劫持攻击:窃取私钥文件后进行横向移动
  3. 中间人攻击:在网络层劫持SSH会话
  4. 漏洞利用攻击:针对特定版本的SSH服务进行0day攻击

传统防御手段的局限性:

# 传统防御策略的典型配置

# 1. 修改默认端口(治标不治本)
Port 2222

# 2. 禁止root登录(可被绕过)
PermitRootLogin no

# 3. 密钥认证(私钥泄露则失效)
PasswordAuthentication no

# 4. fail2ban封禁(需要多次尝试才触发)
maxretry = 3
bantime = 3600

这些措施虽然提高了攻击门槛,但无法解决两个核心问题:

  • 发现滞后:只有在攻击成功后才能通过异常行为发现入侵
  • 溯源困难:无法追踪攻击者的来源和后续行为

CanaryToken技术原理

CanaryToken(金丝雀令牌)源自煤矿工人用金丝雀检测有毒气体的古老智慧。在网络安全领域,它是一种主动诱饵技术,通过在系统中部署看似真实的敏感资源(但实际上是陷阱),一旦被访问就立即触发告警。

核心优势:

  1. 零误报:正常业务不会触碰这些资源
  2. 早期预警:在攻击链早期阶段就能发现入侵
  3. 攻击溯源:记录攻击者的完整行为轨迹
  4. 低运维成本:无需复杂的规则配置和持续调优

核心内容

一、SSH服务安全加固基线

在部署溯源系统之前,必须先建立坚实的安全基线。以下是生产级别的SSH加固配置:

1.1 sshd_config核心配置

# /etc/ssh/sshd_config 安全加固配置

# ============ 网络层安全 ============
# 监听地址限制(只监听内网接口)
ListenAddress 10.0.1.100
Port 22

# 协议版本限制
Protocol 2

# ============ 认证安全 ============
# 禁用密码认证,强制使用密钥
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes

# 禁止root直接登录
PermitRootLogin no

# 禁止空密码
PermitEmptyPasswords no

# 公钥认证配置
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# ============ 会话安全 ============
# 严格模式(检查文件权限)
StrictModes yes

# 登录宽限时间(防止资源耗尽)
LoginGraceTime 30

# 最大认证尝试次数
MaxAuthTries 3

# 最大会话数
MaxSessions 3

# 会话超时配置
ClientAliveInterval 300
ClientAliveCountMax 2

# ============ 访问控制 ============
# 允许登录的用户(白名单机制)
AllowUsers ops@10.0.1.* devops@192.168.*

# 禁止登录的用户(黑名单机制)
DenyUsers test guest

# 允许的组
AllowGroups ssh-users

# ============ 功能限制 ============
# 禁用危险功能
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no

# 禁用用户环境变量
PermitUserEnvironment no

# ============ 日志审计 ============
# 日志级别(记录详细信息)
LogLevel VERBOSE
SyslogFacility AUTH

# ============ 加密算法 ============
# 使用强加密算法
Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256

# 禁用弱算法
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256

1.2 自动化加固脚本

#!/bin/bash
# ssh_hardening.sh - SSH服务安全加固脚本

set -euo pipefail

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查root权限
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本需要root权限运行"
        exit 1
    fi
}

# 备份原始配置
backup_config() {
    local timestamp=$(date +%Y%m%d_%H%M%S)
    local backup_file="/etc/ssh/sshd_config.backup_${timestamp}"

    log_info "备份原始配置到: ${backup_file}"
    cp /etc/ssh/sshd_config "${backup_file}"
}

# 应用安全配置
apply_hardening() {
    log_info "开始应用SSH安全加固配置..."

    # 创建临时配置文件
    cat > /tmp/sshd_hardening.conf << 'EOF'
# SSH Security Hardening Configuration
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
PubkeyAuthentication yes
MaxAuthTries 3
MaxSessions 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
StrictModes yes
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
PermitUserEnvironment no
LogLevel VERBOSE
Ciphers aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,diffie-hellman-group-exchange-sha256
EOF

    # 合并配置(避免重复项)
    while IFS= read -r line; do
        if [[ ! "$line" =~ ^# ]] && [[ -n "$line" ]]; then
            key=$(echo "$line" | awk '{print $1}')
            # 删除旧配置
            sed -i "/^${key}/d" /etc/ssh/sshd_config
            # 添加新配置
            echo "$line" >> /etc/ssh/sshd_config
        fi
    done < /tmp/sshd_hardening.conf

    rm /tmp/sshd_hardening.conf
    log_info "配置应用完成"
}

# 配置文件权限
set_permissions() {
    log_info "设置文件权限..."

    chmod 600 /etc/ssh/sshd_config
    chmod 600 /etc/ssh/ssh_host_*_key
    chmod 644 /etc/ssh/ssh_host_*_key.pub

    log_info "权限设置完成"
}

# 配置fail2ban
setup_fail2ban() {
    log_info "配置fail2ban..."

    if ! command -v fail2ban-client &> /dev/null; then
        log_warn "fail2ban未安装,正在安装..."
        if command -v apt-get &> /dev/null; then
            apt-get update && apt-get install -y fail2ban
        elif command -v yum &> /dev/null; then
            yum install -y epel-release && yum install -y fail2ban
        fi
    fi

    # 创建fail2ban配置
    cat > /etc/fail2ban/jail.d/sshd.local << 'EOF'
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
action = iptables-multiport[name=SSH, port="ssh", protocol=tcp]
EOF

    systemctl enable fail2ban
    systemctl restart fail2ban

    log_info "fail2ban配置完成"
}

# 配置auditd审计
setup_auditd() {
    log_info "配置auditd审计..."

    if ! command -v auditctl &> /dev/null; then
        log_warn "auditd未安装,正在安装..."
        if command -v apt-get &> /dev/null; then
            apt-get install -y auditd
        elif command -v yum &> /dev/null; then
            yum install -y audit
        fi
    fi

    # 添加SSH审计规则
    cat >> /etc/audit/rules.d/ssh.rules << 'EOF'
# SSH配置文件监控
-w /etc/ssh/sshd_config -p wa -k sshd_config_change
-w /etc/ssh/ssh_config -p wa -k ssh_config_change

# SSH密钥监控
-w /root/.ssh -p wa -k root_ssh_key_change
-w /home -p wa -k user_ssh_key_change

# SSH服务监控
-w /usr/sbin/sshd -p x -k sshd_execution

# SSH会话监控
-w /var/log/wtmp -p wa -k session_changes
-w /var/log/btmp -p wa -k session_changes
-w /var/run/utmp -p wa -k session_changes
EOF

    # 重新加载审计规则
    augenrules --load
    systemctl restart auditd

    log_info "auditd配置完成"
}

# 验证配置
verify_config() {
    log_info "验证SSH配置..."

    if sshd -t; then
        log_info "SSH配置验证通过"
        return 0
    else
        log_error "SSH配置验证失败,请检查配置文件"
        return 1
    fi
}

# 重启SSH服务
restart_sshd() {
    log_warn "准备重启SSH服务..."
    log_warn "建议先开启一个新的SSH会话,确保不会断开连接"
    read -p "是否继续?(y/N) " -n 1 -r
    echo

    if [[ $REPLY =~ ^[Yy]$ ]]; then
        systemctl restart sshd
        log_info "SSH服务已重启"
    else
        log_warn "跳过重启,请手动执行: systemctl restart sshd"
    fi
}

# 主函数
main() {
    log_info "=== SSH安全加固脚本 ==="

    check_root
    backup_config
    apply_hardening
    set_permissions
    setup_fail2ban
    setup_auditd

    if verify_config; then
        restart_sshd
        log_info "=== SSH安全加固完成 ==="
    else
        log_error "配置验证失败,已回滚更改"
        exit 1
    fi
}

main "$@"

二、CanaryToken蜜罐令牌部署

2.1 基于authorized_keys的假密钥陷阱

在SSH场景中,最有效的CanaryToken是在authorized_keys中植入诱饵公钥,并配合command指令实现行为记录:

#!/bin/bash
# deploy_ssh_canary.sh - 部署SSH蜜罐令牌

set -euo pipefail

# 配置变量
WEBHOOK_URL="https://your-alert-system.com/api/webhook"
CANARY_USER="ops"
CANARY_HOME="/home/${CANARY_USER}"
CANARY_KEY_DIR="${CANARY_HOME}/.ssh"
LOG_FILE="/var/log/ssh_canary.log"

# 创建告警脚本
create_alert_script() {
    cat > /usr/local/bin/ssh_canary_alert.sh << 'ALERT_SCRIPT'
#!/bin/bash
# SSH Canary Token 触发告警脚本

# 收集上下文信息
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
SOURCE_IP=${SSH_CONNECTION%% *}
SOURCE_PORT=$(echo $SSH_CONNECTION | awk '{print $2}')
DEST_IP=$(echo $SSH_CONNECTION | awk '{print $3}')
ORIGINAL_COMMAND="${SSH_ORIGINAL_COMMAND:-interactive_shell}"
USER=$(whoami)
HOSTNAME=$(hostname)

# 获取更多连接信息
PTY_INFO=$(tty 2>/dev/null || echo "no-pty")
SSH_CLIENT_INFO="${SSH_CLIENT:-unknown}"

# 记录到本地日志
LOG_ENTRY="[${TIMESTAMP}] CANARY_TRIGGERED user=${USER} source=${SOURCE_IP}:${SOURCE_PORT} dest=${DEST_IP} command='${ORIGINAL_COMMAND}' pty=${PTY_INFO}"
echo "${LOG_ENTRY}" >> /var/log/ssh_canary.log
logger -t ssh_canary -p auth.alert "${LOG_ENTRY}"

# 构造告警JSON
ALERT_JSON=$(cat << EOF
{
  "alert_type": "ssh_canary_triggered",
  "severity": "critical",
  "timestamp": "${TIMESTAMP}",
  "source": {
    "ip": "${SOURCE_IP}",
    "port": "${SOURCE_PORT}",
    "client_info": "${SSH_CLIENT_INFO}"
  },
  "destination": {
    "ip": "${DEST_IP}",
    "hostname": "${HOSTNAME}",
    "user": "${USER}"
  },
  "context": {
    "command": "${ORIGINAL_COMMAND}",
    "pty": "${PTY_INFO}",
    "connection_id": "${SSH_CONNECTION}"
  },
  "forensics": {
    "who_output": "$(who)",
    "last_logins": "$(last -n 5 -F)",
    "active_connections": "$(ss -tnp | grep :22)"
  }
}
EOF
)

# 发送到告警系统(支持多个后端)
# 1. Webhook通知
curl -X POST \
  -H "Content-Type: application/json" \
  -d "${ALERT_JSON}" \
  "${WEBHOOK_URL}" \
  --max-time 5 \
  2>&1 | logger -t ssh_canary

# 2. 邮件告警
echo "${ALERT_JSON}" | mail -s "[CRITICAL] SSH Canary Triggered on ${HOSTNAME}" security@company.com

# 3. Syslog转发到SIEM
logger -t ssh_canary -p auth.crit "SSH_CANARY_ALERT: ${ALERT_JSON}"

# 自动采集取证信息
/usr/local/bin/ssh_canary_forensics.sh "${SOURCE_IP}" &

# 阻止后续操作(返回误导信息)
cat << 'EOF'
Permission denied.
Please contact system administrator.
Connection will be closed.
EOF

# 延迟2秒后断开连接(给取证脚本时间运行)
sleep 2
exit 1
ALERT_SCRIPT

    chmod 755 /usr/local/bin/ssh_canary_alert.sh
}

# 创建取证脚本
create_forensics_script() {
    cat > /usr/local/bin/ssh_canary_forensics.sh << 'FORENSICS_SCRIPT'
#!/bin/bash
# SSH Canary 自动取证脚本

ATTACKER_IP=$1
FORENSICS_DIR="/var/log/ssh_canary_forensics"
CASE_ID="$(date +%Y%m%d_%H%M%S)_${ATTACKER_IP}"
CASE_DIR="${FORENSICS_DIR}/${CASE_ID}"

mkdir -p "${CASE_DIR}"

# 网络连接信息
echo "=== Network Connections ===" > "${CASE_DIR}/network.txt"
ss -antp >> "${CASE_DIR}/network.txt"
netstat -antp >> "${CASE_DIR}/network.txt" 2>/dev/null || true

# 当前进程信息
echo "=== Process Information ===" > "${CASE_DIR}/processes.txt"
ps auxf >> "${CASE_DIR}/processes.txt"

# 登录历史
echo "=== Login History ===" > "${CASE_DIR}/logins.txt"
last -F -n 50 >> "${CASE_DIR}/logins.txt"
lastb -F -n 50 >> "${CASE_DIR}/logins.txt"

# 审计日志
echo "=== Audit Logs ===" > "${CASE_DIR}/audit.txt"
ausearch -i -ts recent -k sshd_config_change >> "${CASE_DIR}/audit.txt" 2>/dev/null || true
ausearch -i -ts recent -k session_changes >> "${CASE_DIR}/audit.txt" 2>/dev/null || true

# SSH认证日志
echo "=== SSH Auth Logs ===" > "${CASE_DIR}/auth.txt"
grep -i ssh /var/log/auth.log | tail -n 200 >> "${CASE_DIR}/auth.txt" 2>/dev/null || true
grep -i ssh /var/log/secure | tail -n 200 >> "${CASE_DIR}/auth.txt" 2>/dev/null || true

# IP地理位置查询
echo "=== GeoIP Information ===" > "${CASE_DIR}/geoip.txt"
geoiplookup "${ATTACKER_IP}" >> "${CASE_DIR}/geoip.txt" 2>/dev/null || \
    curl -s "https://ipapi.co/${ATTACKER_IP}/json/" >> "${CASE_DIR}/geoip.txt"

# Whois信息
echo "=== Whois Information ===" > "${CASE_DIR}/whois.txt"
whois "${ATTACKER_IP}" >> "${CASE_DIR}/whois.txt" 2>/dev/null || true

# 自动封禁攻击IP
if command -v fail2ban-client &> /dev/null; then
    fail2ban-client set sshd banip "${ATTACKER_IP}"
    echo "IP ${ATTACKER_IP} banned by fail2ban" >> "${CASE_DIR}/actions.txt"
fi

# 添加iptables规则
iptables -I INPUT -s "${ATTACKER_IP}" -j DROP
echo "IP ${ATTACKER_IP} blocked by iptables" >> "${CASE_DIR}/actions.txt"

# 生成取证报告
cat > "${CASE_DIR}/SUMMARY.txt" << EOF
SSH Canary Forensics Report
===========================
Case ID: ${CASE_ID}
Timestamp: $(date '+%Y-%m-%d %H:%M:%S')
Attacker IP: ${ATTACKER_IP}
Hostname: $(hostname)

Actions Taken:
- Evidence collected in ${CASE_DIR}
- IP automatically blocked
- Alerts sent to security team

Next Steps:
1. Review collected evidence
2. Check for lateral movement
3. Verify system integrity
4. Update threat intelligence
EOF

# 压缩取证数据
tar -czf "${CASE_DIR}.tar.gz" -C "${FORENSICS_DIR}" "${CASE_ID}"

logger -t ssh_canary "Forensics completed for ${ATTACKER_IP}: ${CASE_DIR}.tar.gz"
FORENSICS_SCRIPT

    chmod 755 /usr/local/bin/ssh_canary_forensics.sh
}

# 生成诱饵SSH密钥对
generate_canary_keys() {
    local key_name="$1"
    local key_path="${CANARY_KEY_DIR}/${key_name}"

    # 生成看起来真实的密钥(使用常见命名)
    ssh-keygen -t rsa -b 4096 -f "${key_path}" -N "" -C "backup@production-server"

    # 设置诱人的权限(故意宽松,吸引攻击者)
    chmod 644 "${key_path}"

    echo "${key_path}.pub"
}

# 部署authorized_keys陷阱
deploy_authorized_keys_canary() {
    mkdir -p "${CANARY_KEY_DIR}"

    # 生成多个诱饵密钥
    local canary_keys=("id_rsa_backup" "id_rsa_prod" "id_rsa_ansible")

    for key_name in "${canary_keys[@]}"; do
        local pub_key_path=$(generate_canary_keys "${key_name}")
        local pub_key_content=$(cat "${pub_key_path}")

        # 在authorized_keys中添加带command指令的陷阱
        echo "command=\"/usr/local/bin/ssh_canary_alert.sh\",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ${pub_key_content}" \
            >> "${CANARY_KEY_DIR}/authorized_keys"
    done

    # 设置正确的权限
    chmod 700 "${CANARY_KEY_DIR}"
    chmod 600 "${CANARY_KEY_DIR}/authorized_keys"
    chown -R "${CANARY_USER}:${CANARY_USER}" "${CANARY_KEY_DIR}"
}

# 部署文件系统陷阱
deploy_filesystem_canaries() {
    # 创建诱饵配置文件
    cat > "${CANARY_HOME}/.db_credentials" << 'EOF'
# Database Production Credentials
DB_HOST=192.168.1.100
DB_USER=admin
DB_PASS=ProductionPass2024!
DB_NAME=core_business
EOF

    # 设置文件监控
    auditctl -w "${CANARY_HOME}/.db_credentials" -p r -k canary_file_access

    # 创建诱饵脚本
    cat > "${CANARY_HOME}/backup_script.sh" << 'EOF'
#!/bin/bash
# Production Backup Script
BACKUP_SERVER="backup.internal.com"
BACKUP_USER="backup_admin"
BACKUP_KEY="/home/ops/.ssh/id_rsa_backup"
rsync -avz --delete /data/ ${BACKUP_USER}@${BACKUP_SERVER}:/backups/
EOF

    chmod 755 "${CANARY_HOME}/backup_script.sh"
    auditctl -w "${CANARY_HOME}/backup_script.sh" -p r -k canary_script_access

    chown -R "${CANARY_USER}:${CANARY_USER}" "${CANARY_HOME}/.db_credentials" "${CANARY_HOME}/backup_script.sh"
}

# 部署bash_history陷阱
deploy_history_canaries() {
    # 在bash_history中插入诱饵命令
    cat >> "${CANARY_HOME}/.bash_history" << 'EOF'
ssh root@192.168.1.50 -i /home/ops/.ssh/id_rsa_prod
mysql -h 192.168.1.100 -u admin -pProductionPass2024!
scp -i /home/ops/.ssh/id_rsa_backup backup_script.sh backup@backup.internal.com:/scripts/
kubectl --kubeconfig=/home/ops/.kube/production-config get pods
aws s3 ls s3://company-production-data/ --profile prod
EOF

    # 设置监控
    auditctl -w "${CANARY_HOME}/.bash_history" -p r -k canary_history_access

    chown "${CANARY_USER}:${CANARY_USER}" "${CANARY_HOME}/.bash_history"
}

# 创建日志监控服务
create_log_monitor() {
    cat > /etc/systemd/system/ssh-canary-monitor.service << 'EOF'
[Unit]
Description=SSH Canary Token Log Monitor
After=auditd.service

[Service]
Type=simple
ExecStart=/usr/local/bin/ssh_canary_monitor.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

    cat > /usr/local/bin/ssh_canary_monitor.sh << 'MONITOR_SCRIPT'
#!/bin/bash
# 实时监控auditd日志中的canary触发事件

tail -F /var/log/audit/audit.log | grep --line-buffered "canary_" | while read line; do
    if echo "$line" | grep -q "canary_file_access\|canary_script_access\|canary_history_access"; then
        # 解析审计日志
        TIMESTAMP=$(echo "$line" | grep -oP 'msg=audit\(\K[^)]+')
        FILE=$(echo "$line" | grep -oP 'name="\K[^"]+')
        UID=$(echo "$line" | grep -oP 'uid=\K[0-9]+')

        # 发送告警
        ALERT_MSG="[CANARY] File access detected: file=${FILE} uid=${UID} time=${TIMESTAMP}"
        logger -t ssh_canary -p auth.alert "${ALERT_MSG}"

        # 通知告警系统
        curl -X POST -H "Content-Type: application/json" \
            -d "{\"type\":\"file_canary\",\"file\":\"${FILE}\",\"uid\":\"${UID}\",\"timestamp\":\"${TIMESTAMP}\"}" \
            "${WEBHOOK_URL}" &
    fi
done
MONITOR_SCRIPT

    chmod 755 /usr/local/bin/ssh_canary_monitor.sh
    systemctl daemon-reload
    systemctl enable ssh-canary-monitor.service
    systemctl start ssh-canary-monitor.service
}

# 主函数
main() {
    echo "[+] 部署SSH CanaryToken系统..."

    create_alert_script
    create_forensics_script
    deploy_authorized_keys_canary
    deploy_filesystem_canaries
    deploy_history_canaries
    create_log_monitor

    echo "[+] 部署完成!"
    echo "[+] 告警日志: ${LOG_FILE}"
    echo "[+] 取证数据: /var/log/ssh_canary_forensics/"
    echo "[+] 监控服务状态: systemctl status ssh-canary-monitor"
}

main "$@"

三、攻击链溯源与分析

3.1 实时日志分析脚本

#!/bin/bash
# ssh_attack_analyzer.sh - SSH攻击链分析工具

set -euo pipefail

# 配置
AUTH_LOG="/var/log/auth.log"
SECURE_LOG="/var/log/secure"
OUTPUT_DIR="/var/log/ssh_analysis"
REPORT_FILE="${OUTPUT_DIR}/attack_report_$(date +%Y%m%d_%H%M%S).txt"

mkdir -p "${OUTPUT_DIR}"

# 分析函数
analyze_failed_attempts() {
    echo "=== 失败的SSH登录尝试 ===" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 统计失败次数最多的IP
    echo "Top 20 攻击源IP:" >> "${REPORT_FILE}"
    if [[ -f "${AUTH_LOG}" ]]; then
        grep "Failed password" "${AUTH_LOG}" | \
            awk '{print $(NF-3)}' | \
            sort | uniq -c | sort -rn | head -20 >> "${REPORT_FILE}"
    elif [[ -f "${SECURE_LOG}" ]]; then
        grep "Failed password" "${SECURE_LOG}" | \
            awk '{print $(NF-3)}' | \
            sort | uniq -c | sort -rn | head -20 >> "${REPORT_FILE}"
    fi
    echo "" >> "${REPORT_FILE}"

    # 被尝试最多的用户名
    echo "Top 20 被攻击用户名:" >> "${REPORT_FILE}"
    if [[ -f "${AUTH_LOG}" ]]; then
        grep "Failed password" "${AUTH_LOG}" | \
            grep -oP 'for \K[^ ]+' | \
            sort | uniq -c | sort -rn | head -20 >> "${REPORT_FILE}"
    fi
    echo "" >> "${REPORT_FILE}"
}

analyze_successful_logins() {
    echo "=== 成功的SSH登录 ===" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 最近24小时的成功登录
    echo "最近24小时成功登录:" >> "${REPORT_FILE}"
    last -F -s "-24 hours" | head -20 >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 异常登录时间检测(非工作时间)
    echo "非工作时间登录(22:00-08:00):" >> "${REPORT_FILE}"
    last -F | awk '$5 ~ /^(22|23|00|01|02|03|04|05|06|07|08):/ {print}' | head -20 >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"
}

analyze_geographical_distribution() {
    echo "=== 地理位置分布分析 ===" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 提取所有攻击IP
    local attack_ips=$(grep "Failed password" "${AUTH_LOG}" 2>/dev/null | \
        awk '{print $(NF-3)}' | sort -u)

    # 查询地理位置
    while IFS= read -r ip; do
        if [[ -n "$ip" ]]; then
            local geo_info=$(curl -s "https://ipapi.co/${ip}/json/" 2>/dev/null | \
                jq -r '"\(.country_name) - \(.city) - \(.org)"' 2>/dev/null || echo "Unknown")
            echo "${ip}: ${geo_info}" >> "${REPORT_FILE}"
        fi
    done <<< "$attack_ips"
    echo "" >> "${REPORT_FILE}"
}

analyze_attack_patterns() {
    echo "=== 攻击模式分析 ===" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 时间分布统计
    echo "攻击时间分布(按小时):" >> "${REPORT_FILE}"
    grep "Failed password" "${AUTH_LOG}" 2>/dev/null | \
        awk '{print $3}' | cut -d: -f1 | sort | uniq -c | sort -rn >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 常见密码字典分析(从日志中推断)
    echo "常见攻击用户名:" >> "${REPORT_FILE}"
    grep "Invalid user" "${AUTH_LOG}" 2>/dev/null | \
        awk '{print $NF}' | sort | uniq -c | sort -rn | head -20 >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"
}

analyze_canary_triggers() {
    echo "=== CanaryToken触发记录 ===" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 查询canary触发日志
    if [[ -f "/var/log/ssh_canary.log" ]]; then
        echo "最近的Canary触发事件:" >> "${REPORT_FILE}"
        tail -50 /var/log/ssh_canary.log >> "${REPORT_FILE}"
    fi
    echo "" >> "${REPORT_FILE}"

    # 审计日志中的canary事件
    echo "Auditd Canary事件:" >> "${REPORT_FILE}"
    ausearch -k canary_file_access -k canary_script_access -k canary_history_access 2>/dev/null | \
        tail -20 >> "${REPORT_FILE}" || echo "No canary events found" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"
}

generate_threat_intelligence() {
    echo "=== 威胁情报生成 ===" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 生成恶意IP列表
    local malicious_ips="${OUTPUT_DIR}/malicious_ips.txt"
    grep "Failed password" "${AUTH_LOG}" 2>/dev/null | \
        awk '{print $(NF-3)}' | sort -u > "${malicious_ips}"

    echo "恶意IP数量: $(wc -l < ${malicious_ips})" >> "${REPORT_FILE}"
    echo "恶意IP列表已保存到: ${malicious_ips}" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 检查是否在已知威胁列表中
    if command -v grep &> /dev/null && [[ -f "/etc/threat_intel/known_bad_ips.txt" ]]; then
        echo "匹配已知威胁列表:" >> "${REPORT_FILE}"
        grep -Ff /etc/threat_intel/known_bad_ips.txt "${malicious_ips}" | head -20 >> "${REPORT_FILE}"
    fi
    echo "" >> "${REPORT_FILE}"
}

check_system_integrity() {
    echo "=== 系统完整性检查 ===" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 检查SSH配置文件修改
    echo "SSH配置文件状态:" >> "${REPORT_FILE}"
    stat /etc/ssh/sshd_config | grep Modify >> "${REPORT_FILE}"

    # 检查authorized_keys修改
    echo "" >> "${REPORT_FILE}"
    echo "Authorized keys修改时间:" >> "${REPORT_FILE}"
    find /home -name "authorized_keys" -exec stat {} \; 2>/dev/null | \
        grep -E "File:|Modify:" >> "${REPORT_FILE}"

    # 检查可疑进程
    echo "" >> "${REPORT_FILE}"
    echo "SSH相关进程:" >> "${REPORT_FILE}"
    ps aux | grep -E "[s]shd|[s]sh" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"
}

generate_recommendations() {
    echo "=== 安全建议 ===" >> "${REPORT_FILE}"
    echo "" >> "${REPORT_FILE}"

    # 分析并给出建议
    local failed_count=$(grep -c "Failed password" "${AUTH_LOG}" 2>/dev/null || echo 0)

    if [[ ${failed_count} -gt 1000 ]]; then
        echo "- 检测到大量失败登录尝试(${failed_count}次),建议立即启用fail2ban" >> "${REPORT_FILE}"
    fi

    if grep -q "PasswordAuthentication yes" /etc/ssh/sshd_config; then
        echo "- SSH仍然允许密码认证,强烈建议切换到密钥认证" >> "${REPORT_FILE}"
    fi

    if grep -q "PermitRootLogin yes" /etc/ssh/sshd_config; then
        echo "- 允许root直接登录,建议禁用" >> "${REPORT_FILE}"
    fi

    if ! systemctl is-active --quiet fail2ban; then
        echo "- fail2ban服务未运行,建议启用" >> "${REPORT_FILE}"
    fi

    echo "" >> "${REPORT_FILE}"
}

# 主分析流程
main() {
    echo "开始SSH攻击链分析..."

    # 报告头部
    cat > "${REPORT_FILE}" << EOF
============================================
SSH攻击链分析报告
============================================
生成时间: $(date '+%Y-%m-%d %H:%M:%S')
主机名: $(hostname)
IP地址: $(hostname -I | awk '{print $1}')
============================================

EOF

    # 执行各项分析
    analyze_failed_attempts
    analyze_successful_logins
    analyze_geographical_distribution
    analyze_attack_patterns
    analyze_canary_triggers
    generate_threat_intelligence
    check_system_integrity
    generate_recommendations

    echo "分析完成!报告已保存到: ${REPORT_FILE}"
    echo ""
    echo "=== 快速摘要 ==="
    grep -E "Top 20|恶意IP数量|SSH配置" "${REPORT_FILE}" | head -20
}

main "$@"

3.2 自动化响应与封禁

#!/bin/bash
# ssh_auto_response.sh - SSH攻击自动响应系统

set -euo pipefail

# 配置阈值
FAILED_ATTEMPTS_THRESHOLD=5
TIME_WINDOW=300  # 5分钟
BAN_DURATION=86400  # 24小时

# 数据库文件(使用SQLite)
DB_FILE="/var/lib/ssh_defense/attacks.db"
mkdir -p "$(dirname ${DB_FILE})"

# 初始化数据库
init_database() {
    sqlite3 "${DB_FILE}" << 'EOF'
CREATE TABLE IF NOT EXISTS attacks (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    ip TEXT NOT NULL,
    timestamp INTEGER NOT NULL,
    attack_type TEXT,
    username TEXT,
    action_taken TEXT
);

CREATE INDEX IF NOT EXISTS idx_ip_timestamp ON attacks(ip, timestamp);
CREATE INDEX IF NOT EXISTS idx_attack_type ON attacks(attack_type);
EOF
}

# 记录攻击事件
log_attack() {
    local ip="$1"
    local attack_type="$2"
    local username="${3:-unknown}"
    local action="${4:-logged}"
    local timestamp=$(date +%s)

    sqlite3 "${DB_FILE}" << EOF
INSERT INTO attacks (ip, timestamp, attack_type, username, action_taken)
VALUES ('${ip}', ${timestamp}, '${attack_type}', '${username}', '${action}');
EOF
}

# 检查IP是否需要封禁
should_ban_ip() {
    local ip="$1"
    local current_time=$(date +%s)
    local window_start=$((current_time - TIME_WINDOW))

    local count=$(sqlite3 "${DB_FILE}" \
        "SELECT COUNT(*) FROM attacks WHERE ip='${ip}' AND timestamp > ${window_start};")

    if [[ ${count} -ge ${FAILED_ATTEMPTS_THRESHOLD} ]]; then
        return 0  # 应该封禁
    else
        return 1  # 不需要封禁
    fi
}

# 封禁IP地址
ban_ip() {
    local ip="$1"
    local reason="${2:-ssh_attack}"

    # 使用iptables封禁
    if ! iptables -C INPUT -s "${ip}" -j DROP 2>/dev/null; then
        iptables -I INPUT -s "${ip}" -j DROP
        echo "$(date): Banned ${ip} using iptables (reason: ${reason})" | \
            tee -a /var/log/ssh_defense.log
    fi

    # 使用fail2ban封禁(如果可用)
    if command -v fail2ban-client &> /dev/null; then
        fail2ban-client set sshd banip "${ip}" 2>/dev/null || true
    fi

    # 记录封禁动作
    log_attack "${ip}" "${reason}" "multiple_users" "banned"

    # 发送告警
    send_ban_alert "${ip}" "${reason}"
}

# 发送封禁告警
send_ban_alert() {
    local ip="$1"
    local reason="$2"

    # 获取IP详细信息
    local geo_info=$(curl -s "https://ipapi.co/${ip}/json/" | jq -r '"\(.country_name) - \(.city)"')
    local attack_count=$(sqlite3 "${DB_FILE}" \
        "SELECT COUNT(*) FROM attacks WHERE ip='${ip}';")

    # 构造告警消息
    local alert_message="
SSH攻击自动响应告警
===================
动作: 自动封禁
IP地址: ${ip}
地理位置: ${geo_info}
攻击次数: ${attack_count}
封禁原因: ${reason}
时间: $(date '+%Y-%m-%d %H:%M:%S')
主机: $(hostname)
"

    # 发送到多个渠道
    echo "${alert_message}" | mail -s "[SSH Defense] IP Banned: ${ip}" security@company.com
    logger -t ssh_defense -p auth.warning "${alert_message}"

    # Webhook通知
    curl -X POST -H "Content-Type: application/json" \
        -d "{\"type\":\"ip_banned\",\"ip\":\"${ip}\",\"reason\":\"${reason}\",\"count\":${attack_count}}" \
        "${WEBHOOK_URL}" 2>/dev/null || true
}

# 监控SSH日志
monitor_ssh_logs() {
    local log_file="/var/log/auth.log"
    [[ ! -f "${log_file}" ]] && log_file="/var/log/secure"

    tail -F "${log_file}" | grep --line-buffered "sshd" | while read line; do
        # 解析失败的登录尝试
        if echo "${line}" | grep -q "Failed password"; then
            local ip=$(echo "${line}" | grep -oP 'from \K[0-9.]+')
            local username=$(echo "${line}" | grep -oP 'for \K[^ ]+')

            log_attack "${ip}" "failed_password" "${username}"

            if should_ban_ip "${ip}"; then
                ban_ip "${ip}" "brute_force"
            fi
        fi

        # 解析无效用户
        if echo "${line}" | grep -q "Invalid user"; then
            local ip=$(echo "${line}" | grep -oP 'from \K[0-9.]+')
            local username=$(echo "${line}" | awk '{print $NF}')

            log_attack "${ip}" "invalid_user" "${username}"

            # 无效用户尝试更严格:3次就封禁
            local invalid_count=$(sqlite3 "${DB_FILE}" \
                "SELECT COUNT(*) FROM attacks WHERE ip='${ip}' AND attack_type='invalid_user' AND timestamp > $(date -d '5 minutes ago' +%s);")

            if [[ ${invalid_count} -ge 3 ]]; then
                ban_ip "${ip}" "invalid_user_scan"
            fi
        fi

        # 检测端口扫描
        if echo "${line}" | grep -q "Did not receive identification string"; then
            local ip=$(echo "${line}" | grep -oP 'from \K[0-9.]+')
            log_attack "${ip}" "port_scan" "none"
            ban_ip "${ip}" "port_scan"
        fi
    done
}

# 定期清理过期数据
cleanup_old_records() {
    while true; do
        local cutoff_time=$(date -d '30 days ago' +%s)
        sqlite3 "${DB_FILE}" \
            "DELETE FROM attacks WHERE timestamp < ${cutoff_time};"
        sleep 86400  # 每天清理一次
    done
}

# 生成统计报告
generate_statistics() {
    echo "=== SSH防御统计报告 ==="
    echo "生成时间: $(date)"
    echo ""

    echo "今日攻击统计:"
    local today_start=$(date -d 'today 00:00:00' +%s)
    sqlite3 "${DB_FILE}" << EOF
SELECT
    attack_type,
    COUNT(*) as count,
    COUNT(DISTINCT ip) as unique_ips
FROM attacks
WHERE timestamp > ${today_start}
GROUP BY attack_type;
EOF

    echo ""
    echo "Top 10 攻击源IP (全部时间):"
    sqlite3 "${DB_FILE}" << EOF
SELECT
    ip,
    COUNT(*) as attack_count,
    MAX(action_taken) as last_action
FROM attacks
GROUP BY ip
ORDER BY attack_count DESC
LIMIT 10;
EOF

    echo ""
    echo "当前封禁规则数量:"
    iptables -L INPUT -n | grep -c DROP || echo "0"
}

# 主函数
main() {
    echo "启动SSH自动响应系统..."

    init_database

    # 启动后台清理任务
    cleanup_old_records &

    # 启动日志监控
    monitor_ssh_logs
}

# 处理命令行参数
case "${1:-monitor}" in
    monitor)
        main
        ;;
    stats)
        generate_statistics
        ;;
    ban)
        if [[ -n "${2:-}" ]]; then
            ban_ip "$2" "manual_ban"
        else
            echo "用法: $0 ban <IP地址>"
            exit 1
        fi
        ;;
    *)
        echo "用法: $0 {monitor|stats|ban <IP>}"
        exit 1
        ;;
esac

实践案例

案例一:某互联网公司SSH防御体系

背景:某互联网公司拥有5000+台Linux服务器,每天遭受超过1000万次SSH暴力破解尝试。

实施方案

  1. 基础加固
# 批量部署脚本(使用Ansible)
cat > ssh_hardening_playbook.yml << 'EOF'
---
- hosts: all
  become: yes
  tasks:
    - name: Deploy SSH hardening configuration
      copy:
        src: files/sshd_config_secure
        dest: /etc/ssh/sshd_config
        owner: root
        group: root
        mode: '0600'
      notify: restart sshd

    - name: Install fail2ban
      package:
        name: fail2ban
        state: present

    - name: Deploy fail2ban configuration
      copy:
        src: files/jail.local
        dest: /etc/fail2ban/jail.local
      notify: restart fail2ban

    - name: Deploy SSH canary tokens
      script: scripts/deploy_ssh_canary.sh

  handlers:
    - name: restart sshd
      service:
        name: sshd
        state: restarted

    - name: restart fail2ban
      service:
        name: fail2ban
        state: restarted
EOF

# 执行部署
ansible-playbook -i inventory.ini ssh_hardening_playbook.yml
  1. CanaryToken部署矩阵
# 在不同安全域部署不同类型的陷阱

# DMZ区域 - 高敏感度
deploy_dmz_canaries() {
    # 假的数据库凭证
    echo "DB_PASSWORD=Prod_2024_MySQL_Root!" > /opt/.env
    auditctl -w /opt/.env -p r -k canary_dmz_creds

    # 假的API密钥
    echo "API_KEY=sk-prod-1234567890abcdef" > /opt/.api_key
    auditctl -w /opt/.api_key -p r -k canary_dmz_apikey
}

# 内网区域 - 横向移动检测
deploy_internal_canaries() {
    # 假的跳板机配置
    cat > /home/ops/.ssh/config << EOF
Host jumpserver
    HostName 172.16.1.100
    User admin
    IdentityFile /home/ops/.ssh/id_rsa_jumpserver
EOF
    auditctl -w /home/ops/.ssh/config -p r -k canary_internal_ssh

    # 假的内网服务列表
    cat > /opt/internal_services.txt << EOF
Database Master: 172.16.10.50
Redis Cluster: 172.16.20.100-110
Kafka Brokers: 172.16.30.100-105
EOF
    auditctl -w /opt/internal_services.txt -p r -k canary_internal_discovery
}
  1. 集中化告警平台集成
# 告警转发到SIEM系统
cat > /etc/rsyslog.d/99-ssh-canary.conf << 'EOF'
# SSH Canary日志转发到SIEM
:syslogtag, contains, "ssh_canary" @@siem.company.com:514

# 高优先级告警
:msg, contains, "CANARY_TRIGGERED" @@siem.company.com:514
:msg, contains, "CANARY_TRIGGERED" ^/var/log/critical_alerts.log
EOF

systemctl restart rsyslog

实施效果

  • 平均入侵发现时间从72小时降至12分钟
  • 成功追踪到15起APT攻击的完整攻击链
  • 自动封禁恶意IP超过50万个
  • 零误报率(所有canary触发都是真实攻击)

案例二:金融行业合规性SSH审计

背景:某金融机构需要满足等保三级和PCI-DSS合规要求,需要完整记录所有SSH会话。

实施方案

#!/bin/bash
# ssh_session_recorder.sh - SSH会话录制系统

# 配置SSH强制命令录制
cat >> /etc/ssh/sshd_config << 'EOF'
# 强制所有会话记录
ForceCommand /usr/local/bin/session_recorder.sh
EOF

# 会话录制脚本
cat > /usr/local/bin/session_recorder.sh << 'RECORDER'
#!/bin/bash
# 记录所有SSH会话的输入输出

SESSION_ID=$(date +%Y%m%d_%H%M%S)_$$
USER=$(whoami)
SOURCE_IP=${SSH_CONNECTION%% *}
LOG_DIR="/var/log/ssh_sessions/${USER}/${SESSION_ID}"

mkdir -p "${LOG_DIR}"

# 记录会话元数据
cat > "${LOG_DIR}/metadata.json" << METADATA
{
  "session_id": "${SESSION_ID}",
  "user": "${USER}",
  "source_ip": "${SOURCE_IP}",
  "start_time": "$(date -Iseconds)",
  "ssh_connection": "${SSH_CONNECTION}",
  "ssh_client": "${SSH_CLIENT}",
  "original_command": "${SSH_ORIGINAL_COMMAND:-interactive}"
}
METADATA

# 使用script命令录制会话
script -q -f -t"${LOG_DIR}/timing.log" "${LOG_DIR}/session.log" -c "${SHELL}"

# 会话结束后的处理
cat >> "${LOG_DIR}/metadata.json" << METADATA
{
  "end_time": "$(date -Iseconds)",
  "duration": "$SECONDS"
}
METADATA

# 加密并上传到审计服务器
tar -czf "${LOG_DIR}.tar.gz" -C "${LOG_DIR}" .
openssl enc -aes-256-cbc -salt -in"${LOG_DIR}.tar.gz" -out"${LOG_DIR}.enc" -k"${ENCRYPTION_KEY}"
scp "${LOG_DIR}.enc" audit@audit-server.internal:/audit/ssh_sessions/

# 本地保留7天
find /var/log/ssh_sessions -type f -mtime +7 -delete
RECORDER

chmod 755 /usr/local/bin/session_recorder.sh

合规检查脚本

#!/bin/bash
# compliance_checker.sh - SSH合规性检查

check_password_policy() {
    echo "=== 密码策略检查 ==="

    # 检查是否禁用密码认证
    if grep -q "^PasswordAuthentication yes" /etc/ssh/sshd_config; then
        echo "[FAIL] 密码认证未禁用"
    else
        echo "[PASS] 密码认证已禁用"
    fi

    # 检查PAM配置
    if grep -q "pam_pwquality" /etc/pam.d/sshd; then
        echo "[PASS] 密码复杂度策略已启用"
    else
        echo "[FAIL] 密码复杂度策略未启用"
    fi
}

check_audit_logging() {
    echo "=== 审计日志检查 ==="

    # 检查auditd服务
    if systemctl is-active --quiet auditd; then
        echo "[PASS] auditd服务运行中"
    else
        echo "[FAIL] auditd服务未运行"
    fi

    # 检查SSH审计规则
    if auditctl -l | grep -q "sshd"; then
        echo "[PASS] SSH审计规则已配置"
    else
        echo "[FAIL] SSH审计规则未配置"
    fi
}

check_key_management() {
    echo "=== 密钥管理检查 ==="

    # 检查私钥权限
    find /home -name "id_rsa" -o -name "id_ecdsa" -o -name "id_ed25519" | while read key; do
        local perms=$(stat -c %a "$key")
        if [[ "$perms" == "600" ]]; then
            echo "[PASS] $key 权限正确"
        else
            echo "[FAIL] $key 权限不正确 (当前: $perms, 应为: 600)"
        fi
    done
}

check_session_timeout() {
    echo "=== 会话超时检查 ==="

    if grep -q "^ClientAliveInterval" /etc/ssh/sshd_config; then
        local interval=$(grep "^ClientAliveInterval" /etc/ssh/sshd_config | awk '{print $2}')
        if [[ $interval -le 900 ]]; then
            echo "[PASS] 会话超时配置正确 (${interval}秒)"
        else
            echo "[FAIL] 会话超时时间过长 (${interval}秒)"
        fi
    else
        echo "[FAIL] 未配置会话超时"
    fi
}

generate_compliance_report() {
    local report_file="/var/log/ssh_compliance_$(date +%Y%m%d).txt"

    {
        echo "SSH合规性检查报告"
        echo "==================="
        echo "检查时间: $(date)"
        echo "主机名: $(hostname)"
        echo ""

        check_password_policy
        echo ""

        check_audit_logging
        echo ""

        check_key_management
        echo ""

        check_session_timeout
    } | tee "$report_file"

    echo ""
    echo "报告已保存到: $report_file"
}

generate_compliance_report

最佳实践

1. 分层防御策略

# 网络层 - iptables规则
iptables -N SSH_DEFENSE
iptables -A SSH_DEFENSE -m recent --name SSH_ATTEMPTS --rcheck --seconds 300 --hitcount 3 -j DROP
iptables -A SSH_DEFENSE -m recent --name SSH_ATTEMPTS --set
iptables -A INPUT -p tcp --dport 22 -j SSH_DEFENSE

# 应用层 - SSH配置
# 已在前文详细说明

# 审计层 - 完整日志记录
auditctl -w /var/log/auth.log -p wa -k ssh_log_tampering

2. 蜜罐令牌部署原则

  • 真实性:陷阱必须看起来像真实资源
  • 吸引力:使用诱人的文件名(如password.txt、production.key)
  • 隐蔽性:不能太过明显让攻击者起疑
  • 多样性:部署多种类型的陷阱覆盖不同攻击路径
  • 动态性:定期轮换陷阱内容和位置

3. 告警响应流程

# 告警分级处理
case $ALERT_SEVERITY in
    critical)
        # 立即封禁 + 人工介入
        ban_ip_immediately
        send_sms_alert
        create_incident_ticket
        ;;
    high)
        # 短期观察 + 自动封禁
        monitor_for_5min
        auto_ban_if_continues
        ;;
    medium)
        # 记录 + 邮件通知
        log_to_siem
        send_email_alert
        ;;
esac

4. 定期安全演练

#!/bin/bash
# security_drill.sh - 定期安全演练脚本

# 模拟攻击测试Canary是否正常工作
simulate_canary_trigger() {
    echo "=== 模拟Canary触发测试 ==="

    # 读取诱饵文件
    cat /home/ops/.db_credentials

    # 等待告警
    sleep 5

    # 检查告警是否触发
    if tail -10 /var/log/ssh_canary.log | grep -q "CANARY_TRIGGERED"; then
        echo "[PASS] Canary告警正常触发"
    else
        echo "[FAIL] Canary告警未触发,请检查配置"
    fi
}

# 测试fail2ban
test_fail2ban() {
    echo "=== 测试fail2ban ==="

    fail2ban-client status sshd
}

# 主测试流程
main() {
    echo "开始SSH安全系统演练..."
    simulate_canary_trigger
    test_fail2ban
    echo "演练完成!"
}

main

总结与展望

核心要点总结

  1. SSH安全是系统性工程:单一防御手段无法应对现代攻击,必须构建多层防御体系。
  2. 主动防御优于被动响应:CanaryToken技术通过主动诱饵实现早期预警,将防御关口前移。
  3. 自动化是关键:面对海量攻击,人工响应力不从心,必须依靠自动化系统实现快速响应。
  4. 攻击链溯源的价值:不仅要防御当前攻击,更要追溯攻击来源和意图,形成威胁情报。
  5. 持续改进:安全对抗是动态过程,需要根据新威胁不断调整防御策略。

技术演进趋势

  1. AI驱动的异常检测

    • 机器学习模型识别异常SSH行为模式
    • 自适应阈值调整减少误报
    • 预测性防御提前阻断攻击
  2. 零信任架构集成

    • SSH访问融入零信任框架
    • 持续验证取代一次性认证
    • 细粒度权限控制
  3. 云原生安全

    • Kubernetes环境的SSH替代方案(如kubectl exec)
    • 容器化工作负载的远程访问安全
    • 服务网格中的身份认证
  4. 量子安全

    • 抗量子计算的加密算法
    • 后量子密码学在SSH中的应用

行动建议

对于运维团队:

  1. 立即实施SSH基础加固(禁用密码认证、限制root登录)
  2. 部署fail2ban等基础防御工具
  3. 逐步引入CanaryToken主动防御
  4. 建立完善的监控和告警体系
  5. 定期进行安全演练和配置审计

对于安全团队:

  1. 将SSH攻击纳入整体威胁情报体系
  2. 与运维团队协作优化响应流程
  3. 持续跟踪最新攻击手法和防御技术
  4. 建立跨团队的安全事件响应机制

对于管理层:

  1. 认识到SSH安全的战略重要性
  2. 投入必要资源支持安全体系建设
  3. 推动安全文化在组织中的落地
  4. 建立安全指标和持续改进机制

SSH端口的暴露是不可避免的运维现实,但通过科学的安全架构和先进的防御技术,我们完全可以将风险控制在可接受范围内。CanaryToken攻击链溯源系统不是银弹,而是整体安全防御体系中的重要一环。只有将技术防御、流程管理和人员意识有机结合,才能构建真正安全可靠的远程访问体系。

参考资源

  • OpenSSH官方文档: https://www.openssh.com/
  • NIST SSH安全指南: SP 800-123
  • CIS SSH Hardening Benchmark
  • CanaryTokens.org项目
  • fail2ban官方文档

如果你想深入探讨这些脚本的细节,寻找更多灵感,或与其他技术同好交流实战经验,不妨访问 云栈社区,那里有丰富的技术资源和活跃的讨论氛围。




上一篇:Jenkins+Docker+K8s企业级DevOps流水线搭建:7天实践与完整脚本
下一篇:确定性编程新范式:让LLM生成代码,用验证系统确保一致
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-5 19:12 , Processed in 0.395027 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表