Buildroot包的用户与权限:让服务以最小权限运行
先列资源,再创建账户
独立账户只有与实际访问需求对应才有价值。先列出服务读取的文件、写入目录、创建的套接字和打开的设备,区分不可变配置、临时运行状态与持久数据。这样才能按资源授予权限,而不是因为某个目录创建不便,就让整个守护进程长期以root运行。
本文固定使用Buildroot 2025.02的软件包用户表和权限表。edge-log为虚构服务,标识符仅说明结构,没有生成镜像或在目标设备执行。目标是让镜像账户、启动方式和可写存储遵守同一个身份约定,并不把创建账户等同于完整的沙箱防护。

在配方中描述目标身份
Buildroot通过软件包USERS声明账户,通过PERMISSIONS描述所有权与模式,相关入口见2025.02通用包参考。这些声明面向目标镜像,不应在安装命令中调用宿主机useradd或修改构建机账户数据库。
define EDGE_LOG_USERS
edgelog -1 edgelog -1 * - - - Edge log service
endef
define EDGE_LOG_PERMISSIONS
/usr/bin/edge-log f 755 root root - - - - -
/etc/edge-log.conf f 640 root edgelog - - - - -
endef
普通文件条目要求文件已由安装步骤放入目标目录。可执行文件保持root所有,可以防止服务自行替换程序。配置允许服务组读取的前提是内容确实属于该服务;其他秘密应拆分保管,不宜通过扩大组权限顺便暴露。
逐字段理解用户表
字段依次为用户名、UID、主组、GID、密码、主目录、shell、附加组和说明。示例中的-1请求自动分配系统标识,星号禁止密码登录,shell字段的短横线表示使用/bin/false。具体语义见2025.02用户表格式,不能直接把/etc/passwd的一行复制过来。
自动分配便于初始集成,但软件包或配置改变后数值可能改变。若服务拥有持久文件,应在产品统一的用户表中固定并维护UID/GID,检查与所有其他包是否冲突。不能随手采用文章中的某个数字就认为没有占用。用户名方便阅读,而磁盘上的所有权最终依据数值标识判断。
镜像权限不等于挂载后的权限
根镜像中某目录的权限,不能自动决定后来挂载到该路径的另一个文件系统。如果/data在启动中被覆盖挂载,服务看到的是新文件系统的权限;临时文件系统中的运行目录也会在重启后消失。目录创建与赋权应安排在相应挂载就绪后、服务启动前。
对照2025.02权限表格式区分已有普通文件、目录和设备节点,只使用设计真正需要的条目类型。不要对整个/var或/data递归改所有权,其中可能有其他服务的数据,未来目录布局变化也会扩大命令影响。
账户存在不代表进程会使用它
镜像里创建edgelog,不会自动让edge-log进程切换身份。必须检查实际安装的服务单元或启动脚本,以及守护进程自身是否降权。systemd产品可以在单元中声明账户,BusyBox产品则需要其支持的等价启动路径,不能假设两种初始化系统行为完全相同。
启动后检查进程的UID、GID与附加组,再执行真实业务访问。服务可能启动正常,却在日志轮换或设备重连时才暴露权限错误。一次性特权准备应在稳定运行前完成,保留每项权限都要说明理由。不要用给守护进程增加setuid的方式修补目录所有权错误。
设备与套接字单独审查
静态设备节点声明只作用于相应静态设备表流程。采用动态/dev管理的产品,节点权限可能由另一套规则决定,应在驱动实际创建设备后检查,并覆盖拔插或替换场景。加入范围过大的设备组,可能同时授予服务不需要的硬件访问权。
UNIX套接字也要检查父目录。即使套接字模式看似允许,父目录仍可能阻止连接;反过来,把整个运行目录设为所有人可写,又会带来替换或干扰风险。分别测试合法服务操作与未授权账户访问,不要在日志中打印秘密文件内容来证明读取成功。
首启、升级与恢复分别验证
首启验证可写目录是否在启动前创建,以及只读根文件系统是否影响启动。升级验证新镜像账户的数值标识与已有数据所有权是否一致。恢复验证备份文件是否保留旧标识,恢复镜像是否使用同一身份约定。这三种状态不能用一次正常启动互相替代。
试验应使用专用实验数据卷,记录权限、数值所有者和操作结果,不收集私密内容。所有权不匹配时,应给出明确诊断并安全失败,而不是自动执行大范围chmod。确实需要迁移时,先审查精确路径和回退影响,再处理实际客户数据。
验收结论及局限
验收应确认账户和登录限制正确,不可变文件保持受保护,启动方式使用预期身份,服务只能访问所需资源。加入无关文件和设备的负向测试,再覆盖首启、升级和恢复。标识分配规则应随包一起维护,不能只保存在某位开发者的笔记里。
这些检查减少误用root与所有权漂移,不能证明完整隔离。能力、命名空间、服务加固和强制访问控制仍可能有独立要求。可靠交付应把每项服务操作对应到身份与资源,并保证跨版本持久数据的所有权连续。