一、概述
1.1 背景介绍
Linux 主机的“安全问题”在生产中往往不是 0/1,而是一个持续被配置细节放大的风险曲线:同一套业务在不同团队、不同镜像、不同运维习惯下,最终暴露面会出现数量级差异。
常见误判主要有三类:
“装了杀软/EDR 就安全”:主机被暴露的第一步通常来自弱口令、SSH 暴露、sudo 滥用、内核参数不当、日志审计缺失等配置问题;EDR 只能覆盖部分已知攻击链。
“只要开防火墙就行”:防火墙是重要的一层,但如果账号策略、权限边界、审计链路缺失,攻击者在内网横向时仍然非常顺。
“一次加固就一劳永逸”:加固是持续过程,需要把基线、变更、回滚、验证、监控串成闭环,否则一次误改就能把主机变成不可维护状态(锁死 SSH、sudo 失效、业务端口误封等)。
本文按“调优避坑类”方式组织:先讲默认值与适用边界,再给出高频误改与风险矩阵,最后给出可落地的推荐配置、回滚方案与验证动作,并覆盖 账号安全、SSH 加固、防火墙、内核参数、文件权限、审计日志 六大方向。
1.2 安全基线对照表(CIS 视角 + 生产落地视角)
说明:CIS Benchmark 的要求会因发行版与版本而不同。表中给出“方向对照”,落地时仍需按发行版官方文档与企业合规要求调整。
| 加固域 | 本文关键点(20项) | CIS/常见基线关注点 | 典型收益 | 典型风险点 |
|---|---|---|---|---|
| 账号安全 | 密码复杂度/有效期、失败锁定、root 登录限制、最小权限 sudo | 账户策略、口令策略、root/系统账号 | 降低爆破与凭据滥用 | 误改导致运维无法登录 |
| SSH | 禁止密码登录、限制来源、强算法、空闲断开、Banner | SSHD 配置、加密套件 | 减少暴露面与凭据攻击 | 锁死远程、旧客户端不兼容 |
| 防火墙 | 默认拒绝、最小放行、管理面隔离、出站策略 | Host firewall | 降低端口扫描与横向 | 误封业务端口、健康检查失败 |
| 内核参数 | 反欺骗、关闭重定向、SYN 防护、core dump 控制、ASLR | sysctl hardening | 降低网络/内核攻击面 | 与容器/网络栈策略冲突 |
| 文件权限 | umask、关键文件权限、禁止 SUID/SGID 滥用、/tmp 防护 | permissions, mount options | 降低提权路径 | 误改影响程序写入 |
| 审计日志 | auditd 规则、日志留存、远端汇聚、告警指标 | audit/logging | 事后可追溯、合规证据 | 规则过多导致性能与磁盘压力 |
1.3 适用场景
互联网暴露主机:跳板机、边缘节点、对外 API 网关、独立对外提供 SSH 的运维主机。
内网关键业务主机:支付、订单、账号、权限、核心数据库周边。
交付前基线统一:镜像制作、金镜像、自动化装机(PXE/Cloud-init/Ansible)。
合规与审计要求:等保、ISO27001、SOC2 相关审计留证。
事故后补强:发生爆破、异常登录、横向移动、提权疑似后。
1.4 环境要求
| 组件 | 版本 / 要求 | 说明 |
|---|---|---|
| 操作系统 | RHEL/CentOS 7/8/9、Rocky/Alma、Ubuntu 20.04/22.04/24.04、Debian 11/12 | 不同发行版 PAM/sshd/auditd 路径略有差异 |
| OpenSSH | 7.4+(建议 8.0+) | 老版本算法支持差,需兼容性评估 |
| 防火墙组件 | firewalld 或 nftables/iptables | 新发行版优先 nftables |
| 审计组件 | auditd(audit) | 与 systemd-journald/rsyslog 配合 |
| 权限 | root 或具备 sudo 权限的运维账号 | 加固需修改系统配置 |
| 监控/日志 | Prometheus/Agent、ELK/EFK、SIEM(可选) | 用于落地监控与告警闭环 |
1.5 安全加固坐标系(不要“东一榔头西一棒子”)
本文把主机加固拆成 5 个层次,所有动作都要能定位到坐标系,并能回滚与验证:
| 层次 | 目标 | 关键检查点 | 典型证据 |
|---|---|---|---|
| 入口层 | 控制谁能连进来 | SSH、端口暴露、来源限制 | ss/iptables/firewalld 状态、sshd_config |
| 身份层 | 控制谁是谁 | 账号策略、失败锁定、MFA(可选) | /etc/login.defs、PAM、faillock |
| 权限层 | 控制能做什么 | sudo 最小权限、SUID、文件权限 | sudoers.d、find 权限扫描 |
| 内核/网络层 | 控制攻击面与系统行为 | sysctl hardening、内核参数 | sysctl -a、/etc/sysctl.d |
| 可观测/审计层 | 控制能否追溯 | auditd、日志留存、告警 | audit.log、journald、SIEM 告警 |
二、详细步骤(调优避坑类结构)
本章分三段:
2.1 默认值与适用边界:告诉你“系统默认大概是什么”“哪些场景别乱改”。
2.2 常见误改与风险边界:把最常见的“自杀式加固”写清楚。
2.3 推荐调整、回滚与验证:给出可以直接落地的配置块 + 验证命令链。
2.1 默认值和适用场景
2.1.1 账号安全默认值概览
不同发行版默认策略差异较大,尤其是口令策略与失败锁定。
Ubuntu/Debian:常见依赖 PAM(pam_pwquality / pam_faillock 或旧的 pam_tally2),默认并不一定启用强复杂度。
RHEL 系:system-auth/password-auth 栈较完整,但企业镜像可能被二次改动。
关键默认文件:
/etc/login.defs:密码有效期、最小长度(并不强制复杂度)。
/etc/pam.d/*:认证栈(真正决定复杂度/锁定/限制)。
验证命令链:
# 当前密码策略相关文件 ls -l /etc/login.defs /etc/security/pwquality.conf 2>/dev/null || true # 失败锁定(RHEL系常见) command -v faillock >/dev/null && faillock --user root || true # PAM 栈(不同发行版路径不同) ls -l /etc/pam.d/system-auth /etc/pam.d/password-auth 2>/dev/null || true
2.1.2 SSH 默认值概览
OpenSSH 默认通常偏“可用性优先”,在互联网暴露环境需要收紧。
关键默认点:
PasswordAuthentication:很多发行版默认 yes。
PermitRootLogin:可能是 prohibit-password 或 yes(老系统)。
加密算法:新版本默认更安全,但兼容旧客户端时会被人为放宽。
验证命令链:
sshd -T | egrep -i 'passwordauthentication|permitrootlogin|pubkeyauthentication|kexalgorithms|ciphers|macs' | sed 's/^/sshd -T: /' # 已暴露监听 ss -lntp | egrep ':22|:2222' || true
2.1.3 防火墙默认值概览
firewalld:默认 zone 往往是 public,入站策略可能较宽。
nftables/iptables:很多主机默认没有规则,等同“全开”。
验证命令链:
# firewalld command -v firewall-cmd >/dev/null && firewall-cmd --state && firewall-cmd --get-default-zone && firewall-cmd --list-all || true # nftables command -v nft >/dev/null && nft list ruleset | head -n 50 || true # iptables command -v iptables >/dev/null && iptables -S || true
2.1.4 内核参数默认值概览(sysctl)
常见默认风险点:
net.ipv4.conf.*.accept_redirects/send_redirects/accept_source_route:部分系统默认未完全关闭。
net.ipv4.ip_forward:在路由/容器主机可能开启,业务机通常不需要。
fs.suid_dumpable、kernel.core_pattern:影响 core dump 与泄露。
验证命令链:
sysctl -a 2>/dev/null | egrep 'accept_redirects|send_redirects|accept_source_route|rp_filter|ip_forward|randomize_va_space|kptr_restrict|dmesg_restrict|fs.suid_dumpable' | sort
2.1.5 文件权限与挂载默认值概览
默认 umask 可能是 022(更偏可读),关键服务建议更严。
/tmp 多数系统未强制 noexec,nodev,nosuid(兼容性考虑)。
验证命令链:
umask mount | egrep ' on /tmp | on /var/tmp | on /dev/shm ' || true stat -c '%a %U:%G %n' /etc/passwd /etc/shadow /etc/gshadow /etc/ssh/sshd_config 2>/dev/null || true
2.1.6 审计与日志默认值概览
auditd 可能未安装/未启动。
journald 可能只本地短期保存。
验证命令链:
systemctl is-enabled auditd 2>/dev/null || true systemctl is-active auditd 2>/dev/null || true # journald 持久化 grep -E '^(Storage|SystemMaxUse|SystemKeepFree|MaxRetentionSec)=' /etc/systemd/journald.conf 2>/dev/null || true journalctl --disk-usage 2>/dev/null || true
2.2 常见误改和风险边界
2.2.1 高风险误改清单(先看这个,再动手)
| 误改动作 | 为什么危险 | 更稳的做法 |
|---|---|---|
| 直接把 PasswordAuthentication no 写入 sshd_config 并立即重启 | 没验证公钥登录链路就可能锁死远程 | 先开第二个 SSH 会话、先用 sshd -t 校验、再 reload |
| 把 PermitRootLogin no 但没有预留 sudo 账号 | root 入口被关,sudo 又不可用会直接“失联” | 先确认至少 2 个可 sudo 的运维账号 |
| 防火墙 default deny 后忘记放行业务端口/健康检查端口 | 业务下线、探活失败、集群摘除 | 先列出端口清单(含探活/监控/同步)再应用 |
| rp_filter=1 强制开启在多网卡/策略路由主机 | 可能导致回包被丢、网络异常 | 多网卡/策略路由用 2(loose)或按接口精细配置 |
| 给 /tmp 加 noexec 但业务/安装脚本依赖临时执行 | 安装失败、运行时崩溃 | 先在灰度机验证,或用应用专用临时目录 |
| audit 规则堆满(每个 syscalls 都记录) | 高 IO/CPU、日志爆盘 | 只对关键动作审计,启用 rotate、设置阈值告警 |
2.2.2 根因矩阵:加固后“看起来像故障”的现象如何定位
| 现象 | 首看证据 | 二次验证 | 高概率根因 | 处理动作 |
|---|---|---|---|---|
| SSH 连不上(连接被拒/超时) | ss -lntp 、防火墙状态 | journalctl -u sshd -n 200 | sshd 未监听/防火墙未放行 | 回滚最近变更,先放行 22/管理端口 |
| SSH 能连但认证失败 | /var/log/auth.log 或 /var/log/secure | sshd -T 、PAM 日志 | 禁用密码但无公钥;PAM 锁定 | 先恢复至少一种认证方式或解锁 |
| sudo 报错/无法提权 | sudo -l 输出、/var/log/secure | 检查 /etc/sudoers.d 权限 | sudoers 语法错误/权限不对 | 用 visudo -c 修复,回滚文件 |
| 业务网络异常 | dmesg 、ip route、sysctl | 抓包/连接跟踪 | rp_filter/redirect 参数影响 | 调整为 loose 或按接口配置 |
| 磁盘快速增长 | audit.log/journalctl | du -sh /var/log/* | 审计规则过量、日志未轮转 | 收敛规则,配置 logrotate |
2.3 推荐调整、回滚与验证(20项关键配置)
建议原则:
每一项都要有回滚手段;2) 每一项都要有验证命令;3) 先灰度、后全量;4) 所有变更落盘可追溯(配置备份 + 变更记录)。
下面的 20 项按六大域组织:
账号安全(1-6)
SSH 加固(7-12)
防火墙(13-14)
内核参数(15-17)
文件权限与挂载(18-19)
审计日志(20)
2.3.1 账号安全(1/20):最小化可登录账号 + 锁定无用系统账号
推荐调整:
对无交互登录需求的系统账号,将 shell 设置为 /sbin/nologin 或 /usr/sbin/nologin。
对不再使用的本地账号执行锁定。
# 找出可登录账号(shell 非 nologin/false)
awk -F: '($7 !~ /(nologin|false)$/){print $1" "$7}' /etc/passwd
# 锁定账号(示例:olduser)
passwd -l olduser
usermod -s /sbin/nologin olduser 2>/dev/null || usermod -s /usr/sbin/nologin olduser
# 验证锁定状态
passwd -S olduser || true
回滚:
passwd -u olduser usermod -s /bin/bash olduser
风险边界:不要锁定正在跑业务的服务账号(如应用进程需要 su/sudo 或登录执行维护脚本的账号)。
2.3.2 账号安全(2/20):口令复杂度(pam_pwquality)
推荐调整:启用并收紧口令质量(长度、字符类、重复限制)。
Ubuntu/Debian 常见配置:/etc/security/pwquality.conf
# /etc/security/pwquality.conf minlen = 14 dcredit = -1 ucredit = -1 lcredit = -1 ocredit = -1 maxrepeat = 3 maxclassrepeat = 4 gecoscheck = 1 reject_username = 1
RHEL 系常见在 PAM 栈中指定(示例片段):
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= password sufficient pam_unix.so sha512 shadow try_first_pass use_authtok
验证:
# 尝试给测试账号设置弱口令(应被拒绝) # passwd testuser # 查看 pwquality 生效路径 grep -R "pam_pwquality" -n /etc/pam.d 2>/dev/null | head
回滚:恢复原 pwquality.conf 与 PAM 文件(见第 3 章脚本“备份/回滚”)。
风险边界:过度收紧会导致自动化账号/机器人账号改密失败,建议把机器账号改为密钥/令牌机制,不要靠弱口令。
2.3.3 账号安全(3/20):密码有效期与最小更改间隔(login.defs)
推荐调整:
人员账号:强制周期换密(例如 90 天)。
机器账号:不建议靠周期换密;建议用密钥/证书。
/etc/login.defs 建议值:
PASS_MAX_DAYS 90 PASS_MIN_DAYS 1 PASS_WARN_AGE 14
验证:
chage -l
回滚:将 PASS_* 恢复或只对特定用户用 chage 定向设置。
风险边界:对大量账号直接统一改会触发集中改密潮,建议分批推进并结合 IAM 流程。
2.3.4 账号安全(4/20):登录失败锁定(pam_faillock)
推荐调整:对本地认证启用失败锁定,降低爆破成功率。
RHEL 8/9 示例(system-auth/password-auth 常见写法):
auth required pam_faillock.so preauth silent deny=5 unlock_time=900 fail_interval=900 auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900 fail_interval=900 account required pam_faillock.so
验证:
# 连续输错密码后查看 faillock --user# 解锁 faillock --user --reset
回滚:移除 pam_faillock 相关行或恢复备份。
风险边界:
需要明确“锁定的是谁”:对运维账号也锁定会增加值班风险。
建议配套“break-glass”账号(强权限、强审计、离线保管)。
2.3.5 账号安全(5/20):限制 su(仅 wheel 组可 su)
推荐调整:启用 pam_wheel 限制 su。
/etc/pam.d/su 示例:
auth required pam_wheel.so use_uid group=wheel
验证:
getent group wheel || grep '^wheel:' /etc/group # 非 wheel 用户执行 su 应失败 # su -
回滚:注释/移除该行。
风险边界:在不使用 su、只用 sudo 的团队可不启用,避免对历史脚本造成影响。
2.3.6 账号安全(6/20):sudo 最小权限与日志
推荐调整:
业务运维按职责拆分 sudoers(命令级最小化)。
强制 sudo 日志记录与 TTY。
/etc/sudoers.d/ops-minimal 示例(权限文件必须 0440):
Defaults use_pty Defaults logfile="/var/log/sudo.log" Defaults loglinelen=0 # 仅允许运维组执行 systemctl/journalctl 等 %ops ALL=(root) NOPASSWD: /bin/systemctl, /bin/journalctl # 禁止通配符给出 /bin/bash 之类的逃逸命令
验证:
visudo -c sudo -l sudo systemctl status sshd sudo tail -n 5 /var/log/sudo.log 2>/dev/null || true
回滚:删除/恢复 sudoers.d 文件(先用备份)。
风险边界:
NOPASSWD 不是原罪,但必须配套审计与来源控制。
禁止把 ALL 直接给到广泛人群。
2.3.7 SSH(7/20):禁止 root 直接登录(保留可审计的 sudo 入口)
推荐调整:
互联网暴露:PermitRootLogin no
内网可控:至少 prohibit-password(仅允许密钥)
/etc/ssh/sshd_config:
PermitRootLogin no
验证:
sshd -t && systemctl reload sshd sshd -T | grep -i permitrootlogin
回滚:改回 prohibit-password 或 yes(仅临时救援,需配套来源限制)。
2.3.8 SSH(8/20):关闭口令登录,强制公钥(生产推荐)
/etc/ssh/sshd_config:
PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes AuthenticationMethods publickey
验证:
sshd -t sshd -T | egrep -i 'passwordauthentication|kbdinteractiveauthentication|authenticationmethods' # 在另一个终端用密钥登录验证 # ssh -i ~/.ssh/id_ed25519 user@host
回滚:临时打开 PasswordAuthentication yes(必须同时限制来源 IP,并设置时间窗口)。
风险边界:
旧自动化脚本可能依赖密码;应迁移为密钥或证书。
2.3.9 SSH(9/20):限制可登录用户/组(AllowUsers/AllowGroups)
/etc/ssh/sshd_config:
AllowGroups ops wheel # 或者精确到用户:AllowUsers alice bob
验证:
getent group ops wheel || true sshd -T | egrep -i 'allowgroups|allowusers'
回滚:注释该行或加入必要账号。
风险边界:
与集中账号(LDAP/SSSD)结合时,需要确认组名解析正常。
2.3.10 SSH(10/20):收紧算法(Kex/Ciphers/MACs)并考虑兼容性
/etc/ssh/sshd_config(示例,需按版本调整):
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
验证:
sshd -T | egrep -i 'kexalgorithms|ciphers|macs|hostkeyalgorithms' # 从客户端探测(需要 nmap 或 ssh -Q) ssh -Q cipher | head ssh -Q kex | head
回滚:恢复为发行版默认或逐步放宽(不要一次性把弱算法全开)。
风险边界:某些老设备/老系统的 ssh 客户端不支持新算法,需在跳板/堡垒层做兼容隔离。
2.3.11 SSH(11/20):空闲断开与连接限制(防止挂起会话滥用)
/etc/ssh/sshd_config:
ClientAliveInterval 300 ClientAliveCountMax 2 LoginGraceTime 30 MaxAuthTries 3 MaxSessions 10
验证:
sshd -T | egrep -i 'clientaliveinterval|clientalivecountmax|logingracetime|maxauthtries|maxsessions'
回滚:恢复原值。
2.3.12 SSH(12/20):记录与提示(Banner、日志级别)
/etc/ssh/sshd_config:
LogLevel VERBOSE Banner /etc/issue.net
/etc/issue.net 示例:
Authorized access only. All activity may be monitored and reported.
验证:
sshd -T | egrep -i 'loglevel|banner'
风险边界:Banner 不要泄露系统版本与内部信息。
2.3.13 防火墙(13/20):入站默认拒绝 + 最小放行(含回滚窗口)
以 firewalld 为例(nftables/iptables 类似):
# 查看当前区与规则 firewall-cmd --get-default-zone firewall-cmd --list-all # 示例:只放行 SSH(22) + 业务(443) + 监控(9100) firewall-cmd --permanent --add-service=ssh firewall-cmd --permanent --add-service=https firewall-cmd --permanent --add-port=9100/tcp # reload 前先在当前会话确认规则 firewall-cmd --reload firewall-cmd --list-all
回滚:
# 删除放行 firewall-cmd --permanent --remove-port=9100/tcp || true firewall-cmd --permanent --remove-service=https || true firewall-cmd --reload
验证:
ss -lntp # 从允许来源探测端口 # nc -vz22 443 9100
风险边界:要把集群健康检查端口、配置下发端口、日志/监控出站依赖一起纳入“端口清单”。
2.3.14 防火墙(14/20):管理面隔离(来源 IP 白名单/跳板机)
推荐:SSH 仅允许运维网段或跳板机 IP。
firewalld rich rule 示例:
# 仅允许 10.10.0.0/16 访问 22 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.0.0/16" port port="22" protocol="tcp" accept' # 其他来源拒绝(如果 zone 默认 accept,需要显式 drop) firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" drop' firewall-cmd --reload
验证:
firewall-cmd --list-rich-rules
风险边界:多跳板、多运维网段时要确保白名单完整,否则会误伤。
2.3.15 内核参数(15/20):反欺骗与重定向关闭(sysctl)
/etc/sysctl.d/99-hardening.conf:
# 反欺骗与路由相关 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 关闭 ICMP 重定向接收/发送 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 # 禁止 source route net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0
应用与验证:
sysctl --system sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.all.accept_redirects net.ipv4.conf.all.send_redirects
回滚:删除该 sysctl 文件或恢复备份后 sysctl --system。
风险边界:
多网卡/策略路由:建议 rp_filter=2(loose),或按接口设置。
2.3.16 内核参数(16/20):SYN flood 防护与连接行为收敛
/etc/sysctl.d/99-hardening.conf 增补:
net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_synack_retries = 3 net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_fin_timeout = 15
验证:
sysctl net.ipv4.tcp_syncookies net.ipv4.tcp_max_syn_backlog
风险边界:此类参数需要结合业务连接模型与压测数据;不要在无压测情况下极端收紧。
2.3.17 内核参数(17/20):内核信息泄露与调试面收紧(ASLR/dmesg/kptr)
/etc/sysctl.d/99-hardening.conf 增补:
kernel.randomize_va_space = 2 kernel.kptr_restrict = 2 kernel.dmesg_restrict = 1 fs.suid_dumpable = 0
验证:
sysctl kernel.randomize_va_space kernel.kptr_restrict kernel.dmesg_restrict fs.suid_dumpable
风险边界:某些调试与崩溃分析需要 core dump;生产可以按需对特定服务开启,而不是全局开启。
2.3.18 文件权限(18/20):关键文件权限基线(shadow/sudoers/ssh)
推荐基线:
# 典型期望: # /etc/shadow 000/400/600 仅 root 可读 # /etc/sudoers 440 root:root # /etc/ssh/sshd_config 600 root:root chown root:root /etc/shadow /etc/gshadow /etc/sudoers /etc/ssh/sshd_config chmod 600 /etc/shadow /etc/gshadow /etc/ssh/sshd_config chmod 440 /etc/sudoers # 验证 stat -c '%a %U:%G %n' /etc/shadow /etc/gshadow /etc/sudoers /etc/ssh/sshd_config visudo -c
回滚:恢复为发行版默认权限(建议从包管理器校验:rpm -V sudo openssh-server 或 debsums)。
风险边界:
如果把 sudoers 权限设错(如 644),sudo 会拒绝工作。
2.3.19 文件权限与挂载(19/20):/tmp、/dev/shm 防护(nodev,nosuid,noexec)
推荐调整:在安全要求高的环境,把临时目录挂载选项收紧。
/etc/fstab 示例(需结合实际分区):
tmpfs /dev/shm tmpfs defaults,nodev,nosuid,noexec 0 0 tmpfs /tmp tmpfs defaults,nodev,nosuid,noexec,mode=1777 0 0
应用与验证:
mount -o remount /tmp mount -o remount /dev/shm mount | egrep ' on /tmp | on /dev/shm ' # 验证 noexec(应失败) cat > /tmp/test_exec.sh <<'EOF' #!/usr/bin/env bash echo ok EOF chmod +x /tmp/test_exec.sh /tmp/test_exec.sh || echo "noexec 生效,执行被拒绝" rm -f /tmp/test_exec.sh
回滚:移除 noexec 后 remount;若业务依赖临时执行,可只对 /dev/shm 做收紧。
风险边界:
某些语言/框架会在 /tmp 生成可执行临时文件;必须在灰度验证。
2.3.20 审计日志(20/20):auditd 关键规则 + 留存与告警阈值
推荐调整:只审计“高价值动作”,避免全量 syscalls。
/etc/audit/rules.d/hardening.rules 示例:
# 删除旧规则并设置缓冲 -D -b 8192 -f 1 # 账户与权限关键文件 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/group -p wa -k identity -w /etc/gshadow -p wa -k identity # sudoers 变更 -w /etc/sudoers -p wa -k scope -w /etc/sudoers.d/ -p wa -k scope # sshd 配置 -w /etc/ssh/sshd_config -p wa -k sshd # 特权命令执行(按需选取) -a always,exit -F arch=b64 -S execve -F euid=0 -k privileged # 时间修改 -a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change -w /etc/localtime -p wa -k time-change # 网络配置变更 -a always,exit -F arch=b64 -S sethostname,setdomainname -k system-locale -w /etc/hosts -p wa -k system-locale -w /etc/sysctl.conf -p wa -k sysctl -w /etc/sysctl.d/ -p wa -k sysctl
应用与验证:
augenrules --load 2>/dev/null || true systemctl restart auditd # 触发一次 sudoers 读取与查看近期事件 auditctl -s ausearch -k scope -ts recent | head -n 20
回滚:恢复 rules.d 目录备份并重载规则。
风险边界:
-f 1 表示审计失败时触发告警(不同策略含义不同),生产需评估;不要在磁盘不足情况下强制启用。
三、示例代码和配置
本章提供可复用的配置与脚本,目标是“配置-执行-验证-回滚”闭环。
3.1 完整配置样例:sshd_config(可按需裁剪)
# 文件位置:/etc/ssh/sshd_config Port 22 Protocol 2 PermitRootLogin no PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes AuthenticationMethods publickey AllowGroups ops wheel LogLevel VERBOSE Banner /etc/issue.net ClientAliveInterval 300 ClientAliveCountMax 2 LoginGraceTime 30 MaxAuthTries 3 MaxSessions 10 # 算法(按 OpenSSH 版本调整) KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes256-ctr MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com # 禁止转发(跳板机按需开放) AllowTcpForwarding no X11Forwarding no PermitTunnel no # 限制环境变量注入 AcceptEnv LANG LC_*
说明:
AllowGroups 会影响集中账号解析,启用前确认 getent group 正常。
禁止转发会影响部分隧道类运维方式(如 ssh -L),需要在跳板层统一规划。
3.2 完整配置样例:sysctl 加固文件
# 文件位置:/etc/sysctl.d/99-hardening.conf # 网络基础防护 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 # 反欺骗(多网卡/策略路由按需改为 2) net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # SYN 与连接行为(需要压测验证) net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_synack_retries = 3 net.ipv4.tcp_syn_retries = 5 net.ipv4.tcp_fin_timeout = 15 # 信息泄露与调试面 kernel.randomize_va_space = 2 kernel.kptr_restrict = 2 kernel.dmesg_restrict = 1 fs.suid_dumpable = 0
应用:
sysctl --system
3.3 完整配置样例:auditd 规则(关键动作审计)
# 文件位置:/etc/audit/rules.d/hardening.rules -D -b 8192 -f 1 -w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/group -p wa -k identity -w /etc/gshadow -p wa -k identity -w /etc/sudoers -p wa -k scope -w /etc/sudoers.d/ -p wa -k scope -w /etc/ssh/sshd_config -p wa -k sshd -a always,exit -F arch=b64 -S execve -F euid=0 -k privileged -a always,exit -F arch=b64 -S adjtimex,settimeofday,clock_settime -k time-change -w /etc/localtime -p wa -k time-change -w /etc/sysctl.conf -p wa -k sysctl -w /etc/sysctl.d/ -p wa -k sysctl
验证:
augenrules --load 2>/dev/null || true systemctl restart auditd ausearch -k identity -ts recent | head
3.4 脚本一:快速采集加固证据(适合工单/复盘留档)
#!/usr/bin/env bash
set -euo pipefail
# 文件名:collect-hardening-evidence.sh
# 作用:采集主机加固相关证据与关键配置
# 适用场景:变更前对比、变更后留档、审计抽查
# 使用方法:sudo bash collect-hardening-evidence.sh /tmp/hardening-evidence
# 输入参数:输出目录
# 输出结果:在输出目录生成多个文本文件
# 风险提示:只读采集,风险低
OUT_DIR="${1:-/tmp/hardening-evidence}"
mkdir -p "$OUT_DIR"
{
echo"== time =="; date -Is
echo
echo"== os =="; cat /etc/os-release 2>/dev/null || true
echo
echo"== kernel =="; uname -a
echo
echo"== sshd -T (selected) =="; sshd -T 2>/dev/null | egrep -i 'port|permitrootlogin|passwordauthentication|pubkeyauthentication|authenticationmethods|allowusers|allowgroups|loglevel|clientaliveinterval|ciphers|macs|kexalgorithms' || true
echo
echo"== listening ports =="; ss -lntp
echo
echo"== firewall ==";
ifcommand -v firewall-cmd >/dev/null; then firewall-cmd --state && firewall-cmd --get-default-zone && firewall-cmd --list-all; fi
ifcommand -v nft >/dev/null; then nft list ruleset | head -n 200; fi
ifcommand -v iptables >/dev/null; then iptables -S; fi
echo
echo"== sysctl (selected) =="; sysctl -a 2>/dev/null | egrep 'rp_filter|accept_redirects|send_redirects|accept_source_route|tcp_syncookies|randomize_va_space|kptr_restrict|dmesg_restrict|fs.suid_dumpable' | sort
echo
echo"== critical file perms =="; stat -c '%a %U:%G %n' /etc/passwd /etc/shadow /etc/gshadow /etc/sudoers /etc/ssh/sshd_config 2>/dev/null || true
echo
echo"== auditd =="; systemctl is-active auditd 2>/dev/null || true; auditctl -s 2>/dev/null || true
} | tee "$OUT_DIR/summary.txt" >/dev/null
# 单独保存配置文件(若存在)
cp -a /etc/ssh/sshd_config "$OUT_DIR/" 2>/dev/null || true
cp -a /etc/sysctl.conf "$OUT_DIR/" 2>/dev/null || true
cp -a /etc/sysctl.d "$OUT_DIR/" 2>/dev/null || true
cp -a /etc/audit/rules.d "$OUT_DIR/" 2>/dev/null || true
echo"Evidence collected in: $OUT_DIR"
3.5 脚本二:加固前自动备份(强烈建议每次变更先跑)
#!/usr/bin/env bash
set -euo pipefail
# 文件名:backup-hardening-configs.sh
# 作用:对关键配置进行时间戳备份
# 适用场景:任何加固/变更前
# 使用方法:sudo bash backup-hardening-configs.sh /var/backups/hardening
# 输入参数:备份根目录
# 输出结果:创建一个带时间戳的备份目录
# 风险提示:只读复制,风险低
BACKUP_ROOT="${1:-/var/backups/hardening}"
TS="$(date +%Y%m%d-%H%M%S)"
DST="$BACKUP_ROOT/$TS"
mkdir -p "$DST"
copy_if_exists() {
local p="$1"
if [ -e "$p" ]; then
mkdir -p "$DST$(dirname "$p")"
cp -a "$p""$DST$p"
fi
}
copy_if_exists /etc/ssh/sshd_config
copy_if_exists /etc/login.defs
copy_if_exists /etc/security/pwquality.conf
copy_if_exists /etc/pam.d
copy_if_exists /etc/sudoers
copy_if_exists /etc/sudoers.d
copy_if_exists /etc/sysctl.conf
copy_if_exists /etc/sysctl.d
copy_if_exists /etc/fstab
copy_if_exists /etc/audit/auditd.conf
copy_if_exists /etc/audit/rules.d
printf'Backup created: %s
'"$DST"
3.6 脚本三:加固变更验证(集中跑一遍,避免遗漏)
#!/usr/bin/env bash
set -euo pipefail
# 文件名:verify-hardening.sh
# 作用:对关键加固项做一致性检查与输出
# 适用场景:变更后自检、上线前检查
# 使用方法:sudo bash verify-hardening.sh
# 输入参数:无
# 输出结果:标准输出,便于工单留存
# 风险提示:只读检查,风险低
fail=0
check() {
local name="$1"; shift
echo"[CHECK] $name"
if"$@"; then
echo" PASS"
else
echo" FAIL"
fail=1
fi
}
# sshd 语法
check "sshd config syntax" sshd -t
# sshd 关键项
check "sshd: PermitRootLogin is no" bash -lc "sshd -T | grep -qi '^permitrootlogin no$'"
check "sshd: PasswordAuthentication is no" bash -lc "sshd -T | grep -qi '^passwordauthentication no$'"
# 防火墙状态(若使用 firewalld)
ifcommand -v firewall-cmd >/dev/null; then
check "firewalld running" firewall-cmd --state
fi
# sysctl 关键项
check "sysctl: accept_redirects=0" bash -lc "sysctl -n net.ipv4.conf.all.accept_redirects | grep -qx '0'"
check "sysctl: send_redirects=0" bash -lc "sysctl -n net.ipv4.conf.all.send_redirects | grep -qx '0'"
# 关键文件权限
check "/etc/shadow perms" bash -lc "stat -c '%a' /etc/shadow 2>/dev/null | egrep -qx '400|000|600'"
check "/etc/sudoers perms" bash -lc "stat -c '%a' /etc/sudoers 2>/dev/null | grep -qx '440'"
# auditd
if systemctl is-active auditd >/dev/null 2>&1; then
echo"[INFO] auditd active"
auditctl -s || true
else
echo"[WARN] auditd not active"
fi
exit"$fail"
3.7 脚本四:一键回滚(从备份目录恢复关键文件)
#!/usr/bin/env bash
set -euo pipefail
# 文件名:rollback-hardening.sh
# 作用:从备份目录回滚关键配置
# 适用场景:误改导致登录/业务异常,需要快速恢复
# 使用方法:sudo bash rollback-hardening.sh /var/backups/hardening/20260101-010101
# 输入参数:备份目录(由 backup-hardening-configs.sh 生成)
# 输出结果:恢复配置并提示下一步
# 风险提示:会覆盖系统配置,需在控制台/带外通道可用时操作
SRC="https://www.elecfans.com/images/chaijie_default.png"
restore_if_exists() {
local p="$1"
if [ -e "$SRC$p" ]; then
mkdir -p "$(dirname "$p")"
cp -a "$SRC$p""$p"
echo"restored: $p"
fi
}
restore_if_exists /etc/ssh/sshd_config
restore_if_exists /etc/login.defs
restore_if_exists /etc/security/pwquality.conf
restore_if_exists /etc/pam.d
restore_if_exists /etc/sudoers
restore_if_exists /etc/sudoers.d
restore_if_exists /etc/sysctl.conf
restore_if_exists /etc/sysctl.d
restore_if_exists /etc/fstab
restore_if_exists /etc/audit/auditd.conf
restore_if_exists /etc/audit/rules.d
echo"Reloading services (best-effort) ..."
systemctl reload sshd 2>/dev/null || true
sysctl --system 2>/dev/null || true
systemctl restart auditd 2>/dev/null || true
echo"Rollback done. Re-test SSH/sudo and service health."
3.8 脚本五:审计日志归桶(按关键事件分桶,便于排障/复盘)
#!/usr/bin/env bash
set -euo pipefail
# 文件名:bucket-security-logs.sh
# 作用:把常见安全事件从日志中归桶:SSH失败、sudo、用户变更、审计关键 key
# 适用场景:安全事件排查、审计抽查、事故复盘
# 使用方法:sudo bash bucket-security-logs.sh /var/log /tmp/sec-buckets
# 输入参数:日志目录、输出目录
# 输出结果:在输出目录生成多类事件文件
# 风险提示:只读读取日志,风险低
LOG_DIR="${1:-/var/log}"
OUT_DIR="${2:-/tmp/sec-buckets}"
mkdir -p "$OUT_DIR"
AUTH_LOG=""
if [ -f "$LOG_DIR/auth.log" ]; then AUTH_LOG="$LOG_DIR/auth.log"; fi
if [ -f "$LOG_DIR/secure" ]; then AUTH_LOG="$LOG_DIR/secure"; fi
if [ -n "$AUTH_LOG" ]; then
egrep -i 'Failed password|Invalid user|authentication failure'"$AUTH_LOG" | tail -n 2000 > "$OUT_DIR/ssh_failed.log" || true
egrep -i 'sudo:'"$AUTH_LOG" | tail -n 2000 > "$OUT_DIR/sudo.log" || true
egrep -i 'useradd|usermod|passwd[|chage'"$AUTH_LOG" | tail -n 2000 > "$OUT_DIR/account_change.log" || true
fi
AUDIT_LOG="$LOG_DIR/audit/audit.log"
if [ -f "$AUDIT_LOG" ]; then
egrep ' key=(identity|scope|sshd|privileged|sysctl|time-change)'"$AUDIT_LOG" | tail -n 5000 > "$OUT_DIR/audit_key_events.log" || true
fi
echo"Buckets written to: $OUT_DIR"
四、实际应用案例(4个生产环境加固案例)
案例以“现象→判断→下钻→证据→根因→修复→验证→防再发”组织,并给出可复用检查点。
4.1 案例一:互联网跳板机遭遇 SSH 爆破(从告警到闭环)
4.1.1 现场现象
SIEM 告警:短时间大量 SSH 登录失败。
跳板机 CPU 升高,sshd 进程频繁。
4.1.2 第一轮判断
先确认是否为外部爆破与来源集中:
# 统计失败来源 IP(示例:auth.log)
awk '/Failed password/ {print $(NF-3)}' /var/log/auth.log | sort | uniq -c | sort -nr | head
# 当前连接
ss -tn state established '( sport = :22 )' | head
4.1.3 第二轮下钻
核对 sshd 是否允许口令登录、是否开启失败锁定:
sshd -T | egrep -i 'passwordauthentication|permitrootlogin|loglevel' command -v faillock >/dev/null && faillock --user <被攻击账号> || true
4.1.4 关键证据
日志片段示例(/var/log/auth.log):
Mar 11 1001 bastion sshd[12345]: Failed password for invalid user admin from 203.0.113.10 port 51234 ssh2 Mar 11 1003 bastion sshd[12346]: Failed password for root from 203.0.113.10 port 51288 ssh2
4.1.5 根因
跳板机对公网暴露 22,且启用了 PasswordAuthentication yes,缺少来源白名单与失败锁定,导致爆破成本极低。
4.1.6 修复动作
立即止血:防火墙限制 SSH 来源到运维网段。
长期修复:关闭口令登录,强制公钥;启用失败锁定;收紧 MaxAuthTries。
4.1.7 修复后验证
# 验证只有白名单能访问 22 firewall-cmd --list-rich-rules # 验证口令关闭 sshd -T | grep -i '^passwordauthentication no$' # 观察 30 分钟失败次数是否明显下降 # 可结合日志或指标统计
4.1.8 防再发建议
把“跳板机必须白名单 + 禁止口令 + 失败锁定”做成上线门禁。
接入集中日志与告警(第 6 章给出规则模板)。
4.2 案例二:内网业务机加固后服务异常(rp_filter 误伤回包)
4.2.1 现场现象
变更后:业务间歇性超时,重试可恢复。
应用日志无明显错误,但请求链路出现丢包。
4.2.2 第一轮判断
先确认是否网络层丢包与路由异常:
ip a ip route sysctl net.ipv4.conf.all.rp_filter
4.2.3 第二轮下钻
该主机存在多网卡与策略路由,严格反向路径校验会丢弃“非对称路由回包”。
抓取内核丢包统计(示意):
dmesg | tail -n 50 nstat -az | egrep 'IpInNoRoutes|IpInDiscards|TcpExtTCPAbortOnMemory'
4.2.4 关键证据
rp_filter=1(strict)在策略路由主机触发回包丢弃。
4.2.5 根因
把通用加固配置“无差别”套到了多网卡/策略路由主机。
4.2.6 修复动作
将 rp_filter 调整为 2(loose)或按接口定向配置。
sysctl -w net.ipv4.conf.all.rp_filter=2 sysctl -w net.ipv4.conf.default.rp_filter=2 # 固化到 sysctl 文件 sed -i 's/net.ipv4.conf.all.rp_filter = 1/net.ipv4.conf.all.rp_filter = 2/' /etc/sysctl.d/99-hardening.conf sed -i 's/net.ipv4.conf.default.rp_filter = 1/net.ipv4.conf.default.rp_filter = 2/' /etc/sysctl.d/99-hardening.conf sysctl --system
4.2.7 修复后验证
观察业务超时是否消失。
指标侧:P99 延迟回落、超时率下降(第 6 章给出指标表)。
4.2.8 防再发建议
加固要“按角色模板化”:单网卡业务机 vs 多网卡网关/容器节点必须分模板。
4.3 案例三:/tmp noexec 导致发布脚本失败(加固与可用性冲突)
4.3.1 现场现象
发布失败,错误提示“Permission denied”。
回滚发布也失败。
4.3.2 第一轮判断
快速确认是否为挂载选项导致:
mount | grep ' on /tmp ' # 尝试在 /tmp 执行最小脚本 printf '#!/bin/sh echo ok ' > /tmp/x && chmod +x /tmp/x && /tmp/x
4.3.3 第二轮下钻
发布工具把临时执行文件放在 /tmp,noexec 会拒绝执行。
4.3.4 关键证据
mount 显示 /tmp 具备 noexec。
4.3.5 根因
没有对发布链路做灰度验证就强制启用 /tmp noexec。
4.3.6 修复动作
两种稳妥做法:
临时回滚 /tmp 的 noexec;
更推荐:发布工具改用应用专用目录(如 /var/lib/app/tmp),并只对 /dev/shm 做 noexec。
4.3.7 修复后验证
发布成功率恢复。
/tmp 不再作为可执行临时目录或仅在白名单机器启用。
4.3.8 防再发建议
把 /tmp noexec 纳入“需要业务验证的高风险加固项”,统一灰度策略。
4.4 案例四:审计规则过量导致磁盘告警(审计要可持续)
4.4.1 现场现象
/var 使用率快速上涨。
auditd 日志每小时数 GB。
4.4.2 第一轮判断
du -sh /var/log/* | sort -h | tail wc -l /var/log/audit/audit.log auditctl -l | wc -l
4.4.3 第二轮下钻
发现审计规则包含大量 syscalls 全量记录,并且没有有效轮转策略。
4.4.4 关键证据
auditctl -l 输出规则数量异常大。
ausearch 查询显示大量无价值事件。
4.4.5 根因
把“审计=全量记录”当作安全,忽略可持续性。
4.4.6 修复动作
收敛为关键规则(第 2.3.20)。
配置 logrotate 或 auditd 的 max_log_file 与 rotate。
/etc/audit/auditd.conf 关键项示例:
max_log_file = 50 num_logs = 10 max_log_file_action = ROTATE space_left = 500 space_left_action = SYSLOG admin_space_left = 200 admin_space_left_action = SUSPEND
4.4.7 修复后验证
观察 24 小时日志增长曲线回归平稳。
告警阈值(见第 6 章)不再频繁触发。
4.4.8 防再发建议
审计规则纳入容量评估:以“每秒事件数”“每日增量”作为上线门槛。
五、最佳实践和注意事项
5.1 最佳实践(可执行版)
变更前必须备份:先跑 backup-hardening-configs.sh,保证任何时候可回滚。
始终保留带外/控制台通道:涉及 SSH、sudo 的变更必须保证有控制台可用。
按主机角色分模板:跳板机、业务机、容器节点、网关节点的加固项不同。
安全项也要压测与灰度:sysctl 与挂载选项对网络/性能影响不可忽略。
最小暴露面优先:先做来源白名单与端口收敛,再做复杂审计。
审计要“可持续”:关键事件优先,容量阈值与轮转必须到位。
5.2 注意事项(高频踩坑点)
禁用口令前必须验证密钥登录链路(至少两人/两把密钥)。
AllowGroups/AllowUsers 配合 LDAP/SSSD 时要验证解析链路,否则会误封。
防火墙规则要包含:业务端口、探活端口、监控端口、配置同步端口、必要出站。
rp_filter 与多网卡/策略路由冲突高,必须按角色模板。
5.3 常见错误清单(适合做变更门禁)
| 错误动作 | 为什么危险 | 更稳的做法 |
|---|---|---|
| 直接在生产全量改 sshd | 误伤会导致大面积失联 | 先灰度 1-2 台 + 预案演练 |
| sysctl 一把梭且无压测 | 网络/性能问题难归因 | 逐项启用 + 指标对照 |
| audit 全量记录 | 爆盘、性能下降 | 关键事件审计 + 阈值告警 |
| sudo 给 ALL 或 bash | 直接权限逃逸 | 命令级白名单 + use_pty + logfile |
六、故障排查和监控(安全事件监控、审计规则)
6.1 关键指标(建议纳入监控看板)
| 指标名称 | 正常范围 | 告警阈值 | 说明 |
|---|---|---|---|
| SSH 登录失败次数(每分钟) | 0-少量 | > 20/min(按环境) | 爆破/凭据攻击信号 |
| SSH 登录成功次数(非工作时间) | 0 | > 0 | 异常时间窗口登录 |
| sudo 使用次数(按用户/主机) | 低频 | 突增 | 提权操作异常 |
| audit 日志增长(MB/h) | 稳定 | 突增 | 规则过量或异常行为 |
| /var 分区使用率 | < 70% | > 85% | 防止日志爆盘 |
| 防火墙丢包/拒绝计数 | 稳定 | 突增 | 误封或扫描攻击 |
6.2 日志与审计的排障命令链
# SSH 失败与成功 if [ -f /var/log/auth.log ]; then egrep -i 'Failed password|Accepted publickey|Accepted password' /var/log/auth.log | tail -n 200 fi if [ -f /var/log/secure ]; then egrep -i 'Failed password|Accepted publickey|Accepted password|sudo:' /var/log/secure | tail -n 200 fi # 审计关键 key ausearch -k identity -ts today | tail -n 50 ausearch -k scope -ts today | tail -n 50 ausearch -k privileged -ts today | tail -n 50 # 最近 1 小时的 sudo 日志(如果启用) tail -n 200 /var/log/sudo.log 2>/dev/null || true
6.3 告警规则模板(Prometheus/Alertmanager 思路)
说明:主机侧需要把日志转指标(如 promtail + loki、或 node_exporter textfile、或 auditd exporter)。以下用“伪规则”表达核心口径。
# 规则名:HostSSHBurstFailures
# 指标前提:将 SSH 失败日志聚合为计数指标 ssh_login_failed_total
alert: HostSSHBurstFailures
expr: rate(ssh_login_failed_total[5m]) > 0.3
for: 10m
labels:
severity: warning
annotations:
summary: "SSH failures burst on {{ $labels.instance }}"
description: "High rate of SSH failed logins,可能存在爆破或异常扫描"
# 规则名:AuditLogGrowthTooFast
# 指标前提:采集 /var/log/audit/audit.log 文件大小为 audit_log_bytes
alert: AuditLogGrowthTooFast
expr: (audit_log_bytes - audit_log_bytes offset 1h) / 1024 / 1024 > 500
for: 30m
labels:
severity: warning
annotations:
summary: "audit log growth too fast on {{ $labels.instance }}"
description: "audit 日志 1 小时增长超过阈值,可能规则过量或异常行为"
6.4 修复后验证(回归动作清单)
# 1) SSH 配置校验 sshd -t systemctl reload sshd # 2) 从白名单来源登录验证(至少公钥 + sudo) # ssh user@host # sudo -l # 3) 防火墙规则校验 command -v firewall-cmd >/dev/null && firewall-cmd --list-all # 4) 审计规则生效 auditctl -s ausearch -k sshd -ts recent | head -n 10 # 5) 观察 30-60 分钟指标(失败次数、磁盘增长) # 结合监控平台确认曲线回落
七、总结
7.1 技术要点回顾(可执行)
主机加固必须是“可回滚”的工程实践,而不是一次性手工改配置。
SSH 优先做来源隔离与密钥化,再做算法收紧。
账号安全的核心是:强口令/锁定/最小可登录账号 + sudo 最小权限。
防火墙要以“端口清单”为输入,包含探活与监控,避免误伤。
sysctl 与挂载选项属于“高影响项”,必须按主机角色模板化。
auditd 的价值在“关键事件可追溯”,不是“全量记录”。
任何加固项都需要明确验证命令链与监控指标,否则无法闭环。
7.2 进阶学习方向
OpenSSH 证书登录与集中密钥管理:解决大规模密钥分发与撤销问题。
主机基线自动化:Ansible/OSQuery/SCAP 等实现持续合规。
审计到 SIEM:把 audit/journald 与告警联动,形成响应闭环。
零信任与访问代理:把 SSH 入口迁移到统一访问层,实现强审计与策略化。
7.3 参考资料
CIS Benchmarks - 各发行版安全基线对照
OpenSSH Manual Pages - sshd_config 官方参数说明
Linux Audit Documentation - auditd 规则与实践
附录
A. 命令速查表(加固/验证常用)
sshd -t # 校验 sshd_config 语法 sshd -T # 展开生效配置(含 include) ss -lntp # 查看监听端口 firewall-cmd --list-all # 查看 firewalld zone 规则 nft list ruleset # 查看 nftables 规则集 sysctl --system # 加载 sysctl.d 配置 stat -c '%a %U:%G %n' FILE # 查看权限 visudo -c # 校验 sudoers 语法 auditctl -s # 查看 audit 状态 ausearch -k KEY -ts recent # 按 key 查询审计事件 journalctl --disk-usage # 查看 journald 占用
B. 参数详解(挑关键的讲边界)
| 参数 | 推荐值 | 作用 | 风险边界 |
|---|---|---|---|
| PasswordAuthentication | no | 关闭口令登录 | 必须先验证公钥链路 |
| PermitRootLogin | no | 禁止 root 直接登录 | 需确保 sudo 入口可用 |
| AllowGroups | ops/wheel | 限制可登录组 | 需验证 LDAP/SSSD 解析 |
| rp_filter | 1(单网卡)/2(多网卡) | 反向路径校验 | 策略路由慎用 strict |
| /tmp noexec | 按需启用 | 阻断临时执行提权 | 可能影响发布/安装 |
| audit -b | 8192 | 审计缓冲 | 过大占内存,过小丢事件 |
C. CIS 基线对照(示例映射表)
| 本文加固项 | CIS 常见条目方向(概念对应) | 备注 |
|---|---|---|
| SSH 禁止 root 登录 | SSH Server Configuration | 发行版条目编号不同 |
| SSH 禁止口令登录 | SSH Server Configuration | 需结合运维体系 |
| 口令复杂度/有效期 | Password Policies | 建议与 IAM 统一 |
| 失败锁定 | Account Lockout | 注意值班风险 |
| sudo 最小权限与日志 | Privilege Escalation | 强烈建议启用 |
| sysctl 关闭 redirect/source_route | Network Configuration | 多网卡需评估 |
| /tmp 挂载收紧 | Filesystem Configuration | 影响兼容性 |
| auditd 关键规则 | Audit Configuration | 需配合容量与告警 |
全部0条评论
快来发表一下你的评论吧 !