一、整体原则与落地顺序
总体思路:先减少攻击面 → 再加固身份与权限 → 补齐日志与审计 → 建立持续检查机制。
推荐执行顺序:
二、账号与认证安全
2.1 禁用或删除无用账号
# 查看所有本地账号
cut -d: -f1 /etc/passwd
# 锁定不需要登录的账号
usermod -L 用户名
# 或直接删除(确认无业务依赖)
userdel 用户名
要点:
- 禁用
games、lp、news 等历史遗留账号; - 核查是否存在 UID=0 的“伪 root”账号:
awk -F: '($3 == 0) {print \$1}' /etc/passwd
如非必要,只应保留一个 root。
2.2 密码复杂度与有效期
以基于 PAM 的常见发行版(RHEL/CentOS/Ubuntu)为例:
1)安装密码质量模块(如已内置可略过):
# RHEL/CentOS
yum install -y libpwquality
# Debian/Ubuntu
apt-get install -y libpam-pwquality
2)编辑 /etc/security/pwquality.conf:
minlen = 12 # 最小长度12
dcredit = -1 # 至少1个数字
ucredit = -1 # 至少1个大写字母
lcredit = -1 # 至少1个小写字母
ocredit = -1 # 至少1个特殊字符
3)密码有效期(/etc/login.defs):
PASS_MAX_DAYS 90 # 最长使用天数
PASS_MIN_DAYS 1 # 两次修改间隔
PASS_WARN_AGE 7 # 过期前7天提醒
2.3 登录失败锁定策略
编辑 /etc/pam.d/system-auth(RHEL 系)或对应 PAM 配置:
auth required pam_faillock.so preauth silent deny=5 unlock_time=600
auth [success=1 default=bad] pam_unix.so
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=600
account required pam_faillock.so
含义:10 分钟内连续 5 次失败即锁定 10 分钟。
三、SSH 与远程管理加固
3.1 禁止 root 直接远程登录
编辑 /etc/ssh/sshd_config:
PermitRootLogin no # 禁止 root 直接登录
PasswordAuthentication no # 推荐禁用密码登录,只允许密钥
Protocol 2 # 强制使用 SSH v2
LoginGraceTime 30 # 登录宽限时间
MaxAuthTries 3 # 最大认证失败次数
MaxSessions 3 # 每连接最大 session 数
然后重启 SSH:
systemctl restart sshd
执行前必须确认已有普通用户具备 sudo 能力,否则可能锁死远程运维。
3.2 使用非默认端口(可选)
Port 22xx # 修改为非 22 端口,如 2222/22022 等
这不是“安全的根本”,但能显著降低随机扫描和暴力破解噪音。
3.3 启用基于密钥的认证
ssh-keygen -t ed25519 -C "your_email@example.com"
# 或 rsa, 至少2048位
ssh-keygen -t rsa -b 4096
将公钥加入服务器 ~/.ssh/authorized_keys,权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
四、系统与服务最小化(减少攻击面)
4.1 禁用不必要的服务
查看开机自启服务:
systemctl list-unit-files --type=service
按需禁用:
systemctl disable --now service_name
常见可考虑禁用的服务(视业务而定):
cups(打印)、avahi-daemon(局域网发现)、bluetooth、rpcbind 等。
4.2 仅安装必要软件包
- 禁止在生产服务器上安装编译器和多余开发工具,如
gcc、make,除非业务确有合理理由并有额外防护。
五、防火墙与网络访问控制
5.1 使用 firewalld(RHEL 系)
启用并设为开机启动:
systemctl enable firewalld --now
只开放必要端口,例如:
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
其他所有入站连接默认拒绝。
如需限制来源 IP:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="1.2.3.4/32" service name="ssh" accept'
firewall-cmd --reload
5.2 保护管理接口与数据库
- 数据库、缓存(MySQL、PostgreSQL、Redis、MongoDB)不对公网开放;
# 示例:只允许 10.0.0.0/24 访问 3306
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="3306" accept'
firewall-cmd --reload
六、文件权限与特权控制
6.1 核查关键文件权限
ls -l /etc/passwd /etc/shadow /etc/sudoers
推荐:
/etc/passwd/etc/shadow/etc/sudoers
chmod 600 /etc/shadow
chmod 440 /etc/sudoers
6.2 控制 sudo 权限
编辑 /etc/sudoers(使用 visudo):
%webadmin ALL=(ALL) /bin/systemctl restart nginx,/bin/journalctl -u nginx
6.3 SUID/SGID 检查
查找 SUID/SGID 文件:
find / -perm /6000 -type f -xdev 2>/dev/null
对非常规或不需要 SUID/SGID 的程序去掉对应位(谨慎操作):
chmod u-s /path/to/file # 移除SUID
chmod g-s /path/to/file # 移除SGID
七、日志与审计
7.1 系统日志集中管理
确保 rsyslog 或 journald 正常运行:
systemctl status rsyslog
systemctl status systemd-journald
设置日志持久化(systemd):
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald
7.2 安全审计(auditd)
安装并启用:
yum install -y audit
systemctl enable auditd --now
示例规则 /etc/audit/rules.d/audit.rules(按需扩展):
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /var/log/secure -p wa -k secure_logs
重启 auditd 后,用 ausearch -k 关键字 查询。
八、补丁与漏洞管理
8.1 定期更新系统
RHEL/CentOS:
yum update -y
Debian/Ubuntu:
apt-get update && apt-get upgrade -y
建议策略:
- 高危漏洞(有公开利用 PoC 或爆出大规模攻击)视情况 24–72 小时内修补;
- 采用“测试环境先验证,生产后滚动更新”的方式降低风险。
8.2 漏洞扫描(需配合工具)
- 部署内部或云端漏洞扫描器(如基于 OpenVAS、国内商业扫描器等);
- 扫描结果必须落实到修复清单,形成“发现 → 确认 → 修复 → 复测”的闭环;
九、基线与持续自查
9.1 建立安全基线文档
将以上各项(账号、密码策略、SSH 配置、防火墙、日志审计等)整理成 “本单位 Linux 安全基线”,内容包括:
- 每一条基线项的:要求 / 实际配置位置 / 责任人 / 检查方式例如:
| | | |
|---|
| PermitRootLogin no | | grep PermitRootLogin /etc/ssh/sshd_config |
| minlen=12 | /etc/security/pwquality.conf | grep minlen /etc/security/pwquality.conf |
9.2 定期执行基线自查
可以自己写 Shell 脚本检查关键配置,例如:
#!/bin/bash
echo "=== Check SSH root login ==="
grep -E '^PermitRootLogin' /etc/ssh/sshd_config
echo "=== Check password policy ==="
grep -E 'minlen' /etc/security/pwquality.conf
grep -E 'PASS_MAX_DAYS' /etc/login.defs
echo "=== Check firewall status ==="
systemctl is-active firewalld
firewall-cmd --list-all
然后每月运行一次,将结果归档。
十、简单“执行清单”汇总(可直接用于上线前检查)
上线前至少确认以下 12 项:
- 已删除/禁用无用账号,除 root 外无额外 UID=0 账号
- 禁止 root 直接 SSH 登录,已使用密钥认证
- SSH 非必要不暴露公网,或仅允许堡垒机 / 管理网段访问
- firewalld/iptables 已启用,所有非业务必须端口关闭
- 数据库、缓存等内部服务端口不对公网开放,只允许应用网段
- 系统中无明显多余服务(如 cups、avahi 等)在运行
- 关键系统文件(/etc/passwd、/etc/shadow、/etc/sudoers)权限符合基线
- 日志持久化开启,安全事件(登录、sudo、配置变更)可审计