cookie 文件谁能读:rpccookieperms 的三档权限与多用户服务器边界 图 1
cookie 文件谁能读:rpccookieperms 的三档权限与多用户服务器边界 · 图 1

不少把比特币节点接入自家自动化脚本的人,都会在某个深夜撞上一次诡异的登录失败:bitcoin-cli getblockchaininfo 突然报”拒绝认证”,可配置文件里什么都没改。排查半小时后真相浮出——同机器上另一个用户组的服务进程,昨天才被加上读取数据目录的权限。RPC cookie 鉴权这套机制的安全边界,恰好就藏在这条”文件权限即安全策略”的缝隙里。这篇把 cookie 的工作方式、默认权限的由来、那行少有人用的权限参数能改出什么后果,以及多用户服务器上的正确姿势讲清楚。

先把机制摆正。比特币核心的 RPC 服务默认只监听本机回环地址,但”只监听本机”不等于”谁都能调用”——同一台机器上任何进程都能向那个端口发请求。于是软件用一把随机密码做门禁:每次启动生成一个随机凭据(随机用户名与密码),写进数据目录的 cookie 文件,bitcoin-cli 这类本地工具启动时读这个文件完成登录。这套设计的巧妙处在于”零人工管理”:凭据每次开机换新,不用维护、不怕撞库,代价是安全完全押在文件系统的访问控制上——cookie 文件可读,等于 RPC 密码可读。

默认权限因此至关重要。源码文档里写得很直白:cookie 文件的权限默认是”仅属主可读”,通过启动时收紧 umask 实现。也就是说在正常默认下,只有运行 bitcoin 进程的那个系统用户能读这把钥匙;同机其他用户、其他服务,哪怕在同一个用户组,都碰不到。这也是为什么排查”cli 报认证失败”的第一现场总是权限而非密码——两种典型破法:一是有人手动改过数据目录或 cookie 文件的属主与权限,二是 cookie 被复制到了别处。另一种失败方向同样存在:运行 cli 的账号不是节点属主,读不到 cookie,报的是同一个认证错误——报错文本不区分”你密码错了”和”你根本没资格看密码”,这是它刻意的保守。

然后是那行少有人读的参数。配置里有一个 cookie 文件权限开关,可选值三档:仅属主、属组可读、所有用户可读。它的存在不是为了”方便”,而是为了解决一个具体运维问题:有些部署把节点进程与调用方进程跑在不同账号下(比如节点用专用用户、监控脚本用采集用户),属主-only 的默认会让监控读不到 cookie。这时管理员可以让 cookie 对同组成员开放,把双方拉进同一用户组,实现”组内共享凭据”。理解到这里就该警觉:这等于把一把每次开机重铸的钥匙,复制给了组里每一个账号——组内任何一个账号被攻破,RPC 全权(往往含钱包控制)即刻沦陷。参数文档把这个取舍写成一行,安全责任却全在使用者。“所有用户可读”这一档更是几乎只在共享调试环境或容器演示里有立足之地,主网生产环境碰它之前应当先问:为什么要让 /etc/passwd 里每个账号都能给节点发命令?

多用户服务器的正确姿势按需求分级。需求只是”本机同账号自动化”:什么都不用改,默认即最安全,脚本直接跑 bitcoin-cli。需求是”跨账号受控调用”:优先升级到更精细的门禁——用 rpc 用户加哈希密码的配置给不同服务发独立账号,再配合按用户过滤命令的白名单功能,把”谁能调哪些命令”写进配置;这套账号体系的凭据不落在 cookie 文件,天然绕开文件权限问题。确实想用组共享 cookie 的:建专用组、最小成员、监控组内账号清单,并给这个组配权限收窄的只读命令白名单兜底。任何情况下都不要为了方便把 cookie 复制给别的目录或别的机器——复制出去的那一刻,随机重铸的保护就永久失效了。

排障清单收尾:认证失败先比对该账号能否读 cookie(最小权限原则的镜像测试),再比对该账号是否运行过节点进程;组共享场景确认双方在同一组且权限开关确实重启生效;日志里 cookie 相关的警告值得长期保留——软件对”凭据可能被别人看见”类状况通常会自报。最后一句心法:cookie 模式的安全模型是”本地文件系统的访问控制”,你的节点 RPC 有多安全,等于你的系统用户体系有多干净,这与网络防火墙无关,也与加密无关——RPC 通道本身不加密,靠的是”只有这台机器的可信账号能登录”这个前提,前提破了,什么都破了。风险提示:权限配置失误可能导致 RPC 凭据泄露与钱包风险,请在测试环境验证后再用于生产,本文不构成投资建议。

cookie 文件谁能读:rpccookieperms 的三档权限与多用户服务器边界 图 2
cookie 文件谁能读:rpccookieperms 的三档权限与多用户服务器边界 · 图 2