Linux服务器安全加固清单:19项必做配置
· 12分钟阅读 · 适合0-3年运维
凌晨三点,你被电话吵醒——线上服务器被植入了挖矿程序,CPU飙到100%,数据库正在被拖库。你SSH登录一看,root密码已经被改,/var/log下的日志被清空得干干净净。这种场景不是拍电影,而是每周都在真实发生的故事。
安全加固不是等出事才做的工作,而是服务器上线前的最后一道防线。今天「随风跑」给你整理了20项必做配置,照着做,把80%的攻击挡在门外。
一、SSH访问加固(5项)
SSH是黑客最常尝试的入口,没有之一。暴力破解工具每秒可以尝试上千个密码组合,裸奔的SSH配置就是在给攻击者发邀请函。
1. 禁用root远程登录
root是权限最大的账户,一旦被攻破,整个服务器沦陷。用普通用户+sudo代替直接root登录:
# 编辑SSH配置文件 vim /etc/ssh/sshd_config # 修改以下参数 PermitRootLogin no # 重启SSH服务 systemctl restart sshd
2. 修改默认SSH端口
把22端口改成高端口,可以过滤掉90%的自动扫描脚本:
# 在sshd_config中修改 Port 52022 # 防火墙同步放行新端口 firewall-cmd --permanent --add-port=52022/tcp firewall-cmd --reload # 确认新端口能连接后再删除旧规则!
⚠️ 改端口后务必先用新端口测试连接成功,再断开旧连接,否则你会把自己锁在门外。
3. 禁用密码登录,仅用密钥
# 生成密钥对(在客户端执行) ssh-keygen -t ed25519 -C "admin@suifengpao" # 上传公钥到服务器 ssh-copy-id -p 52022 ops@10.20.30.40 # 服务器端禁用密码 PasswordAuthentication no PubkeyAuthentication yes
4. 限制SSH来源IP
如果你的办公网IP固定,直接在防火墙层面限制,比改SSH配置更彻底:
# 仅允许 203.0.113.0/24 网段访问SSH firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" port port="52022" protocol="tcp" accept' firewall-cmd --permanent --remove-port=52022/tcp firewall-cmd --reload
5. 设置登录失败锁定
用fail2ban自动封禁暴力破解IP,5次失败就封24小时:
# 安装fail2ban yum install -y fail2ban # 配置 /etc/fail2ban/jail.local [sshd] enabled = true port = 52022 maxretry = 5 bantime = 86400 findtime = 600 systemctl enable --now fail2ban
💡 查看封禁状态:fail2ban-client status sshd,被封的IP会出现在 jail 列表中。
二、账户与权限管控(4项)
6. 清理无用账户
系统自带的大量账户长期不用,但每一个都是潜在入口。检查并锁定:
# 查看可登录的用户 cat /etc/passwd | grep -E '/bin/(bash|sh)$' # 锁定不需要登录的系统账户 usermod -s /sbin/nologin operator usermod -s /sbin/nologin games
7. 配置密码策略
# 编辑 /etc/login.defs PASS_MAX_DAYS 90 PASS_MIN_DAYS 2 PASS_MIN_LEN 12 PASS_WARN_AGE 7 # 设置密码复杂度(pam模块) /etc/security/pwquality.conf minlen = 12 minclass = 4 maxrepeat = 3 dcredit = -1 ucredit = -1
8. 限制su切换权限
不是谁都能su到root,只允许wheel组成员切换:
# 编辑 /etc/pam.d/su auth required pam_wheel.so use_uid # 把需要的运维人员加入wheel组 usermod -aG wheel ops_admin
9. 设置会话超时自动断开
防止忘了退出终端被人趁虚而入:
sudo sh -c 'echo "TMOUT=600; readonly TMOUT" >> /etc/zshrc'source ~/.zshrc
三、系统与服务加固(6项)
10. 关闭非必要服务
每多开一个服务就多一个攻击面,逐一排查:
# 批量关闭无用服务 systemctl disable --now postfix avahi-daemon cups systemctl mask bluetooth.service 2>/dev/null
11. 配置防火墙默认策略
# 默认拒绝所有入站,允许所有出站 firewall-cmd --permanent --set-default-zone=drop firewall-cmd --permanent --zone=drop --add-service=ssh firewall-cmd --permanent --zone=drop --add-service=http firewall-cmd --permanent --zone=drop --add-service=https firewall-cmd --reload
12. 内核参数加固
# /etc/sysctl.d/99-hardening.conf # 禁用IP转发(非路由器) net.ipv4.ip_forward = 0 # 防SYN洪水攻击 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 # 禁ICMP重定向 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 # 禁源路由 net.ipv4.conf.all.accept_source_route = 0 # 忽略ICMP广播 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 生效 sysctl --system
13. 限制crontab使用
防止普通用户通过计划任务提权:
# 创建 /etc/cron.allow,仅允许指定用户 echo "root" > /etc/cron.allow echo "ops" >> /etc/cron.allow chmod 600 /etc/cron.allow # 删除 cron.deny(allow优先级更高) rm -f /etc/cron.deny
14. 设置文件完整性监控
关键目录被篡改时第一时间告警,用AIDE工具:
# 安装AIDE yum install -y aide # 初始化数据库(首次运行,约5-10分钟) aide --init # 将数据库移到正式位置 cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz # 日常检查 aide --check
四、审计与监控(3项)
15. 开启auditd审计日志
记录关键操作,出事了能追溯:
# cenots 7安装并启动 yum install -y audit systemctl enable --now auditd # 审计sudo执行记录 auditctl -w /usr/bin/sudo -p x -k sudo_exec # 审计passwd文件修改 auditctl -w /etc/passwd -p wa -k passwd_modify # 查看审计日志 ausearch -k sudo_exec --today
16. 配置日志远程转发
本地日志可能被入侵者删除,远程留存才是兜底方案:
# 日志服务器端 /etc/rsyslog.conf $ModLoad imtcp $InputTCPServerRun 514 # 客户端转发 /etc/rsyslog.d/remote.conf *.* @@10.20.30.50:514 systemctl restart rsyslog
17. 部署进程异常监控脚本
「随风跑」原创编写的简易监控脚本,检测异常CPU占用:
#!/bin/bash # 本脚本为「随风跑」原创编写 # 功能:监控CPU占用超过80%的进程并告警 # 文件名:/opt/scripts/cpu_monitor.sh THRESHOLD=80 ALERT_LOG="/var/log/cpu_alert.log" ps aux --sort=-%cpu | awk 'NR>1{print $2,$3,$11}' | while read pid cpu cmd; do cpu_int=${cpu%.*} if [ "$cpu_int" -gt "$THRESHOLD" ]; then echo "[$(date '+%F %T')] WARN: PID=$pid CPU=${cpu}% CMD=$cmd" >> "$ALERT_LOG" fi done # 加入crontab每5分钟执行 */5 * * * * /opt/scripts/cpu_monitor.sh
五、更新与补丁(2项)
18. 配置自动安全更新
# CentOS/RHEL 安装dnf-automatic yum install -y dnf-automatic # 编辑 /etc/dnf/automatic.conf upgrade_type = security apply_updates = yes emit_via = motd systemctl enable --now dnf-automatic.timer
💡 生产环境建议先在测试机验证补丁兼容性,再灰度推送。自动更新只开security级别,避免业务被大版本升级打断。
19. 定期漏洞扫描
#!/bin/bash # 本脚本为「随风跑」原创编写 # 功能:每周扫描系统已知漏洞并生成报告 # 文件名:/opt/scripts/vuln_scan.sh REPORT="/var/log/vuln_report_$(date +%F).txt" echo "===== 系统漏洞扫描报告 =====" > "$REPORT" echo "扫描时间: $(date)" >> "$REPORT" echo "主机名: $(hostname)" >> "$REPORT" echo "" >> "$REPORT" # 检查可用的安全更新 echo "--- 待安装的安全更新 ---" >> "$REPORT" yum updateinfo list security all 2>/dev/null >> "$REPORT" # 检查监听端口 echo "" >> "$REPORT" echo "--- 当前监听端口 ---" >> "$REPORT" ss -tlnp >> "$REPORT" # 检查SUID文件 echo "" >> "$REPORT" echo "--- SUID文件列表 ---" >> "$REPORT" find / -perm -4000 -type f 2>/dev/null >> "$REPORT" echo "" >> "$REPORT" echo "扫描完成,报告已保存至 $REPORT"
🚨 特别注意SUID文件列表中的异常项,如果出现 /tmp/ 下的SUID文件,极大概率已被入侵,需立即排查。
总结
安全加固不是一次性的工作,而是一个持续的过程。这19项配置覆盖了从网络入口到系统内部的关键防线,建议按照以下优先级执行:
记住一句话:安全不是绝对的不被攻破,而是让攻击者的成本高于收益。做好这19项,大部分自动化攻击脚本会直接跳过你的服务器。
📚 关注「随风跑」,每天5分钟掌握一个Linux运维技能
回复【命令】获取Linux常用命令速查表 | 回复【路线】获取完整学习路径