
第 1 部分 —— 安全基础
这部分介绍安全基础操作和启动配置,服务器安装后应立即执行这些步骤(Day 0 setup)。
1. 系统更新
安全的第一步是打补丁,绝不要在装有过期软件包的服务器上运行服务。
# Debian / Ubuntu
sudo apt update && sudo apt upgrade -y
# RHEL / CentOS / AlmaLinux
sudo yum update -y
2. 用户管理
永远不要以 root 身份登录或运行应用程序,请创建一个具备管理员权限的普通用户。
# 创建用户 'oz',带 home 目录和 bash shell
sudo useradd -m -s /bin/bash oz
# 设置强密码
sudo passwd oz
# 授予 sudo 权限
# Debian/Ubuntu:
sudo usermod -aG sudo oz
# RHEL/CentOS:
sudo usermod -aG wheel oz
3. 密码策略
强制用户定期更换密码,并让长期不用的账户过期。
# 查看用户 'oz' 当前密码过期策略
sudo chage -l oz
# 强制每 90 天修改一次密码
sudo chage -M 90 oz
# 账户闲置 30 天后锁定
sudo chage -I 30 oz
4. 锁定 Root 账户
当 sudo 用户配置完成后,锁定 root 账户以防止直接登录。
# 锁定 root 账户(禁用密码登录)
sudo passwd -l root
# (可选)如确有必要可解锁:
# sudo passwd -u root
5. SSH 基础安全配置
编辑 /etc/ssh/sshd_config 来加固 SSH。
修改前务必备份配置:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
打开配置文件:
sudo nano /etc/ssh/sshd_config
关键配置项:
Port 2222 # 修改默认端口(“通过隐藏达到安全性”)
PermitRootLogin no # 最重要的一行!
PasswordAuthentication no # 如果使用 SSH Key,建议关闭密码登录
PermitEmptyPasswords no # 禁止空密码
MaxAuthTries 3 # 失败 3 次后断开连接
LoginGraceTime 60 # 超过 60 秒未登录成功则断开
应用配置:
sudo systemctl restart sshd
6. 防火墙基础
先关闭所有入口,再开放需要的端口。
方案 A:UFW(Ubuntu/Debian,简单易用)
# 1. 默认拒绝所有入站连接
sudo ufw default deny incoming
# 2. 允许所有出站流量
sudo ufw default allow outgoing
# 3. 放行 SSH(如果第 5 步改了端口,请同步修改)
sudo ufw allow 2222/tcp
# 4. 放行 Web 流量(如果需要)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 5. 启用防火墙
sudo ufw enable
方案 B:Firewalld(RHEL/CentOS)
# 添加 SSH 端口(如果使用自定义端口)
sudo firewall-cmd --permanent --add-port=2222/tcp
# 重载防火墙
sudo firewall-cmd --reload
7. 禁用无用服务
减少攻击面,关闭不需要的服务。
# 查看所有已启用服务
systemctl list-unit-files --state=enabled
# 停止并禁用服务(例如不需要 postfix)
sudo systemctl stop postfix
sudo systemctl disable postfix
8. 文件权限基础
统一权限设置,防止未授权访问。
# 755: 所有者(RWX),组(R-X),其他(R-X)
# 适用于目录/脚本
chmod 755 script.sh
# 644: 所有者(RW),组(R),其他(R)
# 适用于配置文件
chmod 644 config.yaml
# 600: 所有者(RW),其他(None)
# 私钥必须使用(非常重要)
chmod 600 id_rsa
9. 时间同步
如果时间戳错误,日志基本没有意义。确保 NTP 正常运行。
# 启用 NTP 时间同步
sudo timedatectl set-ntp on
# 查看状态
timedatectl status
10. 检查活动会话
维护系统前,先确认是否还有其他用户在线。
# 当前谁在线?
w
# 最近登录记录,如果last不支持用
# lslogins -o USER,LAST-LOGIN,LAST-TTY
#
last -n 10
# 登录失败记录(检查暴力破解)
# 如果lastb不支持用
# journalctl -u ssh | grep "Failed password"
sudo lastb -n 10
11. Shell 历史记录清理
不要在历史记录中留下敏感命令(例如 CLI 中传递的密码)。
# 清空当前会话历史
history -c
# 永久清空历史文件
cat /dev/null > ~/.bash_history
# 当前会话不记录历史
export HISTSIZE=0
第 2 部分 —— 高级技巧
这部分介绍可产品环境使用的工具与配置,把你的服务器打造成安全堡垒。
12. 精细化sudo 权限
用sudo精确控制权限,不要直接编辑 /etc/sudoers,必须使用 visudo,否则语法错误可能导致 sudo 完全失效。
sudo visudo
常见配置:
# 1. 免密码 sudo(谨慎使用,适合自动化脚本)
# 用户 deploy 无需密码即可执行所有命令
deploy ALL=(ALL) NOPASSWD: ALL
# 2. 命令限制(最小权限原则)
# 用户 junior 只能重启 nginx
junior ALL=(ALL) /usr/bin/systemctl restart nginx
# 3. 用户组权限
# sysadmin 组拥有完整权限
%sysadmin ALL=(ALL) ALL
13. 高级 SSH 安全
不要再依赖密码。使用 SSH Key + 多因素认证(MFA)。
步骤 A:强制仅允许 SSH Key 登录
在执行前,请确保已经用 ssh-copy-id 上传公钥。
# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
步骤 B:启用 2FA(Google Authenticator)
增加第二层防护。
sudo dnf install libpam-google-authenticator
google-authenticator
按照屏幕提示完成配置。
14. 入侵防护(Fail2Ban)
自动封禁恶意行为 IP(如暴力破解)。
# 安装
sudo dnf install fail2ban -y
# 创建本地配置(不要直接改 jail.conf)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
关键配置:
[sshd]
enabled = true
port = ssh(或你的自定义端口 2222)
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 1h
重启并检查状态:
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
15. 不可变文件(chattr)
让关键文件不可删除,甚至 root 也不行。
# 锁定文件(Immutable 位)
sudo chattr +i /etc/passwd
# 查看属性(注意是否有 'i')
lsattr /etc/passwd
# 尝试删除(会失败)
rm /etc/passwd
# 解锁文件(编辑前必须解除)
sudo chattr -i /etc/passwd
16. ACL 访问控制列表
当传统 chmod(用户/组/其他)不够用时。
# 单独给用户 john 授予 rwx 权限,
# 不受文件所有者影响
setfacl -m u:john:rwx /var/www/html/index.php
# 删除 ACL
setfacl -x u:john /var/www/html/index.php
# 查看 ACL
getfacl /var/www/html/index.php
17. 端口与 Socket 审计
检测后门或异常监听端口。
# 查看所有监听端口(TCP/UDP)及对应 PID
sudo ss -tulpn
# 谁占用了 8080 端口?
sudo lsof -i :8080
# 按进程监控网络带宽
sudo nethogs eth0
18. 内核加固(sysctl)
增强网络栈,防御 IP 欺骗与中间人攻击。
sudo nano /etc/sysctl.conf
添加/取消注释:
# 禁用 IP 转发(如果不是路由器)
net.ipv4.ip_forward = 0
# 忽略 ICMP Echo(禁止 Ping 响应,隐藏主机)
net.ipv4.icmp_echo_ignore_all = 1
# 防止 IP Spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# 禁用 IPv6(如果不用)
net.ipv6.conf.all.disable_ipv6 = 1
立即生效:
sudo sysctl -p
19. 进程限制
通过限制资源防止 DoS(拒绝服务攻击)。
编辑:
nano /etc/security/limits.conf
示例:
# 用户 oz 最多只能创建 50 个进程
oz hard nproc 50
# 提高数据库用户文件打开数限制
postgres soft nofile 4096
postgres hard nofile 10240
20. 日志分析与取证
在海量日志中找到关键线索。
# 实时监控认证日志
tail -f /var/log/auth.log
# 仅查看 SSH 服务日志
journalctl -u sshd --since "1 hour ago"
# 只查看错误和严重级别日志
journalctl -p err -b
21. Rootkit 扫描
自动化安全审计。
# 安装 RKHunter
sudo dnf install rkhunter -y
# 更新数据库
sudo rkhunter --propupd
# 执行检查
sudo rkhunter --check
22. Cron 任务安全
恶意软件常通过计划任务实现重启后持久化。
# 查看当前用户 cron
crontab -l
# 检查系统级 cron(重点检查这些目录)
ls -la /etc/cron.daily/
ls -la /etc/cron.hourly/
cat /etc/crontab
23. 法律警告 Banner
吓退脚本小子,同时增加法律效力。
# 编辑 Banner 文件
sudo nano /etc/issue.net
添加类似内容:
上帝在看着你,未经许可登入系统会被全程记录,直接移交司法系统。
启用 SSH Banner:
sudo nano /etc/ssh/sshd_config
添加/取消注释:
Banner /etc/issue.net
重启sshd
sudo systemctl restart sshd

本文内容不需要死记硬背,把本文加入书签,或者打印出来备用。
参考
https://medium.com/the-tech-notes/linux-security-cheat-sheet-0fd019ef4fcf