服务器安全加固怎么做

结论: 服务器安全加固的核心是把默认状态改造成最小可用状态:禁用 root 直登与密码登录、按角色分配 sudo 权限、关掉不需要的服务与端口、收紧内核与文件权限、开启审计与自动补丁,并用基线清单逐项验收。按本文 9 项检查表执行,可在 1 小时内把一台新机的暴露面收敛到可控范围。

一台刚装好系统的服务器,出厂配置的目标往往是"能跑起来",而不是"足够安全"。默认开启的 SSH 密码登录、监听在 0.0.0.0 的数据库端口、可被任意用户读取的配置文件、从未更新过的内核——这些都是自动化扫描器最容易捡走的果实。据公开威胁情报统计,一台暴露在公网的云服务器在上线后平均几分钟内就会收到第一次扫描,几小时内就会出现在暴力破解字典里。服务器安全加固不是一次性动作,而是"初始加固 + 持续核查 + 变更留痕"的闭环。

服务器安全加固包含哪些内容?

服务器安全加固是指对操作系统、账户体系、网络服务、文件权限与审计日志进行系统性收敛,使攻击者可利用的入口最少、横向移动最难、操作留痕最完整。主流参照标准是 CIS Benchmark(互联网安全中心基准)与等保 2.0 三级要求。

从工程角度看,服务器安全加固可以拆成六层,每一层都有明确的检查项和验收命令:

  • 身份层:谁能登录、用什么方式登录、登录后能做什么。
  • 服务层:这台机器对外暴露了哪些端口、跑了多少不必要的守护进程。
  • 系统层:内核参数是否限制了常见攻击手法,文件权限是否越权。
  • 数据层:磁盘是否加密、备份是否加密、密钥如何管理。
  • 审计层:谁在什么时候做了什么,日志是否被送到远端留存。
  • 持续性:补丁是否及时、基线是否被自动化工具持续校验。

需要注意的是,安全加固一定伴随着可用性风险:改错 SSH 配置可能把自己锁在门外,收紧权限可能导致业务写不进日志。因此所有操作都遵循同一条铁律——先留后路再动手:保留一个已建立的长连接会话、准备好云厂商的 VNC 控制台入口、改配置前先备份原文件。

账户与权限加固:最小权限原则怎么落地

账户加固的第一原则是"不给多余的身份,不给多余的权限"。在一台多人共用的服务器上,共享 root 密码是最糟糕的实践:一旦有人离职或密码泄露,你无法定位是谁做了什么,也无法单独回收某个人的权限。

创建管理员账户并配置 sudo

bash
# 1. 新建运维账户(以 opsadmin 为例)
useradd -m -s /bin/bash opsadmin
passwd opsadmin

# 2. 加入 wheel(CentOS/RHEL)或 sudo(Ubuntu/Debian)组
usermod -aG wheel opsadmin     # RHEL/CentOS/Rocky/Alma
# usermod -aG sudo opsadmin    # Ubuntu/Debian

# 3. 用 visudo 校验后写规则(visudo 会在保存时做语法检查,务必用它而不是 vi 直改)
visudo -c
cat > /etc/sudoers.d/opsadmin <<'EOF'
# 允许执行全部命令,但必须输入自己的密码
opsadmin ALL=(ALL) PASSWD: /usr/bin/systemctl, /usr/bin/journalctl, /bin/mount
# 仅授予重启指定服务的权限,且免密(适合自动化脚本账号)
deploy  ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
EOF
chmod 0440 /etc/sudoers.d/opsadmin
visudo -c

上述配置展示了两种典型策略:运维账号需要密码才能提权,自动化部署账号只允许重启指定的服务且免密。/etc/sudoers.d/ 下的分片文件优于直接修改 /etc/sudoers,升级系统时不会被覆盖。

清理无用账户与口令策略

bash
# 检查哪些账户可以交互登录(shell 不是 nologin/false)
awk -F: '($3>=1000 && $7!~/nologin|false/) {print $1, $3, $7}' /etc/passwd

# 锁定长期不用的账户,禁止登录但保留文件属主
usermod -L olduser
usermod -s /sbin/nologin appuser

# 找出空密码账户,必须清零
awk -F: '($2 == "") {print "空密码账户:", $1}' /etc/shadow

# 口令复杂度:密码长度 ≥ 12 位,有效期 ≤ 90 天
cat > /etc/security/pwquality.conf.d/hardening.conf <<'EOF'
minlen = 12
dcredit = -1
ucredit = -1
ocredit = -1
lcredit = -1
maxrepeat = 3
EOF
chage --maxdays 90 opsadmin

