内核与系统安全加固

共 21 题
📑 题目列表 21 题
#
★★★

1. sshd_config 中 AllowTcpForwarding 如何控制 SSH 端口转发权限?

sshd_config 中的 AllowTcpForwarding 如何控制 SSH 端口转发?为什么"no"仍是推荐的安全配置,与 PermitOpen、GatewayPorts 如何配合?

  • 三种取值:yes/no/local(仅本地转发)/remote(仅远程转发)
  • 端口转发被滥用的风险(隧道穿透、代理跳板)
  • 与 PermitOpen 白名单、GatewayPorts 的配合

AllowTcpForwarding 控制 SSH 会话是否允许端口转发:yes 允许本地(-L)与远程(-R)转发;no 全部禁止;local 仅允许本地转发;remote 仅允许远程转发。安全视角:端口转发把 SSH 通道变成任意 TCP 隧道,是穿透防火墙、访问隔离网络、搭建跳板代理的常用手段——一旦账户泄露或业务被滥用,攻击者可通过转发进入内网任意目标,因此生产环境默认推荐 no(除非明确需要隧道场景)。注意:即使 no,SFTP 会话本身的流量不受影响(它是通道内部协议),且 no 不影响已认证用户使用 X11 转发(由 X11Forwarding 单独控制)。

配合参数:PermitOpen 可指定允许转发的目标白名单(如 PermitOpen 127.0.0.1:3306,仅允许转发到本地 MySQL),比整体 yes 更精细;GatewayPorts 控制远程转发是否绑定到所有接口(yes 会暴露到外部网络,风险更大,默认 no)。最小权限实践:能 no 则 no,确需转发时用 PermitOpen 收窄目标,并在防火墙层面同步限制;变更后需重启 sshd 或重载配置生效。

本题考察 SSH 隧道功能的安全治理。回答要点:三种取值语义、端口转发被滥用的风险与推荐 no 的理由、PermitOpen/GatewayPorts 的配合收窄方法,体现"默认最小化 + 按需开放"的安全配置思路。

# /etc/ssh/sshd_config
AllowTcpForwarding no
PermitOpen 127.0.0.1:3306
GatewayPorts no
sshd -t && systemctl reload sshd
#
★★★

2. sshd_config 中 AllowUsers、AllowGroups 如何限制 SSH 登录用户与组?

sshd_config 中 AllowUsers 与 AllowGroups 如何限制 SSH 登录?它们的匹配语义与运维注意点是什么?

  • AllowUsers/AllowGroups 的白名单语义与多值语法
  • 与 DenyUsers/DenyGroups 的优先级(Allow 白名单强约束,Deny 名单内用户优先被拒)
  • 匹配粒度(user@host)、影响范围(含 sshd 子系统的登录)

AllowUsers 与 AllowGroups 是 sshd 的登录白名单:列出允许登录的用户或组(空格分隔,如 AllowUsers alice bob@10.0.0.1,支持 user@host 形式限定来源),未列出的用户一律拒绝;AllowGroups 按主组/附加组匹配(组成员即可)。DenyUsers/DenyGroups 是黑名单。优先级语义:OpenSSH 按 DenyUsers、AllowUsers、DenyGroups、AllowGroups 的顺序依次检查;若配置了 Allow 白名单,未列出的用户一律拒绝(白名单强约束);同时配置 Allow 与 Deny 时,Deny 名单内的用户即使符合 Allow 也会被拒。

运维注意:配置错误可能导致所有用户无法 SSH 登录(生产事故高发点)——修改后务必先另开会话或保持现有连接,用 sshd -t 校验语法,再重载;AllowUsers 匹配的是登录用户名(含远程执行命令的非交互登录),影响 scp/sftp/rsync 等所有 sshd 登录通道;锁定管理员账户时应同时检查 PAM(如 /etc/security/access.conf、pam_access)与 Allow* 的叠加效果。批量管理时可用组代替用户清单(AllowGroups ops),减少维护成本。

本题考察 SSH 登录访问控制的配置治理。回答要点:Allow 白名单与 Deny 黑名单的优先级语义、user@host 与组的匹配粒度、以及"配置后锁死登录"事故的预防流程(语法校验、保留会话),体现安全配置的运维严谨性。

# /etc/ssh/sshd_config
AllowUsers alice bob@10.0.0.1
AllowGroups ops
DenyUsers root
sshd -t                    # 校验语法
systemctl reload sshd
#
★★★

3. sshd_config 中 AuthorizedKeysCommand 如何从外部命令获取授权密钥?

AuthorizedKeysCommand 如何从外部命令动态获取 SSH 授权密钥?它的使用场景、配置要求与安全注意点是什么?

  • 动态获取授权密钥的场景(LDAP/CMDB 统一管理、短效密钥)
  • AuthorizedKeysCommand/User 与 AuthorizedKeysFile 的配合
  • 安全要求:命令须绝对路径、属主为 root、UsePAM 与权限校验

默认 sshd 从 ~/.ssh/authorized_keys 读取公钥;AuthorizedKeysCommand 允许指定一个外部命令(如查询 LDAP/CMDB/密钥管理系统的脚本),在登录时执行并从其标准输出获取授权密钥,适合"密钥集中管理、用户列表动态变化、短效/一次性密钥"的场景。配置要点:命令必须是绝对路径;AuthorizedKeysCommandUser 指定执行该命令的系统用户(官方建议专用低权限用户而非 root,防止命令输出被伪造);与 AuthorizedKeysFile 可以共存(默认先查文件再查命令,实际按配置顺序);命令输出格式与 authorized_keys 文件一致(每行一个 key,可带 options 前缀)。sshd 对命令的输出有大小限制(超过 64KB 拒绝)。

安全注意:命令可执行任何逻辑,等于把"谁能登录"的判定权交给脚本——脚本必须严格校验输入(用户名转义、仅返回该用户密钥,防止命令注入与越权返回他人密钥);生产建议:命令返回密钥后再在 sshd_config 层面叠加 AllowUsers 等白名单;调试时看 sshd 日志(LogLevel VERBOSE)确认命令执行与密钥匹配结果;密钥管理变更(轮换/吊销)后需注意缓存策略与超时(有的实现用 sshd_config 的 AuthorizedKeysCommandUser 配合 sshd 缓存的 pubkey 过期)。注意该功能需要 sshd 编译时启用(多数发行版默认开启),且不影响密钥认证本身的其他策略(如 PubkeyAuthentication)。

