acl是精细化访问控制机制,仅对普通用户生效,root可无视其规则;在华为云stack中,应通过组权限(如adm)、setfacl显式授权及默认acl策略,使非root日志agent安全读取指定路径日志,而非绕过root。

ACL(访问控制列表)本身不是提权工具,也不能“绕过 root”实现非法读取。它是一种授权机制,用于精细化控制文件、目录或对象的访问权限。所谓“通过 ACL 绕过 root 提权”,在真实系统中并不存在——root 权限高于 ACL,ACL 规则对 root 无效(root 可无视任何 ACL 读写文件)。因此,问题本质应理解为:
如何在最小权限原则下,让日志收集 Agent 合法、安全地读取各组件核心日志,而无需赋予其 root 权限或特权容器?
以下是基于华为云 Stack 环境(含 TKE、AOM、LTS、ICAgent)和 Linux ACL 实践的合理路径:
明确 ACL 的适用边界
ACL 仅对普通用户/进程生效,不能突破 root 限制,也不替代 SELinux/AppArmor 等强制访问控制。它的价值在于:
- 避免将 Agent 运行在 root 用户下(降低攻击面)
- 精准授予对特定日志路径(如
/var/log/nginx/、/var/lib/docker/containers/)的读取权限 - 配合组权限(如
adm、syslog)复用系统已有日志组策略
配置日志目录的 ACL 授权(以非 root Agent 为例)
假设日志收集 Agent 以专用用户 logagent 运行,需读取 Nginx access log 和容器 stdout 日志:
- 确认目标日志路径归属(如
/var/log/nginx/access.log属于root:adm) - 将
logagent加入adm组:usermod -aG adm logagent - 对关键目录启用 ACL 并授读权限:
setfacl -m u:logagent:r /var/log/nginx/access.logsetfacl -Rm u:logagent:rX /var/lib/docker/containers/(rX表示递归读+执行,便于遍历目录) - 设默认 ACL,确保新生成日志自动继承:
setfacl -d -m u:logagent:r /var/log/nginx/
⚠️ 注意:Docker 容器日志路径受
dockerd进程 uid/gid 控制,若日志文件属主为root:root且无组读权限,仅加组无效,必须用 ACL 显式授权。
与 TKE-log-agent 和 ICAgent 的协同要点
TKE-log-agent 默认需特权容器(因要挂载 /var/lib/kubelet/pods、读取 /proc 等),但 ACL 可减少其对宿主机日志路径的依赖:
- 若采集的是应用 Pod 内日志(非标准输出),优先通过 Kubernetes volume mount 将日志目录挂入 Agent 容器,并设好
fsGroup和runAsUser,避免直接操作宿主机路径 - ICAgent 在主机侧运行,推荐使用
root用户安装(官方要求),但采集行为可通过logrotate或journald转发间接解耦——例如配置rsyslog将组件日志转发至本地 UNIX socket,再由 ICAgent 以非 root 用户监听该 socket - 对于 AOM 中“组件日志”,实际来源是 TKE 控制面组件(如 kube-apiserver)的 systemd journal,可通过
systemd-journal-gatewayd+ ACL 限制访问范围,而非开放整个/var/log/journal
规避风险:为什么不能“绕过 root”
试图用 ACL 实现 root 级读取,本质是误解权限模型:
- ACL 是 DAC(自主访问控制)的一部分,root 拥有 CAP_DAC_OVERRIDE,可无视所有 DAC 规则
- 真正需要保护的是“非 root 进程能否越权读敏感日志”,答案是:必须靠组合策略——ACL + group membership + seccomp + PodSecurityPolicy(或 PSA)
- 例如,TKE-log-agent 的最小权限清单中明确要求
list/watch/getonpod、node,这是 RBAC 层控制;而读取宿主机文件路径,则属于节点侧的文件系统权限,需 ACL 或 group 配合
不复杂但容易忽略。











