AUG56 bitcoin body 255: changepassword
给 LND 钱包改密码,很多人以为就是把解锁口令换一换。实际上这条 lncli changepassword 命令连着两个子系统:钱包加密层和 macaroon 令牌层。改错了参数,可能所有已签发的 API 令牌集体失效;或者反过来,你以为换密码能吊销令牌,结果它们一个都没死。
它工作在守护进程停止时
changepassword 和初始化、解锁命令一样,运行在 walletunlocker 阶段:lnd 进程要处于锁定或未启动状态,命令连上的是解锁器服务。执行时依次输入当前钱包密码、新密码、确认新密码,两次新密码不一致会当场报口令不匹配。有一个特殊场景写在官方说明里:如果这个钱包当初是用 --noseedbackup 起的(常见于测试节点),没有设过密码,改密码时要先去掉这个启动旗标重启 lnd,且“当前密码”一栏留空。命令帮助原文对该场景的表述是:当前密码字段应保持为空。
默认换密码不动令牌
关键的认知在这里:改密码默认不会更换 macaroon 根密钥,它只是用新口令重新加密 macaroon 数据库。源码说明里这句话很直白——所有此前签发的 macaroons 仍然有效。这符合运维直觉:给收银脚本换一道登录口令,不该顺手断掉它的 API 访问。但如果你换密码的动机恰恰是安全事件响应,怀疑令牌泄露,这个默认行为就不够了。
--new_mac_root_key 才是真正的吊销开关
想让全部旧令牌作废,加 --new_mac_root_key 旗标:根密钥轮换后,之前创建的所有 macaroon 集体失效。副作用立刻显现——每个还在用旧令牌连你的 RPC 的客户端,都得重新领一份新 admin macaroon 再分发。执行前先数一下下游有几路调用,这面旗是断头闸不是调光旋钮。
--stateless_init 与令牌的保管义务
如果这台节点当初是无状态初始化起来的(macaroon 不落盘在服务器文件系统),改密码时也必须带上 --stateless_init,否则守护进程会在文件系统里重新生成未加密的 macaroon 文件,可能泄露敏感信息——这句警告原文就写在命令帮助里。带无状态旗标改完密码,当前或新的 admin macaroon 会以二进制序列化形式出现在响应里,必须立刻保存:命令帮助用了“必须”这个词——不留档就失去 RPC 访问权,要重新创建钱包才找得回来。想省事就用 --save_to 指定落盘路径,不加这个旗标的话令牌打到标准输出。
一页检查单
普通换口令:停进程、不带任何旗标、跑命令、重启验证解锁。令牌泄露应急:换口令加 --new_mac_root_key,同时准备重发令牌。无状态节点:全程带 --stateless_init,改完立刻存档返回的 macaroon。用 --noseedbackup 起过的节点:记得去掉该旗标再来,当前密码留空。四种姿势各错一位,代价从多跑一次到全员断连不等。
令牌失效的另一半真相
把默认行为说透:新口令生效后,macaroon 数据库用新口令重新加密,令牌本身签名链没动,所以照常通行。这意味着两件事互相矛盾的日常预期——服务器硬盘失窃时,改口令可以挡住离线暴力解锁钱包,却挡不住攻击者带着早已拷走的令牌继续调用 RPC;反过来,轮换 new_mac_root_key 能瞬间作废所有拷走的令牌,但要求你在同一时间窗内完成对每一路下游的重发,任何被遗忘的旧令牌客户端都会以权限错误的形式回来找你。安全事件响应的正确顺序因此是:先断外网访问面、再换口令加根密钥轮换、最后逐客户端重发新令牌,而不是只改密码然后宣布处置完毕。改完重启节点,用一个旧令牌试调一次只读接口,它应该被拒绝——这一发试枪比任何检查表都诚实。
风险提示:口令与令牌管理失当可能导致闪电节点无法解锁或所有 RPC 客户端失联,资金操作受阻;本文为机制说明,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。