本题考察 SSH 密钥管理的扩展机制。回答要点:动态密钥源的适用场景、配置项(Command/User/File 配合)与输出格式要求、脚本安全(防注入、防越权返回)与日志调试方法,体现对"认证数据外部化"的安全工程理解。

# /etc/ssh/sshd_config
AuthorizedKeysCommand /usr/local/bin/ssh-keys-ldap
AuthorizedKeysCommandUser sshkeys
AuthorizedKeysFile .ssh/authorized_keys
# 脚本输出示例(每行一个公钥)
ssh-rsa AAAAB3NzaC1yc2E... user@ldap
#
★★★

4. sshd_config 中 MaxStartups 如何限制并发未认证连接数?

sshd_config 中 MaxStartups 如何限制并发未认证连接?其三段式语法与防暴力破解的作用是什么?

  • MaxStartups 语法:start:rate:full 三段式(阈值、丢弃概率、硬上限)
  • 与防暴力破解、登录风暴的关系
  • 与 LoginGraceTime、MaxSessions 的配合

MaxStartups 限制 sshd 同时存在的"未完成认证"连接数,语法 MaxStartups start:rate:full(如 10:30:100):并发未认证连接数低于 start 时全部接受;超过 start 后按 rate% 概率丢弃新连接(rate 是百分比概率,数字越大丢弃概率越高);达到 full 后全部拒绝(超出部分直接断开)。默认 10:30:100。作用是防登录风暴与暴力破解:攻击者并发建立大量 SSH 连接尝试爆破时,该参数限制认证阶段的并发量,配合 LoginGraceTime(单连接认证超时,默认 120 秒,超时断开)防止连接被长期占用;但注意它只限制"未认证"阶段,已认证会话由 MaxSessions(每个网络连接允许的会话数,默认 10)与系统进程数限制约束。

调优注意:设太小会误伤正常批量登录(如运维脚本并发 ssh 较多时被概率丢弃),需结合运维模式设置;暴力破解的对抗还应叠加 fail2ban/sshd 限速、禁用密码登录(PasswordAuthentication no)、密钥认证与 AllowUsers 白名单——MaxStartups 只是纵深防御的一环。观测:ss -tn state syn-recv 与 sshd 日志("too many connections")确认是否触发上限。

本题考察 sshd 并发保护参数的机制。回答要点:三段式(start 阈值、rate 概率丢弃、full 硬拒)的准确语义、与 LoginGraceTime/MaxSessions 的分工(认证前/认证中/认证后)、以及作为防爆破纵深一环的定位,体现对登录风暴治理的整体理解。

# /etc/ssh/sshd_config
MaxStartups 10:30:100
LoginGraceTime 60
MaxSessions 10
sshd -T | grep -E "maxstartups|maxsessions"
#
★★★

5. sshd_config 中 StreamLocalBindMask 如何设置 Unix socket 文件的权限?

sshd_config 中 StreamLocalBindMask 的作用是什么?它如何影响 SSH Unix socket 转发的文件权限?

  • StreamLocalBindMask 的八进制权限掩码语义(默认 0177)
  • 对 ~/.ssh 目录下 socket 文件权限的影响
  • 与 StreamLocalBindUnlink 的配合及安全意义

SSH 支持 Unix domain socket 转发(如 ssh -L /tmp/mysql.sock:/var/run/mysql.sock user@host,把远端 socket 转发到本地 socket 路径),sshd 创建本地 socket 文件时的权限由 StreamLocalBindMask 控制,默认 0177(即所有者读写执行,组与其他无任何权限,等价 0700 的效果),保证 socket 文件仅对当前用户可见。八进制掩码按"与"(AND)作用于默认 0777 权限,0177 实际得到 0700,这是最小暴露的默认值。若改为 0777 则任何本地用户都能连接该 socket,可能泄露转发目标的服务数据(如数据库 socket),因此生产推荐保持默认或更严。

配合参数:StreamLocalBindUnlink 控制在转发结束后是否删除残留 socket 文件(默认 no 会保留陈旧文件导致下次转发失败,设为 yes 自动清理更顺滑);注意掩码只影响文件权限位,不影响监听行为与认证。排障:socket 转发失败先检查目标 socket 存在性、目录可写性与掩码后的实际权限(ls -l),ssh -v 输出可看转发建立过程。

本题考察 SSH socket 转发的文件权限机制。回答要点:掩码按 AND 作用于默认权限的计算方式(0177→0700)、最小暴露的安全意义、与 StreamLocalBindUnlink 的配合,体现对 SSH 高级转发功能的精细控制。

# /etc/ssh/sshd_config
StreamLocalBindMask 0177
StreamLocalBindUnlink yes
# 转发示例:本地 socket -> 远端 socket
ssh -L /tmp/mysql.sock:/var/run/mysqld/mysqld.sock user@host
ls -l /tmp/mysql.sock
#
★★★

6. 内核安全加固中 KASLR、SMEP/SMAP、seccomp 与 LSM 如何配置?

KASLR、SMEP/SMAP、seccomp 与 LSM 分别在内核安全加固中起什么作用?它们如何形成纵深防御体系?

  • KASLR:内核地址空间随机化,对抗内核漏洞利用
  • SMEP/SMAP:禁止内核执行/访问用户页,阻断 ROP 与 ret2usr
  • seccomp:系统调用过滤,收缩攻击面;LSM:访问控制框架(SELinux/AppArmor)

四个机制从不同层次加固内核:KASLR(内核地址随机化)随机化内核基址与布局,使内核漏洞利用需要先泄露地址(泄漏后仍可绕过,属于"增加难度"层);SMEP(禁止内核执行用户空间页)与 SMAP(禁止内核访问用户空间页)是 CPU 特性配合内核启用:即使攻击者劫持控制流,也无法直接执行/读写用户态 payload,强制走 ROP 等复杂路径;seccomp 在系统调用层做白名单/黑名单过滤(seccomp-bpf 可按参数过滤),把进程可用 syscall 收缩到最小集,直接消灭"利用某个 syscall 提权"的攻击面;LSM(Linux Security Module)提供访问控制框架,SELinux/AppArmor 等模块以强制访问控制(MAC)约束进程对文件、网络、能力的访问,即使进程被攻破也难越权。

