新装 Linux 服务器的 14 项安全加固 checklist

起因

每开一台新服务器都重复同样的"装好后第一件事"。下面这 14 项是我每次
都做的,从攻击者最常用入口 → 防御。

checklist

1. 关闭 root SSH

sudo sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl reload ssh

只允许密钥 + 非 root 用户登录。改之前确认你有正常用户 + 密钥能登:

# 新终端测试
ssh me@server  # 必须能进
sudo whoami    # 必须能 sudo

否则改完会把自己锁外面。

2. 创建非 root 用户 + 加 sudo

sudo adduser me
sudo usermod -aG sudo me

# 拷贝你的 public key
sudo mkdir -p /home/me/.ssh
sudo cp ~/.ssh/authorized_keys /home/me/.ssh/
sudo chown -R me:me /home/me/.ssh
sudo chmod 700 /home/me/.ssh
sudo chmod 600 /home/me/.ssh/authorized_keys

3. 启用 ufw 防火墙

sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh       # 22 或自定义端口
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

4. 启用自动安全更新

sudo apt install -y unattended-upgrades apt-listchanges
sudo dpkg-reconfigure -priority=low unattended-upgrades

/etc/apt/apt.conf.d/50unattended-upgrades 改成只装 security:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};
sudo systemctl enable --now unattended-upgrades

5. fail2ban 防暴力破解

sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban

/etc/fail2ban/jail.local

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 <你的家庭 IP>

[sshd]
enabled = true

6. 改 SSH 端口(可选但有效)

sudo sed -i 's/^#\?Port .*/Port 2200/' /etc/ssh/sshd_config
sudo systemctl reload ssh
sudo ufw allow 2200/tcp
sudo ufw delete allow ssh

不是真"安全提升",但 SSH 攻击 log 减少 99%(攻击脚本只扫 22)。
副作用:很多自动化工具默认 22,加 ~/.ssh/config 写好端口。

7. 装 SSL 证书(Let's Encrypt)

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
# 自动跑 cert + 续期 cron

或用 Caddy(前面有篇)自动 HTTPS。

8. systemd hardening 关键 service

主要的应用 service unit 加:

[Service]
User=appuser
Group=appuser
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/log/myapp /var/lib/myapp
PrivateTmp=true
NoNewPrivileges=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
MemoryMax=2G
TasksMax=128

systemd-analyze security myapp.service 评分 + 提示。

9. 限制 sudo 命令

/etc/sudoers.d/me

me ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp, /bin/systemctl status myapp

只允许特定命令免密。其它 sudo 仍要密码。CI / deploy 服务账号
强烈推荐。

10. 配置 fail-fast 日志清理

# /etc/systemd/journald.conf
SystemMaxUse=2G
SystemMaxFileSize=200M
MaxRetentionSec=1month
sudo systemctl restart systemd-journald

防止日志失控撑爆磁盘。

11. 装 logwatch / 邮件总结

sudo apt install -y logwatch
echo 'Mailto: [email protected]' | sudo tee -a /etc/logwatch/conf/logwatch.conf

每天自动邮件汇总:sudo 用法 / SSH 登录 / cron 跑了什么 / 错误 log。
看一眼就知道异常。

12. 内核加固 sysctl

/etc/sysctl.d/99-security.conf

# 防止 IP spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Ignore ICMP broadcast
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 防 SYN flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192

# 不接 IPv4 / v6 source routing
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# 不发 ICMP redirect
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# kernel hardening
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_fifos = 2
sudo sysctl --system

13. 监控登录 + 命令历史

# /etc/profile.d/audit-history.sh
export HISTTIMEFORMAT="%F %T "
export HISTSIZE=10000
export HISTFILESIZE=20000
shopt -s histappend
PROMPT_COMMAND='history -a'

让所有 user shell history 带时间戳 + 跨 session 共享。
事后审计时知道"谁在什么时候跑了什么"。

进阶:装 auditd 记录 syscall 级别。

14. 备份 + 远程

按前面 borg / restic / kopia 配,备份到远程。
被勒索 → 还能拉回来。

一键脚本

把上面集成成一个 init 脚本:

#!/bin/bash
# /usr/local/sbin/server-init.sh
set -euo pipefail

# 1. 包更新
apt update && apt upgrade -y

# 2. 装基础工具
apt install -y \
    ufw fail2ban unattended-upgrades apt-listchanges \
    logwatch htop vim tmux git curl jq ncdu \
    chrony

# 3. ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 22
ufw allow 80
ufw allow 443
ufw --force enable

# 4. ssh 加固
sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl reload ssh

# 5. fail2ban
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
EOF
systemctl enable --now fail2ban

# 6. sysctl 加固
cat > /etc/sysctl.d/99-security.conf <<'EOF'
net.ipv4.tcp_syncookies = 1
kernel.dmesg_restrict = 1
fs.protected_symlinks = 1
EOF
sysctl --system

# 7. unattended-upgrades
systemctl enable --now unattended-upgrades

echo "Done. Reboot recommended."

10 分钟跑完一台新机器的基础加固。

不要做的反例

  1. 不要装一堆"安全套件":lynis / OSSEC / OpenSCAP 类工具好但
    不是装就安全。要懂它们报的是什么 + 真去修。

  2. 不要禁所有 ICMP:v6 的 PMTU 依赖 ICMPv6;v4 ping 关了排错痛苦。
    按需禁 (echo-request 限速即可)。

  3. 不要开 root sudo passwordless:你 deploy script 方便了,
    攻击者拿到 sudo 权限也方便。

  4. 不要给所有人 wheel / sudo group:每个用户单独 sudoers.d 文件
    细粒度授权。

  5. 不要忘了 host key 备份:服务器迁移时 host key 变 → 用户连接
    报"key changed (MITM?)" 警告。备份 /etc/ssh/ssh_host_* 提前换。

监督性持续工作

加固不是一次性。还有:

  • 定期跑 lynis / debsecan 看 CVE
  • nginx / nginx-mod-* 等关键包额外关注 CVE
  • 日志 anomaly detection(异常登录时间 / IP)
  • 重要服务的 systemd-analyze security 评分跟踪

效果

我们一批 ~20 台服务器跑这套 checklist 后:

  • SSH brute force log 从每天 5000 条 → 几条
  • 自动 security update 一周修 30+ CVE 不要人管
  • 误操作 destroy 风险通过 systemd hardening 大幅降低
  • 半年内一次"红蓝对抗演练",渗透测试团队 7 天没能从外网拿 shell
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。