内核信息暴露控制
kernel.dmesg_restrict 与 kernel.kptr_restrict 是一对信息暴露控制开关:前者限制非特权用户读取内核日志(置 1 表示仅特权用户可读,多数发行版默认如此),后者限制内核地址的打印(0 打印、1 部分限制、2 全部替换为占位符)。内核日志可能包含内存布局与地址信息,收紧可见性会同时抬高排障门槛,需要在加固与可运维性之间取舍。
基本信息
| dmesg_restrict | 0 普通用户可读,1 仅特权用户(发行版常为 1) |
|---|---|
| kptr_restrict | 0 打印指针,1 部分限制,2 全文替换为占位符 |
| 查看 | sysctl kernel.dmesg_restrict kernel.kptr_restrict |
| 影响范围 | dmesg、部分 procfs 文件与 perf 输出 |
| 权限 | 修改需要 root |
典型使用场景
- 排障时普通用户执行 dmesg 无输出,先确认是否为权限开关
- 安全加固基线:按合规要求收紧内核日志可见性
- 分析内核崩溃栈时地址显示为占位符,需要临时放开
- 多租户主机限制非特权用户读取内核信息
- 容器环境限制 dmesg 访问范围
查看与临时调整
查看与临时调整
sysctl kernel.dmesg_restrict kernel.kptr_restrict
dmesg | tail -3 # 无输出先查开关,别急着怀疑内核
journalctl -k --no-pager | tail -20 # 受限环境下走日志服务读内核消息
sudo sysctl -w kernel.kptr_restrict=0 # 临时放开以分析崩溃栈
sudo dmesg -T | tail -20 # 特权用户不受 dmesg_restrict 限制
printf 'kernel.kptr_restrict=2\n' | sudo tee /etc/sysctl.d/99-security.conf # 持久化开关取值对照
| 开关 | 取值 | 作用 |
|---|---|---|
| dmesg_restrict | 0 / 1 | 控制非特权用户能否读取内核日志 |
| kptr_restrict | 0 / 1 / 2 | 控制内核地址在日志与文件中是否可见 |
| perf_event_paranoid | 负值到 3 级 | 控制 perf 事件可采集范围,同属信息暴露面 |
非特权用户执行 dmesg 没有输出时先查这两个开关,多数情况是权限设计而非内核异常。
kptr_restrict 会让日志中的地址变成占位符,分析崩溃栈需要临时放开;分析结束应及时恢复,长期放开会降低攻击门槛。
受限环境读日志的替代路径
- 走日志服务:journalctl -k 读取内核消息,权限由 journald 管控
- 由采集代理以特权身份读取后再转发给普通用户
- 排障需要时临时提权执行,用完立即恢复原值