返回首页

服务器安全加固清单 — 新机器上线前必做的 20 件事

📅 创建于 2026-05-12 🔄 更新于 2026-05-12 📝 1143 字

服务器安全加固清单

新机器上线前不做安全加固,等于把门打开等人进来。 生产环境暴露在公网后,扫描、暴力破解、漏洞利用会在几小时内接踵而至。 加固核心原则:纵深防御——每层都有防线,即使某一层被突破,还有其他层保护。

适用场景: 新采购服务器首次上线 / 接手他人维护的服务器 / 重装系统后 / 等保合规整改 / 安全评估后基线修复

加固前准备:快照和备份

⚠️ 任何生产环境操作前,必须先做好备份和快照。加固涉及 SSH、iptables、服务重启,操作失误可能导致服务器无法登录。

  1. 在云控制台创建服务器快照(或 VMware/vSphere 虚拟机快照)
  2. 记录当前 SSH 连接的方式和 IP
  3. 准备 ILO/IPMI/云厂商 VNC/远程终端作为紧急回滚通道
  4. 确认快照恢复后需重新配置的项(IP、hostname、SSH keys 等)

一、账号与权限管理(第 1-5 项)

第 1 项:禁用 root 用户直接登录

root 是暴力破解的首要目标。禁用 root 直接登录,迫使用户使用普通账号 + sudo,极大提高攻击成本。

CentOS/RHEL:

sudo useradd -m -s /bin/bash -G wheel admin
sudo passwd admin
# /etc/ssh/sshd_config: PermitRootLogin no
sudo systemctl restart sshd

Ubuntu:

sudo adduser admin
sudo usermod -aG sudo admin
# 复制 SSH 公钥到新用户
sudo mkdir -p /home/admin/.ssh && sudo chmod 700 /home/admin/.ssh
sudo cp ~/.ssh/authorized_keys /home/admin/.ssh/
sudo chown -R admin:admin /home/admin/.ssh
# /etc/ssh/sshd_config: PermitRootLogin no
sudo systemctl restart sshd

验证: 另开终端,用 root 登录应提示 Permission denied


第 2 项:SSH 公钥认证,禁止密码登录

密码登录容易暴力破解和字典攻击。参见 ssh-brute-force-protection-guide 的详细配置。

# 本机生成密钥对
ssh-keygen -t ed25519 -C "[email protected]"
# 上传公钥
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@<server-ip>
# /etc/ssh/sshd_config:
#   PubkeyAuthentication yes
#   PasswordAuthentication no
#   ChallengeResponseAuthentication no
sudo systemctl restart sshd

验证: 公钥登录应免密码。密码登录应被拒绝。 ⚠️ 退出前务必新开终端测试公钥登录是否正常。


第 3 项:删除或锁定不需要的系统账号

# 查看有 shell 的账号
cat /etc/passwd | awk -F: '{print $1":"$7}' | grep -v nologin | grep -v false

# 锁定不需要的账号(如 games)
sudo usermod -s /sbin/nologin games
# 删除测试账号
sudo userdel -r testuser
# 锁定密码
sudo passwd -l <username>

应保留的系统账号: root、admin/ubuntu(你创建的)、daemon、sshd


第 4 项:设置密码策略

# /etc/security/pwquality.conf
# minlen = 12          # 最小密码长度
# dcredit = -1         # 至少一个数字
# ucredit = -1         # 至少一个大写字母
# lcredit = -1         # 至少一个小写字母
# ocredit = -1         # 至少一个特殊字符
# difok = 3            # 新旧密码至少 3 个字符不同

# /etc/login.defs
# PASS_MAX_DAYS   90   # 密码最长使用天数
# PASS_MIN_DAYS   7    # 密码最短使用天数
# PASS_WARN_AGE   7    # 过期前警告天数

# 为现有用户设置
sudo chage -M 90 -m 7 -W 7 admin

第 5 项:配置 sudo 日志记录

# /etc/sudoers 或 /etc/sudoers.d/audit
Defaults logfile=/var/log/sudo.log
Defaults loglinelen=80
Defaults log_year
# 或更精细的 rsyslog 方案
sudo bash -c 'echo "local2.debug /var/log/sudo.log" >> /etc/rsyslog.conf'