禁用 root 远程 SSH 登录详见 服务器SSH安全怎么配置,暴力破解的封禁策略详见 服务器怎么防止暴力破解。

服务与端口收敛:把攻击面压到最小

服务器上每多监听一个端口,就多一条通往内部的路。默认安装的 Linux 发行版常会拉起 cups(打印服务,631 端口)、avahi-daemon(零配置发现,5353/UDP)、rpcbind(111 端口)等与业务无关的服务。

bash
# 第一步:看看现在到底监听了哪些端口、对应哪个进程
ss -lntup

# 第二步:关掉并禁用不需要的服务(以常见无关服务为例)
systemctl disable --now cups avahi-daemon rpcbind bluetooth

# 第三步:数据库、缓存中间件不要监听 0.0.0.0,改为内网地址或 127.0.0.1
# Redis 示例:/etc/redis/redis.conf
#   bind 127.0.0.1 10.0.0.12
#   protected-mode yes
#   requirepass <强密码>
sed -i 's/^bind .*/bind 127.0.0.1/' /etc/redis/redis.conf
systemctl restart redis

# 第四步:从外网验证收敛结果(用另一台机器扫描)
# nmap -Pn -sV your.server.ip

端口治理的详细高危清单见 服务器端口安全怎么设置,防火墙规则写法见 服务器防火墙怎么配置。

系统内核与文件权限加固

内核参数(sysctl)能挡住相当一部分网络层攻击;文件权限则决定了"已经被登进来了还能走多远"。

bash
# /etc/sysctl.d/99-hardening.conf —— 一份可直接落地的内核加固参数
cat > /etc/sysctl.d/99-hardening.conf <<'EOF'
# 禁用 IP 源路由,防止绕过防火墙
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 开启 SYN Cookie,缓解 SYN Flood
net.ipv4.tcp_syncookies = 1
# 忽略 ICMP 广播与伪造响应
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 不响应重定向报文,防止路由被篡改
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# 开启反向路径过滤,防 IP 欺骗
net.ipv4.conf.all.rp_filter = 1
# 记录可疑报文(martian)
net.ipv4.conf.all.log_martians = 1
# 限制内核日志泄露(dmesg 权限)
kernel.dmesg_restrict = 1
# 开启 ASLR 与限制 core dump
kernel.randomize_va_space = 2
fs.suid_dumpable = 0
EOF
sysctl --system

文件与目录权限方面,重点排查三类问题:SUID/SGID 程序(可被提权的二进制)、全局可写文件(任意用户可篡改)、敏感文件的属主。

bash
# 扫描可疑的 SUID/SGID 程序,与系统初始清单比对
find / -xdev \( -perm -4000 -o -perm -2000 \) -type f 2>/dev/null | sort > /tmp/suid.now

# 检查全局可写且无 sticky 位的文件
find / -xdev -type f -perm -0002 ! -perm -1000 -print 2>/dev/null

# 收紧关键文件权限
chmod 600 /etc/shadow /etc/gshadow
chmod 644 /etc/passwd /etc/group
chmod 600 /etc/ssh/sshd_config
chown root:root /etc/crontab
chmod 600 /etc/crontab
chmod 700 /root

审计、补丁与基线清单:让加固可持续

没有审计的加固等于没加固。Linux 自带的 auditd(审计守护进程)可以把规则的增删改、关键文件的读写、用户的命令执行都记录下来;而 Lynis 这类基线审计工具能把"应该做什么"变成可复跑的检查清单。

bash
# 安装并启用 auditd(Ubuntu 24.04 / RHEL 9 通用)
apt install -y auditd audispd-plugins    # Debian 系
# dnf install -y audit audispd-plugins   # RHEL 系
systemctl enable --now auditd

# 写入关键审计规则
cat > /etc/audit/rules.d/hardening.rules <<'EOF'
# 监控账户与权限相关文件的写入,-p wa 表示写与属性变更
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers_action
-w /etc/sudoers.d/ -p wa -k sudoers_action
-w /etc/ssh/sshd_config -p wa -k sshd_config
# 监控命令执行(64 位系统调用表)
-a always,exit -F arch=b64 -S execve -k cmd_exec
# 规则文件设为不可变,防被攻击者删除(需重启生效,慎用)
-e 2
EOF
augenrules --load
auditctl -l | head -20

下表是建议纳入交付验收的服务器安全加固基线检查清单,每台新机上线前逐条打勾:

检查项验收命令合格标准
root 禁止 SSH 直登`sshd -T \grep permitrootlogin`输出 permitrootlogin no
密码登录已关闭`sshd -T \grep passwordauthentication`输出 no(须先配好密钥)
无用账户已锁定awk -F: '($2==""){print $1}' /etc/shadow无任何输出
sudo 需密码且最小化visudo -c && ls /etc/sudoers.d/校验通过,无 ALL=(ALL) NOPASSWD: ALL
监听端口已收敛ss -lntup仅保留业务必需端口
防火墙默认拒绝`iptables -S \head -3 或 ufw status`INPUT 链默认 DROP / ufw active
关键文件权限正确stat -c '%a %n' /etc/shadow600 /etc/shadow
审计守护进程运行systemctl is-active auditdactive
自动安全更新开启systemctl is-enabled unattended-upgradesenabled
基线扫描无高危`lynis audit system \grep -i warning`高危项已整改或已书面豁免

补丁管理建议采用"分级更新"策略:安全更新(Security Updates)自动安装,内核与中间件的大版本更新在测试环境验证后灰度发布,避免自动更新把生产环境拖进兼容性陷阱。

bash
# Ubuntu/Debian:开启无人值守安全更新
apt install -y unattended-upgrades
dpkg-reconfigure -f noninteractive unattended-upgrades
cat /etc/apt/apt.conf.d/20auto-upgrades

# RHEL 系:只装安全补丁
dnf install -y dnf-automatic
systemctl enable --now dnf-automatic-install.timer

# 用 Lynis 做基线扫描(截至 2026 年主流版本为 3.x)
apt install -y lynis
lynis audit system --quick
# 报告位于 /var/log/lynis-report.dat,建议在 /tmp 保留历史版本做对比

常见误区 / 排错提示

  1. 没配好密钥就先禁用密码登录,结果把自己锁在外面。 正确顺序是先新增密钥并用新窗口验证可登录,再关闭 PasswordAuthentication,且修改期间保留已登录会话不断开。
  2. 直接 vi /etc/sudoers 改错语法导致所有 sudo 失效。 必须用 visudo,它会在保存时校验;已经改坏且无法提权时,用云厂商控制台的 VNC/救援模式回滚。
  3. 把 SELinux 或 AppArmor 关掉当成"解决权限问题的方法"。 遇到拒绝访问应查 /var/log/audit/audit.log 调整策略上下文,而不是全局 setenforce 0。
  4. 以为装了 fail2ban 就万事大吉。 防爆破工具只抬高成本,真正有效的是密钥登录 + 端口收敛 + 默认拒绝的防火墙组合。
  5. 加固规则加了 -e 2 锁死 auditd 后忘了重启会失效。 该参数须重启才能生效,生效后修改规则同样需要重启,生产环境请安排在维护窗口。
  6. 只加固系统层,忽略了应用层与备份。 弱口令后台、未加密的异地备份往往才是数据泄露的真实入口,静态数据请参考 服务器数据加密怎么做。

常见问题(FAQ)

服务器安全加固大概需要多长时间?

一台标准 Linux 云主机完成基础加固约需 1~2 小时。其中账户与 SSH 改造约 20 分钟,服务与端口收敛约 30 分钟,内核参数与文件权限约 20 分钟,审计与补丁策略约 20 分钟,最后跑一轮 Lynis 验收 10 分钟。存量业务机器因为要先确认端口依赖通常需要额外排查。

加固会不会影响业务正常运行?

只要遵循"先评估、后变更、留回滚"就不会。高风险项仅集中在 SSH 配置与防火墙默认策略两处。建议先在测试机验证,生产环境选择业务低峰执行,并保留云控制台 VNC 作为兜底入口,改完立即做业务可用性验证(HTTP 200 检查 + 关键日志无异常)。

SELinux 到底该开还是该关?

生产服务器建议开启并保持 enforcing 模式。SELinux 能在应用被攻破后限制其横向影响范围,是现代 Linux 安全体系的重要一环。遇到 "Permission denied" 时应通过 audit2why 分析拒绝原因,用 semanage fcontext 修正文件上下文或追加自定义策略模块,而不是整体关闭。

如何验证加固到底有效果?

最可靠的方式是外部视角验证。用另一台主机执行 nmap -Pn -sV <目标IP> 检查暴露端口是否只剩业务必需项,用 ssh -o PreferredAuthentications=password 尝试密码登录应被拒绝,内部再跑 lynis audit system 对比加固前后的 Hardening index(加固指数)分数是否提升。

云服务器还需要在操作系统层面加固吗?

需要,而且必须做。云厂商负责的是云平台自身与底层虚拟化安全,租用的 ECS/CVM 实例内部的账户、端口、权限、补丁属于用户责任范围,这就是云计算的"责任共担模型"。即使购买了主机安全服务,系统层基线仍需自己落实。