纵深体系理解:KASLR 提高利用门槛 → SMEP/SMAP 阻断经典 ret2usr/ROP → seccomp 收缩调用面 → LSM 做进程级能力边界,配合只读文件系统、能力(capabilities)裁剪与用户命名空间限制,构成"漏洞利用越深、约束越严"的多层防线。运维落地点:确认 CPU/内核特性开启(grep smep /proc/cpuinfo、dmesg 看 KASLR)、容器运行时默认 seccomp profile(Docker 默认 Default 模式)、SELinux 策略放行与应用适配,四者缺一不可但各有侧重,需按威胁模型选择加固组合。

本题考察内核安全加固的机制全貌。回答要点:四个机制各自的原理(随机化/页权限隔离/syscall 过滤/强制访问控制)与作用层次、互相补充的纵深逻辑、以及运维侧如何确认与落地(CPU 特性、容器 seccomp、SELinux 策略),体现体系化安全视角。

grep -wE "smep|smap" /proc/cpuinfo | head -1     # CPU 特性确认
dmesg | grep -i "KASLR"
docker run --security-opt seccomp=default.json --rm alpine uname -a
sestatus                                   # SELinux 状态
#
★★★

7. SELinux 与 AppArmor 的 enforcing/permissive 模式差异,生产环境如何从宽容模式平滑切换并验证策略

SELinux 与 AppArmor 的 enforcing 与 permissive 模式有什么区别?生产环境如何从宽容模式平滑切换并验证策略?

  • enforcing/permissive/disabled 三态语义与审计行为差异
  • 切换路径:permissive 收集 AVC 日志 → 生成/调整策略 → 逐步 enforcing
  • 验证手段:ausearch/audit2why、policy 分析、灰度节点

SELinux 与 AppArmor 是两大 LSM 实现,共有的模式语义:enforcing(强制)下违反策略的访问被拒绝并记录;permissive(宽容)下允许访问但完整记录违规(SELinux 记 AVC 日志,AppArmor 记 apparmor= 审计行),用于策略开发与验证;disabled 完全关闭(SELinux 需重启才能从 disabled 切回,AppArmor 可运行时切换 profile)。enforcing 与 permissive 可运行时切换(setenforce 0/1、aa-enforce/aa-complain),是平滑迁移的基础。差异点:SELinux 按主体/客体类型与安全上下文做细粒度 MAC(类型强制),策略复杂、学习曲线陡;AppArmor 按路径规则绑定进程 profile,规则直观、适配快,适合单一应用加固。

平滑切换流程:先在 permissive 模式跑一段业务周期,用 ausearch(SELinux)或 auditd 日志收集所有违规事件,audit2allow/audit2why 分析生成策略补丁(audit2allow -M 生成模块、semodule 安装);确认策略覆盖业务全部路径后,在灰度节点切换 enforcing 观察:无新增 AVC、服务功能正常、错误率无变化;再逐步推广。验证手段:getenforce/setenforcesestatus -vausearch -m avc -ts recentsealert -a /var/log/audit/audit.log(SELinux);AppArmor 用 aa-statusaa-genprof 交互生成 profile。注意:disabled 直接切 enforcing 会有大量未知违规,必须先走 permissive 验证;高版本 RHEL 中 SELinux 从 permissive 切 enforcing 无需重启。

本题考察 MAC 强制访问控制的落地工程。回答要点:三态语义与运行时切换能力、SELinux/AppArmor 的机制差异(类型 vs 路径)、"permissive 收集-补丁生成-灰度 enforcing-验证"的平滑迁移流程与审计工具链,体现安全策略上线的工程方法。

getenforce; setenforce 0            # 切 permissive(SELinux)
ausearch -m avc -ts recent | audit2allow -M mypolicy
semodule -i mypolicy.pp
setenforce 1
aa-status; aa-enforce /etc/apparmor.d/usr.bin.myapp   # AppArmor
#
★★★

8. systemd 服务加固指令 ProtectSystem、PrivateTmp、NoNewPrivileges、ReadOnlyPaths 如何限制服务进程的文件系统与权限面

systemd 的 ProtectSystem、PrivateTmp、NoNewPrivileges、ReadOnlyPaths 等指令如何限制服务进程的文件系统与权限面?如何组合使用?

  • ProtectSystem 的三档(no/yes/strict)与挂载语义
  • PrivateTmp/PrivateDevices/ProtectHome 的隔离作用
  • NoNewPrivileges 与 ReadOnlyPaths/InaccessiblePaths 的组合边界

systemd 通过 sandboxing 指令在不改应用代码的前提下收窄服务权限:ProtectSystem=yes 把 /usr、/boot、/etc 以只读挂载(strict 则整个文件系统只读,仅显式可写路径例外),防止服务进程篡改系统文件;PrivateTmp=yes 为服务提供私有 /tmp 与 /var/tmp(挂载隔离),避免与全局共享临时目录的符号链接攻击与信息泄漏;NoNewPrivileges=yes 阻止进程及其子进程通过 setuid/exec 等获得新特权(设置 no_new_privs 标志),是防提权的重要防线,容器运行时也常默认开启;ReadOnlyPaths= 把指定路径挂为只读,InaccessiblePaths= 直接隐藏路径,ProtectHome= 隔离 /home 与 /root,ProtectSystem=strict + ReadWritePaths= 组合可精确声明"只允许写哪些目录"。

组合实践:对 Web/API 等无需写系统目录的服务,典型组合 ProtectSystem=strict + PrivateTmp=yes + NoNewPrivileges=yes + ProtectHome=yes + ReadOnlyPaths=/opt/app,再显式声明数据目录为 ReadWritePaths;注意兼容性——服务若需写 /etc 或执行 setuid 程序会失败,需在灰度环境验证功能后再上线;通过 systemd-analyze security <unit> 可输出单元的安全加固评分与缺失项清单,是检查"加固是否到位"的便捷工具;cgroup v2 场景下部分指令与运行时版本相关,需确认 systemd 版本支持。

本题考察 systemd 沙箱指令的体系化应用。回答要点:各指令的机制(只读挂载、私有挂载、no_new_privs、路径隐藏)与典型组合、与业务兼容性的验证流程、systemd-analyze security 的检查方法,体现"最小权限服务化"的工程落地。

# /etc/systemd/system/myapp.service.d/override.conf
[Service]
ProtectSystem=strict
PrivateTmp=yes
NoNewPrivileges=yes
ProtectHome=yes
ReadWritePaths=/var/lib/myapp
systemctl daemon-reload && systemctl restart myapp
systemd-analyze security myapp
#
★★★

9. 内核模块加载控制中 modules.sig_enforce 强制签名校验与模块黑名单如何防止恶意或未授权模块