验证: sudo -l 查看权限,执行 sudo 命令后检查日志文件。


二、防火墙与网络配置(第 6-10 项)

第 6 项:配置防火墙

防火墙是新服务器的第一道防线。即使云平台有安全组,内部防火墙也应配置,防止安全组规则配置错误导致暴露。

# CentOS firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --add-port=22/tcp --permanent    # 先放行 SSH
sudo firewall-cmd --add-port=80/tcp --permanent    # 按需添加
sudo firewall-cmd --remove-service=dhcpv6-client --permanent  # 移除不需要的服务
sudo firewall-cmd --reload

# Ubuntu ufw
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status verbose

# iptables 底层(firewalld 操作前务必备份)
sudo iptables-save > /root/iptables.bak

验证: firewall-cmd --list-allsudo ufw status verbose。从另一台机器测试端口可达性。


第 7 项:关闭不必要的服务和端口

# 列出所有运行中的服务
systemctl list-units --type=service --state=running
# 查看监听端口
ss -tlnp

# 关闭和禁用不需要的服务(如 telnet/rsh/cups/postfix 等)
sudo systemctl stop postfix
sudo systemctl disable postfix

第 8 项:禁用 ICMP 响应(可选但推荐)

# 临时
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# 永久
echo "net.ipv4.icmp_echo_ignore_all = 1" >> /etc/sysctl.d/99-security.conf
sysctl -p /etc/sysctl.d/99-security.conf

注意: 禁用后将无法 ping 通,影响排障。建议在防火墙层面限制而非完全禁用。


第 9 项:配置内核网络参数

linux-kernel-tuning-production 的性能调优不同,以下是安全加固视角的参数:

# /etc/sysctl.d/99-security.conf
# SYN Flood 防护
net.ipv4.tcp_syncookies = 1
# 限制 ICMP 广播
net.ipv4.icmp_echo_ignore_broadcasts = 1
# 忽略虚假的 ICMP 错误响应
net.ipv4.icmp_ignore_bogus_error_responses = 1
# 禁止 IP 源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 开启反向路径过滤(防 IP 欺骗)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 不响应代理 ARP
net.ipv4.conf.all.proxy_arp = 0
# 禁止重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
sudo sysctl -p /etc/sysctl.d/99-security.conf

第 10 项:限制文件描述符和进程数

# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

# systemd 全局限制(CentOS 7+)
# /etc/systemd/system.conf
DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535

三、系统安全配置(第 11-15 项)

第 11 项:更新系统和软件包

# CentOS/RHEL
sudo yum update -y
# Ubuntu
sudo apt update && sudo apt upgrade -y
# 重启使内核更新生效
sudo reboot

第 12 项:安装并配置 fail2ban

参见 ssh-brute-force-protection-guide 的 fail2ban 配置。简要步骤:

# CentOS
sudo yum install -y epel-release fail2ban
# Ubuntu
sudo apt install -y fail2ban

# /etc/fail2ban/jail.local
# [DEFAULT] bantime=3600 findtime=600 maxretry=5
# [sshd] enabled=true maxretry=3

sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

第 13 项:配置 auditd 审计

# CentOS/RHEL
sudo yum install -y audit
sudo systemctl enable --now auditd

# 添加审计规则(监控关键文件变更)
# /etc/audit/rules.d/security.rules
# -w /etc/passwd -p wa -k identity
# -w /etc/shadow -p wa -k identity
# -w /etc/ssh/sshd_config -p wa -k sshd
# -w /etc/sudoers -p wa -k sudoers
# -w /var/log/auth.log -p wa -k auth
# -w /etc/crontab -p wa -k cron

sudo augenrules --load
sudo auditctl -l

验证: sudo aureport --summary 查看审计报告。


第 14 项:关闭 Ctrl+Alt+Del 重启

防止控制台误操作:

# CentOS 7+
sudo systemctl mask ctrl-alt-del.target
# Ubuntu
sudo systemctl mask ctrl-alt-del.target

# 旧式(/etc/inittab)
# 注释掉 ca::ctrlaltdel:/sbin/shutdown -t3 -r now 行

验证: sudo systemctl status ctrl-alt-del.target 显示 masked


第 15 项:设置 GRUB 密码

# 生成密码哈希
grub2-mkpasswd-pbkdf2    # 按提示输入密码,复制生成的哈希

