Linux 服务器安全加固实战:从 SSH 到自动化部署的完整方案 原创
引言
在 2026 年的网络安全环境下,服务器安全已从”可选项”变为”必选项”。无论是个人博客、企业应用还是云原生基础设施,安全加固都是运维工作的第一道防线。然而,很多运维人员在面对安全加固时往往感到无从下手——市面上充斥着碎片化的建议,缺乏系统化的实践指南。
本文将从 Linux 服务器安全加固的实际操作出发,涵盖 SSH 安全、防火墙配置、入侵检测、日志审计、自动化加固等核心主题,提供一套可落地、可验证的安全加固方案。
一、SSH 安全加固
1.1 密钥认证替代密码登录
密码登录是 SSH 安全的第一大隐患。暴力破解工具可以在短时间内尝试数百万个密码组合。切换到密钥认证是最基础也最有效的加固措施。
配置步骤:
- 生成密钥对:
ssh-keygen -t ed25519 -a 100(推荐 Ed25519 算法,比 RSA 更安全高效) - 复制公钥到服务器:
ssh-copy-id user@server - 修改
/etc/ssh/sshd_config:PasswordAuthentication no - 重启 SSH 服务:
systemctl restart sshd
1.2 SSH 配置文件最佳实践
以下是一份经过安全加固的 sshd_config 配置:
# 协议版本 Protocol 2 # 密钥认证 PubkeyAuthentication yes PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no # 端口与绑定 Port 2222 # 修改默认端口,减少扫描攻击 ListenAddress 0.0.0.0 # 登录限制 PermitRootLogin prohibit-password # 禁止 root 密码登录,允许密钥登录 MaxAuthTries 3 # 最大认证尝试次数 MaxSessions 10 # 最大并发会话数 LoginGraceTime 30 # 登录超时时间(秒) # 空闲超时 ClientAliveInterval 300 # 每 300 秒发送保活包 ClientAliveCountMax 2 # 最大保活失败次数 # 日志与审计 LogLevel VERBOSE # 详细日志记录
1.3 Fail2Ban 防暴力破解
即使关闭了密码登录,Fail2Ban 仍然是 SSH 安全的重要补充。它通过分析日志文件,对频繁失败的 IP 进行临时封禁。
安装与配置:
# 安装 apt-get install fail2ban # 创建本地配置 cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # SSH 防护配置 [sshd] enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 3600 findtime = 600
二、防火墙与网络访问控制
2.1 iptables/nftables 基础策略
现代 Linux 系统推荐使用 nftables 替代 iptables。以下是一份基础防火墙策略:
#!/bin/bash
# 清空规则
nft flush ruleset
# 创建地址族
nft add table inet filter
# 创建链
nft add chain inet filter input { type filter hook input priority 0\; policy drop\; }
nft add chain inet filter forward { type filter hook forward priority 0\; policy drop\; }
nft add chain inet filter output { type filter hook output priority 0\; policy accept\; }
# 允许已建立的连接
nft add rule inet filter input ct state established,related accept
# 允许本地回环
nft add rule inet filter input iif lo accept
# 允许 SSH(修改为你的端口)
nft add rule inet filter input tcp dport 2222 accept
# 允许 HTTP/HTTPS
nft add rule inet filter input tcp dport { 80, 443 } accept
# 允许 ICMP(ping)
nft add rule inet filter input icmp type { echo-request, echo-reply } accept
# 记录并丢弃其他流量
nft add rule inet filter input log prefix "DROP: " drop
2.2 UFW 简化管理
对于不想直接操作 nftables 的用户,UFW(Uncomplicated Firewall)提供了更友好的接口:
ufw default deny incoming ufw default allow outgoing ufw allow 2222/tcp ufw allow 80/tcp ufw allow 443/tcp ufw enable
2.3 端口扫描防护
使用 PortSentry 或 psad 检测端口扫描行为:
# 安装 psad apt-get install psad # 配置 psad --sig-update psad -H # 查看警报 tail -f /var/log/psad/psad_alerts
三、入侵检测与文件完整性监控
3.1 AIDE 文件完整性检查
AIDE(Advanced Intrusion Detection Environment)通过数据库记录文件哈希值,检测文件篡改:
# 安装 apt-get install aide # 初始化数据库 aideinit mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db # 配置监控路径(/etc/aide/aide.conf) /etc p+i+n+u+g+s+m+c+md5+sha256 /bin p+i+n+u+g+s+m+c+md5+sha256 /sbin p+i+n+u+g+s+m+c+md5+sha256 # 定期检查 aide --check
3.2 rkhunter Rootkit 检测
Rootkit Hunter 可以检测系统中隐藏的恶意软件:
# 安装 apt-get install rkhunter # 更新特征库 rkhunter --update rkhunter --propupd # 执行扫描 rkhunter --check --skip-keypress # 配置定时扫描(crontab) 0 3 * * * /usr/bin/rkhunter --check --cronjob --report-warnings-only
3.3 实时文件监控
使用 auditd 实现实时文件变更监控:
# 安装 apt-get install auditd audispd-plugins # 配置规则(/etc/audit/rules.d/audit.rules) -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/ssh/sshd_config -p wa -k sshd_config -w /var/www/html -p wa -k web_content # 查看审计日志 ausearch -k identity --start today aureport -k
四、日志审计与集中管理
4.1 rsyslog 配置最佳实践
日志是安全事件的”黑匣子”,合理配置日志系统至关重要:
# /etc/rsyslog.conf 配置 # 开启远程日志接收 module(load="imudp") input(type="imudp" port="514") # 日志格式模板 template(name="SecureFormat" type="string" string="%TIMESTAMP% %HOSTNAME% %syslogtag% %msg%\n") # 按类型分类存储 auth,authpriv.* /var/log/secure cron.* /var/log/cron kern.* /var/log/kern.log *.info;mail.none;authpriv.none /var/log/messages
4.2 logrotate 日志轮转
防止日志文件无限增长导致磁盘耗尽:
# /etc/logrotate.d/custom
/var/log/secure
/var/log/messages
/var/log/kern.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 root adm
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
4.3 集中日志管理
对于多服务器环境,推荐使用 ELK Stack 或 Loki 实现日志集中管理:
- Filebeat:轻量级日志采集器,部署在每个节点
- Logstash:日志解析与过滤
- Elasticsearch:日志存储与搜索
- Kibana:日志可视化与告警
五、自动化安全加固脚本
5.1 一键加固脚本
以下是一个综合安全加固脚本的核心逻辑:
#!/bin/bash # Linux 服务器安全加固脚本 echo "[+] 开始安全加固..." # 1. 系统更新 apt-get update && apt-get upgrade -y # 2. 禁用不必要的服务 systemctl disable --now cups bluetooth avahi-daemon # 3. 内核参数优化 cat >> /etc/sysctl.conf << EOF # 防止 IP 欺骗 net.ipv4.conf.all.rp_filter = 1 # 禁止 ICMP 重定向 net.ipv4.conf.all.accept_redirects = 0 # 禁止源路由 net.ipv4.conf.all.accept_source_route = 0 # SYN Flood 防护 net.ipv4.tcp_syncookies = 1 EOF sysctl -p # 4. 文件权限加固 chmod 640 /etc/shadow chmod 640 /etc/gshadow chmod 644 /etc/passwd chmod 644 /etc/group # 5. 安装安全工具 apt-get install -y fail2ban rkhunter aide auditd echo "[+] 安全加固完成!"
5.2 Ansible 自动化部署
对于多服务器环境,使用 Ansible 实现安全加固的自动化:
---
- name: 服务器安全加固
hosts: all
become: yes
tasks:
- name: 更新系统包
apt:
upgrade: dist
update_cache: yes
- name: 配置 SSH
lineinfile:
path: /etc/ssh/sshd_config
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
loop:
- { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication no' }
- { regexp: '^PermitRootLogin', line: 'PermitRootLogin prohibit-password' }
- { regexp: '^Port', line: 'Port 2222' }
- name: 配置 UFW
ufw:
rule: "{{ item.rule }}"
port: "{{ item.port }}"
proto: tcp
loop:
- { rule: allow, port: '2222' }
- { rule: allow, port: '80' }
- { rule: allow, port: '443' }
六、持续监控与应急响应
6.1 建立安全基线
安全加固不是一次性工作,而是一个持续的过程。建立安全基线包括:
- 定期漏洞扫描(推荐 OpenVAS 或 Nessus)
- CVE 监控(订阅相关产品的安全公告)
- 配置变更审计(使用 etcd 或 Git 跟踪配置变更)
6.2 应急响应流程
当检测到安全事件时,遵循以下流程:
- 隔离:立即断开受影响服务器的网络连接
- 取证:保存内存快照、日志文件、进程列表
- 分析:确定攻击向量、影响范围、数据泄露情况
- 清除:移除恶意软件、修补漏洞
- 恢复:从备份恢复系统、重置所有密码
- 复盘:分析根本原因、更新安全策略
结语
服务器安全加固是一项系统工程,没有"银弹"。本文提供的方案覆盖了从基础 SSH 加固到自动化部署的完整链路,适用于个人服务器到企业级集群的不同场景。关键在于:安全不是配置完就结束的,需要持续监控、定期审计、及时响应。
记住一个原则:最小权限——只开放必要的端口、只授予必要的权限、只运行必要的服务。遵循这个原则,你的服务器安全性将提升一个数量级。