容器环境下非root用户如何读取进程输出
容器非root环境读取指定进程stdout的实现方案
默认配置下直接执行tail -f /proc/<pid>/fd/1会触发权限拒绝,核心限制来自三点:进程UID不匹配、/proc文件系统的hidepid隐藏配置、容器默认的ptrace权限拦截,以下是经过验证的可行实现路径:
- 同UID运行匹配方案
只要待读取输出的目标进程,和执行tail命令的非root用户使用容器内完全一致的UID/GID启动,且容器没有配置hidepid=2的/proc挂载规则,直接执行命令即可正常读取输出。如果是跨容器读取,只要两个容器共享PID命名空间、对应进程UID一致,该方法同样生效。 - 容器权限调整方案
如果需要跨不同非root用户读取fd内容,启动容器时调整两类配置即可放开限制,不需要使用root身份:- 调整/proc挂载参数:挂载procfs时指定
hidepid=0,关闭进程信息隐藏,Docker环境对应启动参数为--tmpfs /proc:rw,nosuid,nodev,noexec,hidepid=0 - 补充必要权限:给容器添加
SYS_PTRACE权限,Docker启动加参数--cap-add SYS_PTRACE,K8s环境则在对应Pod的securityContext中添加SYS_PTRACE到capabilities.add列表即可。
- 调整/proc挂载参数:挂载procfs时指定
- 无权限依赖的替代方案(生产环境推荐)
不想调整容器安全配置的话,可以直接在启动目标进程时将标准输出、标准错误重定向到开放了读权限的普通日志文件,示例启动命令:
后续任意非root用户直接执行# 启动目标进程时重定向输出到全局可读的日志文件 ./your_target_process > /data/logs/app_stdout.log 2>&1 chmod 644 /data/logs/app_stdout.logtail -f /data/logs/app_stdout.log即可实时读取进程输出,不需要访问/proc下的敏感路径,也不需要额外授予特殊权限,稳定性和安全性都更高。
注意:不要直接给容器配置privileged特权模式实现该需求,特权模式会放开所有内核安全限制,攻击面过大,仅可用于本地临时调试,生产环境严禁使用。
内容的提问来源于stack exchange,提问作者dj308
相关产品推荐
相关产品推荐

