上周五凌晨3点17分,我负责维护的某电商平台订单处理服务器突然出现CPU满载告警。登录服务器后发现大量异常登录尝试记录,/var/log/secure日志显示有超过2000次来自不同IP的SSH登录失败记录。这种情况明显是遭遇了分布式暴力破解攻击(Brute Force Attack),攻击者通过自动化工具尝试用常见用户名密码组合轮番轰炸服务器。
暴力破解是最常见的服务器入侵手段之一。根据2023年网络安全报告显示,全球互联网上平均每台暴露在公网的服务器每天会遭遇超过500次暴力破解尝试。攻击者通常使用以下三种典型手段:
发现攻击后的第一要务是立即切断攻击链。我采取了以下紧急措施:
bash复制# 查看当前连接
netstat -tnpa | grep ESTABLISHED
# 封禁可疑IP段
iptables -A INPUT -s 45.156.XX.0/24 -j DROP
iptables -A INPUT -s 185.143.XX.0/24 -j DROP
bash复制vim /etc/ssh/sshd_config
# 修改Port 22为其他端口如58222
systemctl restart sshd
重要提示:修改端口后务必确保新端口在防火墙中已放行,否则会导致自己也无法连接
通过分析/var/log/secure日志,发现攻击呈现以下特征:
使用fail2ban工具可以自动化封禁行为:
bash复制# 安装fail2ban
yum install fail2ban -y # CentOS
apt-get install fail2ban -y # Ubuntu
# 配置SSH防护
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vim /etc/fail2ban/jail.local
# 修改以下参数
[sshd]
enabled = true
maxretry = 3 # 3次失败后封禁
bantime = 86400 # 封禁24小时
bash复制# 生成密钥对(在本地机器)
ssh-keygen -t rsa -b 4096
# 上传公钥到服务器
ssh-copy-id -p 58222 user@server_ip
# 修改SSH配置
vim /etc/ssh/sshd_config
PasswordAuthentication no # 禁用密码登录
PubkeyAuthentication yes # 启用密钥认证
bash复制PermitRootLogin no # 禁止root直接SSH登录
AllowUsers deploy admin # 只允许特定用户登录
bash复制# 安装Google Authenticator
yum install google-authenticator -y
# 初始化配置
google-authenticator
# 修改SSH配置
vim /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
UsePAM yes
bash复制# 安装knockd
yum install knockd -y
# 配置示例(/etc/knockd.conf)
[options]
UseSyslog
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 10
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 10
command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
部署OSSEC入侵检测系统:
bash复制# 安装OSSEC
yum install ossec-hids-server -y
# 关键配置(/var/ossec/etc/ossec.conf)
<syscheck>
<frequency>43200</frequency>
<alert_new_files>yes</alert_new_files>
<directories check_all="yes">/etc,/usr/bin,/usr/sbin</directories>
</syscheck>
<localfile>
<log_format>syslog</log_format>
<location>/var/log/secure</location>
</localfile>
使用ELK堆栈实现日志集中分析:
关键安全事件告警规则示例:
json复制{
"query": {
"bool": {
"must": [
{ "match": { "message": "Failed password" } },
{ "range": { "@timestamp": { "gte": "now-5m" } } }
],
"filter": {
"script": {
"script": {
"source": "doc['source.ip'].values.length > 3",
"lang": "painless"
}
}
}
}
}
}
bash复制cat /etc/passwd | grep -E "/bin/bash|/bin/sh"
bash复制ps auxf | grep -E "[a-z0-9]{32}|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
bash复制crontab -l
ls -la /etc/cron*
bash复制ss -tnap
lsof -i
备份策略示例:
bash复制# 每日增量备份
tar -g /backup/snapshot -czpf /backup/incr-$(date +%Y%m%d).tar.gz /data
# 每周全量备份
tar -czpf /backup/full-$(date +%Y%m%d).tar.gz /data
以下是我总结的服务器安全自检表,建议每月执行一次:
| 检查项 | 合格标准 | 检查命令 |
|---|---|---|
| SSH安全 | 使用密钥认证+2FA | grep -E "^PasswordAuthentication" /etc/ssh/sshd_config |
| 防火墙 | 仅开放必要端口 | iptables -L -n |
| 用户权限 | 无多余sudo权限 | grep -E "^%admin |
| 系统更新 | 无高危漏洞 | yum updateinfo list cves |
| 日志监控 | 关键日志正常轮转 | ls -lh /var/log/secure* |
在实际运维中,我发现很多管理员容易忽视以下几点:
最后分享一个实用技巧:使用以下命令可以一键分析服务器安全状态:
bash复制wget -qO- https://raw.githubusercontent.com/CISOfy/lynis/master/lynis | bash