起因
每开一台新服务器都重复同样的"装好后第一件事"。下面这 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 分钟跑完一台新机器的基础加固。
不要做的反例
-
不要装一堆"安全套件":lynis / OSSEC / OpenSCAP 类工具好但
不是装就安全。要懂它们报的是什么 + 真去修。 -
不要禁所有 ICMP:v6 的 PMTU 依赖 ICMPv6;v4 ping 关了排错痛苦。
按需禁 (echo-request 限速即可)。 -
不要开 root sudo passwordless:你 deploy script 方便了,
攻击者拿到 sudo 权限也方便。 -
不要给所有人 wheel / sudo group:每个用户单独 sudoers.d 文件
细粒度授权。 -
不要忘了 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
登录后参与评论。