modules.sig_enforce 与模块黑名单如何控制内核模块加载?它们在防恶意模块与供应链安全中的角色是什么?

  • 模块签名机制(CONFIG_MODULE_SIG、sig_enforce 语义)
  • /etc/modprobe.d/*.conf 的 blacklist 与 install 指令
  • 结合锁定的 /sys/kernel/security 与 UEFI Secure Boot 的加固层次

内核模块(LKM)以内核态执行,恶意模块等于直接获取 root 与内核权限,因此加载控制是主机防线核心。modules.sig_enforce(/proc/sys/kernel/modules_disabled 之外的第二道开关)为 1 时强制所有模块必须通过内核信任的密钥签名才能加载(否则拒绝加载并记录),与编译选项 CONFIG_MODULE_SIG 配套;签名密钥来源(模块签名密钥 MOK 或内嵌密钥)决定信任链,RHEL/Fedora 启用 Secure Boot 后默认开启强制校验。此机制防的是"未授权第三方模块注入",配合 kernel.modules_disabled=1 可在启动后彻底禁止模块加载/卸载(适合固化环境,但要评估驱动热插拔需求)。

模块黑名单通过 /etc/modprobe.d/*.conf 的 blacklist <mod> 阻止模块自动加载(别名匹配),install <mod> /bin/false(或 true)可拦截显式 modprobe 请求,双管齐下可禁用危险或不需要的模块(如 usb-storage、dccp 等历史漏洞模块);黑名单防"自动加载",签名校验防"恶意加载",组合形成纵深:先黑名单禁用不必要的攻击面,再签名强制约束剩余加载路径。运维实践:lsmod 核对实际加载、modprobe -c | grep -i blacklist 检查生效规则、签名模块用 modinfo -F signature 验证、查看 dmesg 的签名校验失败日志;加固前在测试机验证驱动与网卡/存储模块兼容性,避免启动后硬件驱动缺失。

本题考察内核模块加载的纵深控制。回答要点:sig_enforce 的签名强制语义与信任链、黑名单/install 拦截的"防自动加载"作用、两者组合与 modules_disabled 的关系、以及兼容性验证的运维细节,体现对内核供应链安全的完整把握。

sysctl kernel.modules_disabled
cat /proc/sys/kernel/modules_disabled
# /etc/modprobe.d/blacklist.conf
blacklist usb-storage
install dccp /bin/false
lsmod | grep -i <mod>
modinfo -F signature <module>
#
★★

10. audit 规则如何审计用户相关操作(如创建、删除、提权)?

auditctl/audit.rules 如何审计用户相关操作?创建、删除、提权等事件的规则如何编写与验证?

  • audit 规则语法:-w 文件监视、-a 系统调用监视、key 标记
  • 用户操作审计点:passwd/group 文件、useradd/userdel、sudo 提权
  • 验证:auditctl -l、ausearch 查询、audit.log 事件解读

Linux audit 子系统按规则记录安全相关事件:文件监视规则 -w /etc/passwd -p wa -k user_mgmt 监视文件写与属性变更;系统调用规则 -a always,exit -F arch=b64 -S execve -F euid=0 -k priv_cmd 记录特定条件下的 syscall(如以 root 执行命令)。审计用户操作的关键点位:账户文件(/etc/passwd、/etc/shadow、/etc/group、/etc/sudoers)的写事件覆盖 useradd/userdel/passwd 修改;提权事件用 execve 规则配合 auid(原始登录用户)字段记录"谁以什么身份执行了什么",sudo 本身也通过 execve 或 sudoers 相关文件监视捕获;可进一步用 -F auid!=4294967295 排除内核线程。规则持久化在 /etc/audit/rules.d/*.rules(augenrules 合并为 audit.rules)或 /etc/audit/audit.rules。

验证闭环:auditctl -l 查看生效规则、auditctl -R /etc/audit/rules.d/xxx.rules 重载、ausearch -k user_mgmt -ts recent 查询事件、aureport -au 汇总认证与用户操作;事件解读关注 syscall/comm/exe/uid/auid 字段。生产要点:规则不能过宽(全 syscall 记录会刷爆日志并拖慢系统),按"关键路径 + key 分类"设计;audit 规则容量有限(约 64 条文件规则限制),合理规划;同时注意 auditd 故障(backlog 溢出、max_log_file 打满)的应急开关(auditctl -e 0 临时停用)。

本题考察审计规则的实战编写。回答要点:文件规则与 syscall 规则的语法、用户/提权审计的关键点位与字段(auid/uid)、规则持久化与验证工具链(auditctl -l、ausearch、aureport),以及规则宽度的性能权衡,体现审计工程的完整闭环。

auditctl -w /etc/passwd -p wa -k user_mgmt
auditctl -a always,exit -F arch=b64 -S execve -F auid>=1000 -k cmd_exec
# 持久化:/etc/audit/rules.d/user.rules
-a always,exit -F arch=b64 -S execve -F euid=0 -k priv_cmd
augenrules --load
ausearch -k priv_cmd -ts recent; aureport -au
#
★★

11. auditd 如何生成并落盘审计日志(audit.log)?

auditd 如何生成并落盘审计日志?audit.log 的格式、轮转与查询方法是什么?

  • 审计链路:内核 audit 事件 → auditd 守护进程 → /var/log/audit/audit.log
  • audit.log 记录格式(type、msg、key、字段)与解读
  • 轮转配置(max_log_file、num_logs)与 ausearch/aureport 查询

审计链路分两层:内核生成 audit 事件(规则触发时写入内核 audit buffer),用户态 auditd 守护进程读取内核事件(netlink 接口)并落盘到 /var/log/audit/audit.log,同时负责规则加载与日志轮转。audit.log 每行一条记录,格式如 type=SYSCALL msg=audit(1712345678.123:456): arch=c000003e syscall=59 success=yes exit=0 ... comm="sudo" exe="/usr/bin/sudo" key="priv_cmd",由 type(SYSCALL、AVC、USER_CMD 等)、msg(时间戳:序号 与字段列表)构成,时间戳是 unix 秒.微秒。记录先经内核 buffer 到 auditd,buffer 溢出(backlog_limit)会丢事件,因此落盘可靠性依赖 buffer 与磁盘写入速度。

运维配置:max_log_file(MB)与 num_logs 控制轮转(超过后滚动保留 num_logs 个文件,管理员账户可配置)与 disk_full_action/disk_error_action 控制磁盘满时的行为(如 syslog 告警、halt);查询用 ausearch -ts today -k user_mgmt(按 key/时间/uid/syscall 过滤)、aureport -a 生成汇总报表(认证、文件、命令统计);日志完整性上可配置远程转发(audisp-remote)与权限(audit.log 属主 root、600)。排障链路:无日志先查 auditd 状态与 /proc/sys/kernel/auditd 后端是否运行、buffer 计数(auditctl -s 的 backlog 字段)、磁盘空间;生产设置合理的 max_log_file + num_logs 与监控告警,防止审计日志打满磁盘导致系统异常。

本题考察审计日志管线的完整运维。回答要点:内核事件→auditd→audit.log 的链路与格式字段、轮转与磁盘满策略、ausearch/aureport 的查询与完整性保障,以及 buffer/磁盘故障的排障点,体现审计日志系统的可运维性设计。

systemctl status auditd
auditctl -s                      # 查看 backlog 等统计
tail -5 /var/log/audit/audit.log
ausearch -k priv_cmd -ts yesterday
aureport -au
# /etc/audit/auditd.conf
max_log_file = 100
num_logs = 5
#
★★

12. auditd 的 backlog_limit 如何防止审计事件队列溢出?

auditd 的 backlog_limit 如何防止审计事件队列溢出?backlog 溢出会有什么后果,如何监控与调优?

  • backlog 队列:内核 audit buffer 与 auditd 消费速率的关系
  • backlog_limit 语义与溢出后果(事件丢失、系统响应性)
  • 监控手段(auditctl -s 的 backlog、lost)与调优

内核生成的 audit 事件先进入内核 audit buffer(backlog 队列),由 auditd 读取落盘;若事件产生速率持续高于 auditd 消费速率,队列长度增长。backlog_limit(auditctl -b,默认 64)是队列长度上限:超过后新事件被丢弃(lost),严重时内核会触发拥塞控制——当 backlog 长时间超限,内核可能丢弃全部新事件甚至暂停部分审计,事件丢失意味着"该审计的没审到",破坏审计完整性。极端情况下(事件风暴)内核会打印 "audit: backlog limit exceeded" 并可能影响系统响应。

监控与调优:auditctl -s 查看 backlog 当前值、lost(已丢失数)、backlog_limit 配置;生产建议按审计事件密度设定(如 8192-16384),并结合 failure_mode 决定溢出时的降级行为;同时保证 auditd 的落盘性能(独立磁盘、避免与高 IO 业务争用)与规则不过度宽泛,从源头控制事件速率。事件丢失的排障:先看 lost 计数,再定位是规则过宽(高频 syscall 全量记录)还是 auditd 落盘慢(磁盘 IO 瓶颈、max_log_file 打满导致轮转卡顿),对症调整规则或资源。

本题考察审计可靠性的容量管理。回答要点:内核 buffer 与 auditd 消费的队列模型、backlog_limit 溢出导致丢事件与拥塞的后果、auditctl -s 的监控字段与"规则收紧+落盘提速"的双向调优,体现对审计链路端到端可靠性的理解。

auditctl -s                       # 查看 backlog/lost/backlog_limit
auditctl -b 16384                 # 调大队列上限
grep -i "backlog limit exceeded" /var/log/messages
# /etc/audit/auditd.conf
# backlog_limit 也在内核侧:/etc/audit/rules.d 中 auditctl -b 持久化
#
★★

13. auditd 的 failure_mode 参数如何控制系统在审计故障时的行为?

auditd 的 failure_mode(-f)如何控制系统在审计故障时的行为?三种模式的取舍是什么?

  • failure_mode 取值:0 静默、1 printk、2 panic
  • 审计故障场景:队列溢出、规则无法加载、内核 audit 后端异常
  • 取舍:可用性 vs 审计完整性的策略选择

failure_mode(auditctl -f)定义审计子系统发生"不可恢复故障"时的行为:0 静默模式——故障时只丢弃/忽略审计(printk 0 级抑制),系统继续运行但不审计;1 printk 模式——故障时向内核日志打印告警并继续(常见默认);2 panic 模式——审计故障直接触发内核 panic,宁可宕机也不允许"无审计运行"。故障触发条件包括 backlog 长时间超限、audit 事件丢失超过阈值、内核 audit 后端异常等。三种模式是"可用性"与"审计完整性"的取舍:0/1 保运行但可能丢失审计证据;2 保证"要么审计、要么停机",适合合规要求极高的环境(金融、政务等监管场景)。

生产实践:多数环境用 1(printk 告警 + 监控联动),即故障时让运维尽早发现并恢复;合规强制场景选 2 前需评估停机代价与恢复流程(panic 需配合 watchdog 自动重启,且重启后 auditd 自动恢复);无论哪种模式都应配套外部告警(监控 auditd 状态、lost 计数、内核日志关键字),避免"静默失效"——尤其是模式 0 下审计悄然停止。另外注意该参数只管"审计后端故障",auditd 进程本身崩溃时内核会按 auditd 停止时的默认行为处理,建议同时配置 systemd 的自动重启(Restart=always)。

本题考察审计系统故障时的策略决策。回答要点:三档语义(静默/告警/panic)、故障触发场景、可用性与完整性的取舍及合规场景的选用逻辑、以及外部监控防静默失效的配套措施,体现审计高可用的设计思维。

auditctl -s | grep failure
auditctl -f 1                     # printk 模式(常用)
# /etc/audit/auditd.conf
# failure_mode 在 rules 中持久化
echo "-f 1" >> /etc/audit/rules.d/audit.rules
#
★★

14. auditd 的 log_format 参数中 ENRICHED 与 RAW 格式的差异

auditd 的 log_format 参数中 ENRICHED 与 RAW 格式有什么区别?如何选型?

  • RAW 格式:内核原始字段,紧凑但对人不友好
  • ENRICHED 格式:补充可读字段(命令名、可执行路径、主机名、进程名等)
  • 存储成本与解析工具兼容性

auditd 的 log_format 控制 audit.log 记录格式:RAW 是内核审计事件的原样输出(type=SYSCALL msg=audit(...): arch=... syscall=59 等原始字段,未展开),紧凑、占用小、与内核审计接口一一对应,但解读需要对照 syscall 号映射表,不直观;ENRICHED 在 RAW 基础上由 auditd 补充可读信息——把 syscall 号翻译成名称(如 syscall=execve)、附加 exe(可执行文件路径)、comm(进程名)、proctitle、主机名(HOSTNAME 字段)、UID 解析等,显著降低人工与工具解析成本,是多数发行版默认。

选型考虑:ENRICHED 存储量更大(每条记录多若干字段),磁盘开销增加但幅度有限(一般 10%-30%),换来的可读性收益高;RAW 适合超大审计量、存储敏感或由自研解析器按原始结构处理的场景;注意外部 SIEM/采集系统对两种格式的解析兼容性——若下游解析器按字段位置硬编码则需匹配格式。切换配置后(/etc/audit/auditd.conf 的 log_format=ENRICHED)重启 auditd 生效,历史日志格式不变;统一日志格式对后续检索与归档(如日志易失性分析与审计报告)很重要。

本题考察审计日志格式选型的实操差异。回答要点:RAW 的原始紧凑与 ENRICHED 的可读性增强(syscall 名、exe、comm、主机名)、存储与解析兼容性的权衡、以及配置切换与下游对接的注意点,体现对审计数据消费场景的理解。

# /etc/audit/auditd.conf
log_format = ENRICHED
systemctl restart auditd
# 对比查看
grep -m2 "type=SYSCALL" /var/log/audit/audit.log
#
★★

15. auditd 的 max_log_file 如何限制审计日志大小,超限后如何处理?

auditd 的 max_log_file 如何限制审计日志大小?超限后的处理策略(轮转、动作)如何配置?

  • max_log_file(MB)与 num_logs 轮转机制
  • 超限动作:max_log_file_action(ROTATE/IGNORE/SYSLOG/SUSPEND/STOP/HALT)
  • 磁盘满保护与审计连续性

max_log_file 限制单个 audit.log 的最大体积(MB,如 100),配合 num_logs(保留轮转文件个数)与 max_log_file_action 决定超限行为:ROTATE 滚动保留 num_logs 个文件(默认,日志连续);IGNORE 忽略限制继续写(风险:磁盘打满);SYSLOG 超限时把告警写入 syslog 后继续(实际多为告警 + 停止审计的变体语义,需按版本确认);SUSPEND 暂停写审计日志(写操作挂起,审计中断);STOP 停止 auditd;HALT 直接停机。生产推荐:ROTATE + 足够的 num_logs(如 5-10),并把轮转周期与磁盘空间预算匹配,同时监控日志增长速率。

磁盘满保护:设置 disk_full_action(磁盘满时动作,如 SYSLOG/HALT 或保留空间)与 disk_error_action(磁盘错误时动作),默认策略应避免"审计日志打满磁盘导致系统盘爆满"(尤其 / 与 /var 同一分区时);高审计量环境可把 audit 日志目录放独立分区,用 logrotate 与 auditd 内建轮转二选一(避免双轮转冲突);审计连续性上,轮转瞬间可能短暂丢事件(backlog 处理),高峰时段避免手动重载;恢复流程:扩容/清理后确认 auditd 状态与 backlog,必要时 auditctl -e 1 恢复。监控告警项:auditd 进程状态、磁盘使用率、audit.log 增长速率。

本题考察审计日志的容量与连续性治理。回答要点:max_log_file/num_logs/action 三者的协同语义、磁盘满保护参数、轮转与 logrotate 的配合冲突规避、以及"不因日志管理导致审计中断或磁盘爆满"的运维目标,体现审计存储管理的工程细节。

# /etc/audit/auditd.conf
max_log_file = 100
num_logs = 10
max_log_file_action = ROTATE
disk_full_action = SYSLOG
disk_error_action = SYSLOG
systemctl restart auditd
df -h /var/log/audit
#
★★

16. 系统加固基线的制定与落地中账号密码策略、sshd 配置、防火墙默认拒绝与 auditd 规则如何组合成可核查的基线

如何制定并落地系统加固基线?账号密码策略、sshd 配置、防火墙默认拒绝与 auditd 规则如何组合成可核查的基线?

  • 基线内容维度:账号密码(PAM pwquality、过期策略)、sshd(协议/认证)、防火墙(默认拒绝)、auditd 规则
  • 落地方式:配置管理(Ansible)统一分发 + 基线核查脚本
  • 核查闭环:CIS 基准对照、自动巡检与差异告警

系统加固基线是把安全要求固化为可核查的配置标准,典型维度:账号密码策略——/etc/login.defs 与 PAM(pam_pwquality 密码复杂度、PASS_MAX_DAYS 过期、密码重用限制、root 直登禁用);sshd 配置——协议版本 2、禁止 root 密码登录(PermitRootLogin no)、密钥认证为主(PasswordAuthentication no)、AllowUsers 白名单;防火墙——默认拒绝(INPUT 默认 DROP/REJECT,仅放行必需端口与来源);auditd 规则——审计关键文件、提权与登录事件。各维度互相衔接:认证强、访问面小、行为可审计。

落地方式:用配置管理(Ansible/Chef)把基线写成 role/playbook 统一分发到主机,配合模板渲染避免手工漂移;可核查性是关键——基线必须有"核查脚本"(或 CIS-CAT、OpenSCAP 等扫描工具)输出每项的合规/不合规状态,纳入巡检(如每日扫描、差异告警);策略文件用 immutable 属性或文件完整性监控(aide/audit -w)防止被改。基线需版本化(v1/v2),变更走评审流程;对业务兼容性做灰度(先对非关键节点验证),避免加固策略(如禁用某协议、默认拒绝防火墙)误伤业务。最终形成"基线文档-自动化分发-自动核查-差异整改"的闭环。

本题考察加固基线的工程化落地。回答要点:四个维度的具体加固点、配置管理分发与模板化、可核查性设计(扫描工具、巡检告警、文件完整性)、以及灰度与版本管理防业务事故,体现从"写基线"到"守基线"的完整治理能力。

# PAM 密码策略示例
password requisite pam_pwquality.so minlen=12 dcredit=-1 ucredit=-1
# sshd 核心项
PermitRootLogin no
PasswordAuthentication no
# 防火墙默认拒绝(iptables 示例)
iptables -P INPUT DROP
# 核查脚本片段
sshd -T | grep -E "permitrootlogin|passwordauthentication"
auditctl -l | grep -c "user_mgmt"
#
★★

17. Yama ptrace_scope 如何限制跨进程调试与提权路径,开启后对调试工具与容器的影响

Yama ptrace_scope 如何限制跨进程调试与提权路径?开启后对调试工具与容器运行有什么影响?

  • ptrace 提权路径:注入/劫持高权限进程获取凭据
  • ptrace_scope 取值对调试、监控工具的阻断
  • 容器场景:运行时(Docker/Podman)的默认与兼容性

ptrace 允许一个进程读取/修改另一个进程的内存与寄存器,是调试器(gdb)、跟踪工具(strace)的底层机制,也是经典提权路径:低权限进程 attach 到高权限进程注入代码、劫持执行流,或读取其内存中的密钥/凭据。Yama 的 kernel.yama.ptrace_scope 从"进程血缘"角度限制 attach:默认 1 仅允许 attach 直接祖先/兄弟进程,阻断"无关进程间"的 ptrace,从而斩断"低权注入高权"路径(配合无特权用户无法 attach root 进程);取 2 仅 root/CAP_SYS_PTRACE 可 attach,取 3 完全禁用并锁定。

对调试工具的影响:gdb/strace 调试自己启动的子进程不受影响(父子血缘);但 attach 已在运行的无关进程(如 strace -p <pid>gdb -p)会报 Operation not permitted,运维调试需以 root 执行或临时调 0(用后恢复);对容器的影响:容器内进程与宿主进程无血缘,scope=1 即隔离了跨容器/跨宿主 attach;但容器运行时本身(dockerd/containerd)以 root 管理容器进程,若依赖 ptrace 注入(如部分 sidecar、调试注入、runtime 的 exec 检测)需确认兼容性——多数 runtime 用 namespaces 而非 ptrace 提权,不受影响;K8s 生态的 debug 容器(kubectl debug 的 ptrace 调试)依赖宿主 scope 允许。生产建议:保持 1,调试场景用 root 或专用调试节点,监控告警工具若依赖 ptrace 注入(旧版 bpftrace 等)需评估升级。

本题考察 ptrace 安全限制的双面影响。回答要点:ptrace 提权路径的本质、scope 四档对"无关进程 attach"的阻断语义、对 gdb/strace 与容器运行时的具体影响(血缘 vs 隔离),以及运维调试的替代方案,体现安全与运维便利的平衡。

sysctl kernel.yama.ptrace_scope
sysctl -w kernel.yama.ptrace_scope=0    # 临时放开(调试完恢复)
# 验证效果
sudo -u nobody strace -p 1              # 应报 Operation not permitted
#

18. 内核漏洞缓解的层次中及时补丁、内核参数(如 kptr_restrict)与漏洞利用缓解(KASLR/SMEP/SMAP)如何配合

内核漏洞缓解有哪些层次?及时补丁、kptr_restrict 等内核参数与 KASLR/SMEP/SMAP 等利用缓解如何配合?

  • 缓解层次:补丁(根治)、信息隐藏参数(kptr_restrict、dmesg_restrict)、利用缓解(KASLR/SMEP/SMAP/ASLR)
  • 各层次的失效场景与互补关系
  • 纵深防御落地:组合配置与验证

内核漏洞缓解分三个层次:第一层是补丁(根治)——及时应用发行版安全更新(CVE 修复)消除漏洞本体,这是唯一"治本"手段,其他都是"提高利用难度";第二层是信息隐藏——kptr_restrict(限制 /proc/kallsyms 指针可见性,1 仅 root 可读、2 完全隐藏)防止泄露内核地址,dmesg_restrict(非特权用户禁读 dmesg)防止通过内核日志泄露地址与布局信息,这些参数直接对抗"KASLR 需要先泄露地址"的利用前提;第三层是利用缓解——KASLR(地址随机化)、SMEP/SMAP(CPU 页权限隔离阻断 ret2usr/ROP)、ASLR(用户态地址随机化)、栈保护与 CFI 等,让"即使知道漏洞也无法稳定利用"。

配合逻辑:补丁滞后窗口(0day、补丁周期内)由第二、三层兜底——隐藏内核地址让 KASLR 绕过难度大增,SMEP/SMAP 阻断最常用的用户页执行攻击;三者组合使攻击者需要"地址泄露 + 信息泄露 + 复杂 gadget 链",利用成本显著上升。运维落地:保持补丁管理流程(漏洞库跟踪、灰度上线);sysctl 加固(kptr_restrict=2、dmesg_restrict=1、kernel.kptr_restrict 等)作为基线;确认 CPU/内核特性开启(grep smep/smap /proc/cpuinfo、KASLR dmesg 确认);并定期做漏洞扫描(CVE 基线核对)与利用缓解有效性验证。注意:任何单一缓解都可能被绕过(如侧信道泄露 KASLR),因此"补丁优先 + 参数加固 + 利用缓解"必须组合,且容器/虚拟化场景还需叠加 namespace 与 seccomp。

本题考察内核安全纵深的分层思维。回答要点:三层缓解(根治补丁、信息隐藏、利用缓解)各自的机制与失效场景、kptr_restrict 与 KASLR 的攻防联动逻辑、组合落地的配置与验证清单,体现"不可依赖单一防线"的安全工程观。

sysctl kernel.kptr_restrict kernel.dmesg_restrict
grep -wE "smep|smap" /proc/cpuinfo | head -1
dmesg | grep -i kaslr
# 基线示例
echo "kernel.kptr_restrict=2" >> /etc/sysctl.d/99-hardening.conf
sysctl --system
#

19. 加固效果的验证方法中配置基线核查、漏洞扫描与绕过测试(尝试未授权提权)如何形成验证闭环

如何验证系统加固效果?配置基线核查、漏洞扫描与绕过测试如何形成验证闭环?

  • 基线核查:配置项自动比对(CIS-CAT/OpenSCAP/自研脚本)
  • 漏洞扫描:CVE 核对与暴露面评估(Nessus/OpenVAS)
  • 绕过测试:尝试未授权提权路径验证防护有效性

加固验证有三类手段:配置基线核查——把基线逐项转为检查项(如 sshd 参数、sysctl 加固项、文件权限、PAM 策略),用 CIS-CAT、OpenSCAP(oscap xccdf eval)、lynis 或自研脚本自动比对,输出合规率与差异清单,回答"配置是否符合基线";漏洞扫描——用 Nessus/OpenVAS/Trivy 等核对系统与软件包 CVE(oscap 的 OVAL 也可做离线核对),并探测暴露面(开放端口、弱服务、默认口令),回答"有哪些已知漏洞与暴露";绕过测试——在测试/隔离节点上模拟攻击者:尝试以低权限用户读取 /proc/kallsyms 与 dmesg、尝试 ptrace attach 高权进程、尝试 sudo 提权与内核模块加载(未签名)、容器逃逸探测等,回答"防护是否真的挡住攻击路径"。

三者闭环:先核查基线(配置面)→ 扫描漏洞(漏洞面)→ 绕过测试(有效性面),发现问题分别整改(改配置、打补丁、修策略),整改后复验——重新核查确认合规、重新扫描确认 CVE 消除、重新测试确认绕过失败,形成"发现-整改-复验"循环;配合版本化的加固文档与定期巡检(月度核查、补丁后重扫),把验证纳入发布与变更流程。注意绕过测试的边界:只在授权的测试/预发环境执行,生产环境做非破坏性检查(只读探测、不实际提权),测试结果记录归档作为安全审计证据。

本题考察安全验证的方法论闭环。回答要点:三类手段各自回答的问题(配置符合性、漏洞存在性、防护有效性)、"发现-整改-复验"的循环机制、以及授权边界与证据归档等执行细节,体现从"做了加固"到"证明加固有效"的完整思路。

oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_cis /usr/share/xml/scap/ssg-content/ssg-rhel9-ds.xml
lynis audit system
grep -c . /proc/kallsyms                     # kptr_restrict 生效验证
sudo -u nobody cat /proc/kallsyms | head -1  # 应拒绝
nmap -sV -p- <host>                          # 暴露面探测
#

20. 容器与宿主机共享内核的攻击面中 capabilities、sysctl、内核模块加载与 /proc 暴露如何放大主机风险

容器与宿主机共享内核会带来哪些攻击面?capabilities、sysctl、内核模块加载与 /proc 暴露如何放大主机风险?

  • 共享内核的本质:容器无独立内核,逃逸即攻陷宿主
  • capabilities 过宽、sysctl 可控、模块加载与 /proc 暴露的放大效应
  • 收敛措施:最小 capabilities、只读挂载、seccomp、securityContext

容器共享宿主内核(无独立内核),攻击面放大逻辑是"容器内漏洞 → 内核漏洞利用 → 宿主被控":只要容器内能触达"可影响全局内核状态"的接口,就等于获得宿主权限级攻击面。四个典型放大点:capabilities——容器进程默认有 CAP_NET_RAW 等基础集合,若显式授予 SYS_ADMIN、NET_ADMIN、SYS_PTRACE 等强能力,等于直接授予对应内核接口(挂载、网络配置、ptrace 注入)的使用权,SYS_ADMIN 曾被多次用于容器逃逸;sysctl——容器若可写 /proc/sys(如 net.ipv4 命名空间内参数),可能修改影响全局或越界的参数;内核模块加载——若容器能 insmod(需 SYS_MODULE 或宿主未限制),加载恶意模块即直接获取内核控制权;/proc 暴露——宿主 /proc 被挂载进容器后,可读取其他进程内存(/proc/*/mem)、内核地址(kallsyms)、设备信息,为漏洞利用提供情报。

