全家密码靠一个本子记?我在NAS上自建Vaultwarden密码库,账号都攥在自己手里

我家抽屉里有个绿皮本子,记密码记到第三本了。最早一本是我爸的字,路由器后台、燃气缴费、视频会员,一人一页。后来本子传到我妈手里,她记密码的路子更野:同一个生日变着花样用,wjh1985、wjh@1985、1985wjh,网站要特殊字符就加个感叹号。
上上个月给我妈清理老电脑,把她浏览器里躺了七年的37条密码清了个干净,这事专门写过一篇。清完问题跟着来了:密码总得有个地方放。让她们娘俩背16位随机密码是不现实的,继续往本子上记,我夜里睡不着。最后我把主意打到了家里那台飞牛NAS身上——装个Vaultwarden,全家的密码搬进自己家的机器里。
Vaultwarden是什么:Bitwarden的自建版服务端
先把名字掰清楚。Bitwarden是国外一家开源密码管理器,客户端做得很规矩:浏览器插件、手机App、网页保险库都有,基础功能免费。你的密码加密后存在它的云服务器上,它家口碑不差,但密码这东西,再靠谱的云也不如自己手里那台NAS踏实。
Vaultwarden就是干这个的:一个用Rust写的、兼容Bitwarden协议的轻量服务端。说人话——客户端还用Bitwarden官方的App和插件,服务端换成你自己NAS上跑的一个小容器。对客户端来说,它以为自己连的还是Bitwarden,实际上数据一步都没出门,全落在你家NAS的硬盘里。
这玩意儿轻到什么程度?官方镜像跑起来,日常内存占用几十MB,比我那个Navidrome音乐容器还省。我家N100小主机上已经跑了六个容器,塞进去这个第七个,top里看一眼连个水花都没有。顺便说一句,官方云版的免费档,密码共享能拉的人头卡得很紧,家里三口人都凑不齐;自建的没这个限制,这也是我选自己搭的一个原因。
部署半小时:一个容器一个目录
Docker装过东西的话,这个属于最简单的一档。镜像搜vaultwarden/server,关键参数就三样:端口映射(容器内是80,映射到NAS上挑个不冲突的,比如8222)、目录挂载(/data必须映射出来,别的都可以丢,这个不能丢)、重启策略选always。端口映射和目录挂载是什么关系,Docker入门那篇和讲bridge网络那篇里写过,这里不重复。
起来之后,浏览器敲NAS的IP加端口,能看到Bitwarden风格的网页保险库,先注册自己的账号。注意第一件事:进容器设置里加一个环境变量DOMAIN,值填你打算访问它用的地址。这个变量不影响登录,但它管着网页里生成的邀请链接和附件下载地址,不设的话后面共享组织的时候链接会指错路。
所有家当都在挂载出来的那个/data目录里:db.sqlite3一个文件装着全部密码记录,attachments文件夹放附件,还有一对rsa_key文件。这意味着两件事:备份就是备份这一个目录;搬家就是把这个目录拷走。没有玄学。
最大的坑:客户端只认HTTPS
装完兴冲冲去配浏览器插件,在插件设置里打开「自托管」,服务器URL填http://192.168.31.10:8222,点登录——报错,连不上。容器明明活着,网页明明开得欢。
这不是坏了,是浏览器插件强制要求HTTPS。插件里加密用的那套接口,浏览器只肯在安全上下文里给,http的页面摸不着。这是安全设计,不是Bug,http和https的区别那篇里讲过传输加密是怎么回事,密码库这种地方,浏览器替你把门焊死了反而省心。
给内网服务上HTTPS,两条路。有自己域名的,走NAS自带的反向代理:群晖在控制面板→登录门户→高级→反向代理里建规则,来源选HTTPS加域名,目的地指到本机的8222,证书用Let's Encrypt签一张绑上去,顺手在自定义头里把WebSocket的两个 Upgrade 头加上(插件实时同步靠它)。新版的Vaultwarden已经把WebSocket并进主端口了,不用像老教程那样单独再开一个3012,照着两三年前的教程抄会抄出一堆用不上的配置。
没域名的,给容器挂自签证书也行,环境变量SSL_CERT_PATH和SSL_KEY_PATH指过去。代价是每台要用插件的设备都得先信任这张证书一次:电脑双击装进信任存储,手机也一样。三台设备就是三趟。我家的做法是前者——反正域名是现成的,路由器DNS里把这个域名解析到内网IP,证书正规,设备零配置,出门也用同一个地址,省心。
全家人怎么用:一人一个账号,共享密码走组织
家里人别共用一个账号。Bitwarden的设计是一人一库,每个人的密码进自己的保险库,主密码各自保密。我妈的库她自己也打不开才有意义——都挂在我名下,那不叫密码库,叫户口本。
全家共用的那部分密码,比如WiFi密码、视频会员、宽带账号,走「组织」功能。建一个家庭组织,把共享条目放进组织的集合里,再发邮件邀请家里人加入。各人的库里多出一个「家庭」分组,里面的条目大家都能看,改一处全家同步。我给我妈单独建了个「爸妈」集合,把她那9条还活着的密码挨个迁进去,顺便全部换成生成的16位随机密码——她要做的只是记住一个主密码。
客户端这边,家里电脑装浏览器插件,登录时选自托管填自己地址;手机装Bitwarden官方App,同样在设置里指到自己家。之后的使用体感跟Chrome存密码差不多:网页上账号密码框一出现,图标一点自动填。区别是它跨浏览器、跨设备,我妈那台老电脑的Edge和我爸手机上的浏览器,填的是同一个库。
主密码忘了真没救:这跟别的账号不一样
用之前必须想明白一件事:Vaultwarden没有「忘记密码」这个功能。你的库是用主密码加密的,服务端只存密文,零知识架构——服务器不知道你的主密码,自然也没法帮你重置。主密码一丢,库里所有密码变成一堆谁也解不开的乱码,神仙来了都没用。
所以主密码是全场唯一一个你需要真正记住的密码。别用生日,别用跟别的网站重复的,但也不用搞到32位——四五个词连成一句口语密码,长度够、好记、抗暴力破解。我妈的主密码是她的口头禅加一个年份,她自己记得牢,我就当没看见。
怕人真忘了的,Vaultwarden有个「应急访问」功能:指定一个信任的人(比如我把媳妇设成我的紧急联系人),设一个等待期,七天也行三十天也行。真到了那边发起申请、等待期满你没拒绝,对方就能接管你的库。家里老人用,这个功能值得配一下。另外网页保险库里有导出功能,能导出加密的JSON文件,打印一份主密码提示和导出文件存放位置,锁进实体柜——云端没有找回,纸质的反而最抗时间。
备份和三条红线:data目录就是整个保险箱
密码库成了全家的命根子,备份就不能含糊。好消息是它结构简单,就是/data一个目录。坏消息是db.sqlite3是个正在被写的数据库文件,容器跑着的时候直接复制,有小概率拷到写了一半的状态。开SSH进去用sqlite3的.backup命令导一份安全的副本,再打包整个/data目录,扔进NAS自己的备份任务里,按3-2-1的原则留一份到NAS以外的地方。我的做法是每天凌晨自动导一份到冷备盘,反正一个SQLite文件撑死几MB,不心疼空间。
最后三条红线,是我在配置过程中给自己立的规矩,也建议你照抄:
| 红线 | 为什么 | 怎么做 |
| 不把密码库端口转发到公网 | 密码库是全网扫描器最爱的目标,撞库脚本天天上门 | 出门要用就走VPN回家,一条隧道的事 |
| 不开管理面板 | /admin能改用户改配置,等于保险箱后门 | 不设ADMIN_TOKEN它就是关的,保持这样 |
| 主密码不进任何自动填充 | 主密码一旦被别的网站泄露连带全库 | 只存在于脑子里和那张纸质提示上 |
出门在外要查密码,手机App配上就行——要么走VPN回家,要么像我这样FN Connect连回内网。反正密码库这东西,访问频次没那么高,慢半秒无所谓,稳最重要。
收尾给个对号表:
| 你的情况 | 建议 |
| 嫌折腾,密码也不多 | 直接用Bitwarden官方免费云版,客户端体验一样,零部署 |
| 有NAS,密码全在家用 | 自建Vaultwarden,data目录进每日备份,一步到位 |
| 家里多人共用一堆会员账号 | 自建+家庭组织,共享条目集中管,谁改了全家同步 |
| 老人记不住随机密码 | 一个口语主密码+应急访问设给你,剩下的交给插件自动填 |
那个绿皮本子我已经收进抽屉最底层了。第三本还没写满,但应该不会有第四本了。
