Linux服务器安全加固实操指南:SSH防护、SELinux与fail2ban纵深配置

服务器安全加固的纵深防御思路

服务器安全加固不是单一配置项的修改,而是一套从网络层到应用层的纵深防御体系。一台新装好的Linux服务器暴露在公网上,平均存活时间不超过30分钟就会收到第一次SSH暴力破解扫描。服务器安全加固的核心目标是将攻击成本提高到攻击者难以承受的水平,同时不影响正常业务运行。

纵深防御体系分为四层:网络访问控制(防火墙)、身份认证加固(SSH)、入侵检测响应(fail2ban)、强制访问控制(SELinux)。每层独立失效不影响其他层的防护能力,实现逐层递进的安全边界。

SSH服务安全配置实战

SSH是Linux服务器管理的主要入口,也是攻击者最常尝试的突破口。默认SSH配置存在多个安全隐患,需要逐项修正。

# /etc/ssh/sshd_config 关键安全配置

Port 58222                          # 修改默认端口
PermitRootLogin no                  # 禁止root直接登录
PasswordAuthentication no           # 禁用密码认证,强制密钥登录
PubkeyAuthentication yes            # 启用密钥认证
MaxAuthTries 3                      # 最大认证尝试次数
LoginGraceTime 30                   # 认证超时30秒断开
AllowUsers deploy ops               # 白名单限制可登录用户
ClientAliveInterval 300             # 300秒无操作发送心跳
ClientAliveCountMax 0               # 不响应心跳立即断开
Protocol 2                          # 仅允许SSH协议版本2
X11Forwarding no                    # 关闭X11转发
AllowTcpForwarding no               # 关闭TCP转发(按需开启)

密钥认证配置完成后,切换到密钥登录验证无误,再禁用密码认证。Ed25519算法比RSA更安全更高效,推荐作为首选密钥类型:

ssh-keygen -t ed25519 -C "deploy@server-01" -f ~/.ssh/server01_key
ssh-copy-id -i ~/.ssh/server01_key.pub deploy@server-ip -p 58222

firewalld防火墙规则配置

防火墙是服务器安全加固的第一道防线。firewalld是CentOS/RHEL默认防火墙管理工具,基于zone概念划分信任级别。生产环境应将公网接口放入drop zone,仅显式放行必要端口。

# 设置默认zone为public,仅放行业务端口
firewall-cmd --permanent --zone=public --set-target=DROP
firewall-cmd --permanent --zone=public --add-port=58222/tcp   # SSH
firewall-cmd --permanent --zone=public --add-port=443/tcp     # HTTPS
firewall-cmd --permanent --zone=public --add-port=80/tcp      # HTTP
firewall-cmd --permanent --zone=public --add-rich-rule='
  rule family="ipv4" source address="10.0.0.0/8" port port="3306" protocol="tcp" accept'
firewall-cmd --reload
firewall-cmd --list-all --zone=public

内部服务端口(如MySQL 3306、Redis 6379)不应暴露在public zone,通过rich rule限定来源IP为内网段。云服务器选型时还需配合云厂商安全组实现网络层双重过滤。

fail2ban自动封禁恶意IP

fail2ban通过分析日志文件识别恶意行为,自动调用iptables/firewalld封禁攻击IP。它是服务器故障排查和入侵响应的自动化工具,对SSH暴力破解效果显著。

# 安装fail2ban
yum install -y fail2ban epel-release
# 或 Debian/Ubuntu
apt install -y fail2ban

# /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 3
banaction = firewallcmd-rich-rules

[sshd]
enabled  = true
port     = 58222
filter   = sshd
logpath  = /var/log/secure
maxretry = 3
bantime  = 86400