收敛措施:容器运行时默认策略(Docker 默认 capabilities 裁剪、seccomp default profile 过滤危险 syscall);K8s 用 securityContext 显式最小化(drop ALL + 按需 add、readOnlyRootFilesystem、allowPrivilegeEscalation:false、runAsNonRoot);宿主层禁止模块加载(modules_disabled 或签名强制)、kptr_restrict=2、dmesg_restrict=1、禁止把宿主敏感路径挂载进容器;配合不可变基础设施(只读根文件系统)与镜像扫描减少容器内可利用代码。威胁模型上默认"容器不可信",所有内核态接口按宿主安全标准治理。

本题考察容器安全的核心风险模型。回答要点:共享内核使"容器逃逸=宿主沦陷"、四个放大点各自的接口语义(能力、sysctl、模块、/proc)、以及 runtime/securityContext/宿主加固三层收敛措施,体现对容器攻击面的系统性认知。

# K8s securityContext 最小化示例
securityContext:
  allowPrivilegeEscalation: false
  readOnlyRootFilesystem: true
  runAsNonRoot: true
  capabilities:
    drop: ["ALL"]
# 宿主加固
sysctl kernel.modules_disabled=1 kernel.kptr_restrict=2 kernel.dmesg_restrict=1
#

21. core dump 安全管理中 core_pattern 配置、核心转储文件权限与敏感内存内容泄露防护