# /boot/grub2/grub.cfg 或 /etc/grub.d/40_custom
# set superusers="admin"
# password_pbkdf2 admin <哈希值>

# 更新 GRUB
grub2-mkconfig -o /boot/grub2/grub.cfg

⚠️ 风险: 忘记 GRUB 密码将无法修改内核启动参数,需要进入 rescue 模式重置。


四、SSH 与远程访问加固(第 16-20 项)

第 16 项:修改 SSH 默认端口

SSH 默认监听 22 端口,扫描器会首先扫描 22 端口。改成非标准端口可减少大量无效扫描。参见 ssh-brute-force-protection-guide

# /etc/ssh/sshd_config
Port 2222    # 选择一个 1024-65535 之间的端口

先放行防火墙再重启 SSH,避免锁住自己!

sudo firewall-cmd --add-port=2222/tcp --permanent
sudo firewall-cmd --reload
sudo systemctl restart sshd

第 17 项:配置 SSH 空密码和公钥检查

# /etc/ssh/sshd_config
PermitEmptyPasswords no           # 禁止空密码登录
StrictModes yes                    # 检查 authorized_keys 权限
PubkeyAuthentication yes          # 开启公钥认证
AuthorizedKeysFile .ssh/authorized_keys

第 18 项:限制 SSH 允许的用户和组

# /etc/ssh/sshd_config
AllowUsers admin deployer         # 仅允许特定用户登录
AllowGroups wheel sftp            # 或按组控制
# DenyUsers / DenyGroups 也可以

第 19 项:安装配置 AIDE 文件完整性检测

AIDE 建立文件系统基线快照,后续对比检测变更。适合等保合规场景。

# CentOS
sudo yum install -y aide
# Ubuntu
sudo apt install -y aide

# 初始化数据库(首次运行较慢)
sudo aide --init
sudo cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

# 日常检查
sudo aide --check
# 输出示例:
# Found differences: /etc/passwd, /etc/shadow, ...

建议配合 cron: 每日检查 + 结果邮件通知。


第 20 项:配置日志集中收集和告警

# rsyslog 发送到远程日志服务器
# /etc/rsyslog.conf
*.* @192.168.1.100:514     # UDP
# 或
*.* @@192.168.1.100:514    # TCP

# 日志轮转配置
# /etc/logrotate.d/custom
/var/log/*.log {
    weekly
    rotate 12
    compress
    delaycompress
    missingok
    notifempty
}

# logwatch 日志分析(可选)
sudo yum install -y logwatch
# 每日邮件报告
sudo logwatch --detail High --mailto [email protected]

自检脚本

文章提供了一份安全加固完成后的自检脚本 security_check.sh(详见 raw 源文件),覆盖项包括:root 登录、SSH 认证方式、防火墙、fail2ban、不必要的服务、文件描述符、内核参数、auditd、AIDE、密码策略等。


优先级总览

优先级 说明
高(必须做) 禁用 root 登录 / SSH 公钥认证 / 防火墙 / 关不必要服务 / 更新系统 / fail2ban 暴露即面临攻击
中(应该做) 禁用 ICMP / 内核安全参数 / ulimit / sudo 日志 / 密码策略 / SSH 改端口 提高攻击门槛
低(推荐做) auditd 审计 / GRUB 密码 / AIDE / 日志集中收集 合规与事后追溯

关联页面

页面 关联点
ssh-brute-force-protection-guide SSH 暴力破解防御(公钥/fail2ban/2FA/入侵检测)
linux-kernel-tuning-production 内核参数调优(性能视角)+ 安全加固参数交叉
network-troubleshooting-order 防火墙 / iptables 配置与排障
server-performance-four-dimensions 文件描述符监控与异常检测
docker-production-pitfalls Docker 生产环境踩坑(Docker API 安全与 daemon 加固)
linux-intrusion-detection-guide Linux 入侵检测与应急响应(AIDE/rkhunter/auditd/应急排查)
linux-filesystem-directory-structure-guide Linux FHS 文件系统目录结构详解 — 含各目录用途、运维排查路径速查、磁盘分区方案
linux-user-management-guide Linux 用户管理避坑指南(/etc/passwd/shadow/用户CRUD/密码策略/登录审计/防暴力破解)