[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
bantime  = 604800
findtime = 86400
maxretry = 5

启动fail2ban后,查看封禁状态和攻击日志:

systemctl enable --now fail2ban
fail2ban-client status sshd
fail2ban-client status recidive
fail2ban-client banned

SELinux强制访问控制配置

SELinux是Linux内核级强制访问控制(MAC)机制,即使root权限也受策略约束。很多管理员习惯直接setenforce 0关闭SELinux,这种做法等于放弃了一整层安全防护。正确做法是理解SELinux策略并根据业务需求配置。

# 查看SELinux状态
getenforce
sestatus

# 临时切换模式(重启失效)
setenforce 0    # Permissive(仅记录不阻止)
setenforce 1    # Enforcing

# /etc/selinux/config 永久配置
SELINUX=enforcing

# 排查SELinux拒绝日志
grep AVC /var/log/audit/audit.log | tail -20
ausearch -m AVC -ts today

# 使用audit2allow生成策略补丁
ausearch -m AVC -ts today | audit2allow -M custom_policy
semodule -i custom_policy.pp

常见SELinux问题处理:Web服务无法访问非标准目录时,使用semanage fcontext修改文件上下文而非关闭SELinux:

# 允许Nginx访问自定义Web根目录
semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"
restorecon -Rv /data/web

# 允许服务监听非标准端口
semanage port -a -t http_port_t -p tcp 8443

IDC数据中心物理安全与日志审计

算力资源规划中,物理服务器安全不只有软件配置。IDC数据中心的物理访问控制、BIOS安全启动、带外管理(IPMI/BMC)网络隔离同样关键。IPMI接口应部署在独立管理网络,禁止公网可达。

日志审计方面,配置rsyslog将安全日志远程转发到独立日志服务器,防止攻击者清除入侵痕迹:

# /etc/rsyslog.conf 远程日志转发
*.* @@log-server.internal:6514

定期运行Lynis安全扫描工具,获取服务器安全合规评分和改进建议:

yum install -y lynis
lynis audit system --quick

服务器安全加固是持续性工作,非一次性配置。系统补丁要及时更新(yum-cron自动更新安全补丁),定期review防火墙规则和fail2ban策略,配合高可用集群架构中的节点级隔离,才能维持长期安全水位。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-an-quan-jia-gu-shi-cao-zhi-nan-ssh-fang-hu/

(0)
小编小编
上一篇 2026年8月3日
下一篇 2026年8月3日

相关推荐

Linux 服务器安全加固实操指南:SSH 防护与内核参数调优

服务器安全加固为什么从 SSH 和内核参数入手

服务器暴露在公网,遭受的第一波攻击几乎都是 SSH 暴力破解和端口扫描。根据互联网蜜罐数据,一台新上线公网 IP 的服务器,平均 4 分钟内就会收到首次 SSH 扫描。内核参数则决定了系统对 SYN Flood、连接耗尽等网络层攻击的防御能力。把这两层防护做扎实,服务器安全水位能提升 80% 以上。

SSH 服务安全配置详解

SSH 配置文件位于 /etc/ssh/sshd_config,以下配置项逐条加固:

1. 禁用密码登录,仅允许密钥认证

# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

密码登录是暴力破解的主要入口。密钥认证用 2048 位以上的 RSA 或 Ed25519 密钥对,破解成本在当前算力下不具备可行性。生成密钥对:

ssh-keygen -t ed25519 -C "admin@server-01" -f ~/.ssh/server01_key

将公钥上传到服务器:

ssh-copy-id -i ~/.ssh/server01_key.pub user@server-ip

2. 修改默认端口并限制监听地址

Port 2222
ListenAddress 0.0.0.0

改端口不能防住针对性攻击,但能过滤掉 99% 的自动化扫描脚本。如果服务器只允许内网访问,将 ListenAddress 绑定到内网 IP。

3. 禁用 root 远程登录

PermitRootLogin no

root 账户是攻击者的首选目标。日常操作通过普通用户登录后 sudo 提权,配合审计日志可追溯每一次提权操作。

4. 限制登录尝试和超时

MaxAuthTries 3
LoginGraceTime 30

三次尝试失败立即断开连接,30 秒内未完成认证也断开。防止暴力破解脚本长时间占用连接。

5. 配置 SSH 证书颁发机构(CA)

团队规模较大时,逐个管理 authorized_keys 效率很低。SSH CA 方案用 CA 密钥签发用户证书,服务器只需信任 CA 公钥:

# 生成 CA 密钥对
ssh-keygen -t ed25519 -f ~/.ssh/ca_key

# 签发用户证书(有效期 24 小时)
ssh-keygen -s ~/.ssh/ca_key -I "user-zhangsan" -V +24h ~/.ssh/user_key.pub

# 服务器端信任 CA
echo "TrustedUserCAKeys /etc/ssh/ca_pub.pem" >> /etc/ssh/sshd_config

员工离职只需撤销证书,不需要逐台服务器清理 authorized_keys。

Fail2ban 自动封禁暴力破解 IP

Fail2ban 监控 SSH 日志,自动封禁多次失败尝试的 IP:

# 安装
apt install fail2ban -y   # Debian/Ubuntu
yum install fail2ban -y    # CentOS/RHEL

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 86400

配置含义:10 分钟内同一 IP 失败 3 次,封禁 24 小时。生产环境建议 bantime 设置为 604800(7 天)。

验证 Fail2ban 运行状态:

fail2ban-client status sshd

内核网络参数安全调优

内核参数通过 sysctl 配置,文件路径 /etc/sysctl.conf,修改后 sysctl -p 生效。

1. SYN Flood 防护

# 启用 SYN Cookie
net.ipv4.tcp_syncookies = 1

# SYN 队列最大长度
net.ipv4.tcp_max_syn_backlog = 8192

# SYN+ACK 重试次数(默认 5,降到 2)
net.ipv4.tcp_synack_retries = 2

SYN Flood 攻击通过发送大量 SYN 包耗尽服务器半连接队列。SYN Cookie 机制让服务器不在队列中保存半连接状态,而是将状态编码在 SYN+ACK 的序列号中,客户端回复 ACK 时再还原状态。

2. 连接保活与超时优化

# 减少已建立连接的超时时间
net.ipv4.tcp_fin_timeout = 15

# keepalive 探测间隔(秒)
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5

# 允许 TIME_WAIT 端口复用
net.ipv4.tcp_tw_reuse = 1

短连接密集场景下 TIME_WAIT 堆积会耗尽端口。启用 tcp_tw_reuse 允许新连接复用 TIME_WAIT 状态的端口,比 tcp_tw_recycle 安全(后者在 NAT 环境下会导致连接异常)。

3. 连接数限制

# 系统级最大文件描述符
fs.file-max = 1048576

# conntrack 表大小(防止 NAT 连接跟踪表溢出)
net.netfilter.nf_conntrack_max = 1048576

文件描述符限制在 /etc/security/limits.conf 中配置,conntrack 参数在 /etc/sysctl.conf 中设置。

iptables 防火墙规则配置

内核参数调优是被动防御,防火墙是主动防御。基础规则集:

# 默认拒绝所有入站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许已建立连接的回包
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

# 允许 SSH(改端口后的)
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 限制 ICMP(防止 ping 探测)
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

# 保存规则
iptables-save > /etc/iptables/rules.v4

安全审计与入侵检测

配置完防护后,还需要持续监控:

登录审计:检查异常登录

# 查看最近失败的 SSH 登录
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10

# 查看成功登录的来源 IP
grep "Accepted" /var/log/auth.log | awk '{print $NF}' | sort | uniq -c | sort -rn

文件完整性监控:用 AIDE 检测关键文件篡改

apt install aide -y
aideinit
aide --update

cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

# 定期检查
crontab -e
0 3 * * * /usr/bin/aide --check | mail -s "AIDE Report" admin@company.com

内核参数调优效果验证

调整完参数后,用压测工具验证防御效果:

# SYN Flood 压测(仅用于自有服务器测试)
apt install hping3 -y
hping3 -S --flood -p 2222 target-ip

# 观察连接队列
ss -lnt | grep 2222
watch -n 1 'netstat -s | grep -i syn'

正常情况下,开启 SYN Cookie 后,即使 SYN 包速率达到万级,服务器的半连接队列也不会溢出,已建立连接不受影响。

服务器安全加固是一个持续过程,SSH 配置和内核参数是基础防线,搭配 Fail2ban 自动封禁、防火墙规则过滤、文件完整性监控,构成从网络层到应用层的纵深防御体系。建议每次加固后用自动化脚本记录配置变更,便于回滚和审计。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-an-quan-jia-gu-shi-cao-zhi-nan-ssh-fang-hu/

(0)
小编小编
上一篇 2026年7月28日
下一篇 2026年7月28日

相关推荐