首页/系统/Linux 内核与性能调优速查/kernel.dmesg_restrict 与 kptr_restrict 信息暴露控制
sysctl 内核参数72 条

kernel.dmesg_restrict 与 kptr_restrict 信息暴露控制

限制非特权用户读取内核日志(dmesg_restrict)与打印内核指针(kptr_restrict);安全加固常用组合。

内核信息暴露控制

kernel.dmesg_restrict 与 kernel.kptr_restrict 是一对信息暴露控制开关:前者限制非特权用户读取内核日志(置 1 表示仅特权用户可读,多数发行版默认如此),后者限制内核地址的打印(0 打印、1 部分限制、2 全部替换为占位符)。内核日志可能包含内存布局与地址信息,收紧可见性会同时抬高排障门槛,需要在加固与可运维性之间取舍。

基本信息

dmesg_restrict0 普通用户可读,1 仅特权用户(发行版常为 1)
kptr_restrict0 打印指针,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_restrict0 / 1控制非特权用户能否读取内核日志
kptr_restrict0 / 1 / 2控制内核地址在日志与文件中是否可见
perf_event_paranoid负值到 3 级控制 perf 事件可采集范围,同属信息暴露面
非特权用户执行 dmesg 没有输出时先查这两个开关,多数情况是权限设计而非内核异常。
kptr_restrict 会让日志中的地址变成占位符,分析崩溃栈需要临时放开;分析结束应及时恢复,长期放开会降低攻击门槛。

受限环境读日志的替代路径

  • 走日志服务:journalctl -k 读取内核消息,权限由 journald 管控
  • 由采集代理以特权身份读取后再转发给普通用户
  • 排障需要时临时提权执行,用完立即恢复原值

易错点

  • 把「dmesg 没有输出」当内核故障:多数是权限开关或容器命名空间导致
  • 长期放开 kptr_restrict:内核地址暴露会降低漏洞利用门槛,分析完应立即恢复
  • 只改运行时值:重启即失效,应写入 /etc/sysctl.d 下的配置文件
  • 以为容器内可自行控制:容器能否读 dmesg 还取决于宿主设置与命名空间能力
  • 混淆 dmesg_restrict 与 perf_event_paranoid:两者约束的接口不同,需要分别核对

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/kernel.rst
  • Linux 内核 Documentation/admin-guide/perf-security.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