core dump 的安全管理包括哪些方面?core_pattern 配置、转储文件权限与敏感内存泄露防护如何实现?

  • core 文件含进程内存(可能含密钥/数据)的泄露风险
  • core_pattern 目标目录权限、属主与 setuid 程序处理(suid_dumpable)
  • 管道转发 + systemd-coredump 的权限控制与保留策略

core dump 是进程崩溃时的内存快照,可能包含密码、密钥、业务数据等敏感内容,安全管理从"生成-存储-访问"三环控制:生成环节——core_pattern 决定落盘位置与是否管道转发(|/usr/lib/systemd/systemd-coredump 交给 systemd-coredump 统一处理,可压缩、限大小、按 coredumpctl 管理),禁止 setuid/setgid 程序产生可被普通用户读取的 dump(fs.suid_dumpable=0 默认),必要时对高敏进程直接关闭 dump(ulimit -c 0 或 /proc/sys/kernel/core_pattern 指向 /dev/null);存储环节——转储目录属主 root、权限 0700(或系统 coredump 目录),文件权限默认按进程 umask 与属主控制,避免其他用户可读;管道转发路径上 systemd-coredump 默认把 core 存到 /var/lib/systemd/coredump,属主 root 且外部不可读,并支持 ExternalSizeMax/Compress 控制。

访问环节——调试人员需 root 或相应权限通过 coredumpctl gdb 获取,操作留痕;保留策略:按存储预算轮转清理(coredumpctl 清理、日志保留期限),防止磁盘被灌满;对含密钥进程(如 KMS agent、证书服务)可禁用 dump 或脱敏转储(重写 core_pattern 前先评估调试需求)。审计视角:core 生成本身可被 audit 记录(auditctl -w 监视 core 目录),形成"谁崩溃、谁读取"的证据链。容器场景注意宿主与容器 core 路径与权限的隔离。

本题考察崩溃转储的完整安全治理。回答要点:三环控制(生成策略、存储权限、访问管控)、suid_dumpable 与 systemd-coredump 的权限语义、保留与脱敏策略,以及审计留痕,体现"调试便利"与"敏感数据保护"的平衡。

sysctl fs.suid_dumpable kernel.core_pattern
echo "kernel.core_pattern=|/usr/lib/systemd/systemd-coredump %p %u %g %s" >> /etc/sysctl.d/99-core.conf
sysctl --system
ls -l /var/lib/systemd/coredump
coredumpctl list
# 高敏进程禁用
ulimit -c 0