阅读视图

发现新文章,点击刷新页面。

在家搭建VaultWarden密码管理服务

每个人都有很多密码,有人用脑记,有人用纸记,也有很多的工具帮我们记。之前我一直使用Keepass,在之前的文章介绍过。平时输入密码的场景最多的是网页中,目前keepass的网页插件只能说是能用的程度。前段时间给openwrt上面装上了docker,也想着在家搭一个密码管理服务,于是说干就干了。

密码服务能够个人搭建的就是Bitwarden了,因为在自家的树莓派上运行,因此选择了基于Rust的VaultWarden,毕竟资源消耗更少,性能也会更好点吧,它兼容Bitwarden,因此所有的客户端和浏览器插件都通用。 因为是在家里搭建要保证在外的时候,密码服务也能正常工作,因为已经有公网ip了,所以需要弄一个DDNS。因为搭建VaultWarden需要https,在查资料的过程中发现了lucky这个很好用的国产软件,索性把家里的DDNS和端口转发都换成了Lucky。

具体的流程就是首先在openwrt上面下载vaultwarden的镜像,因为国内docker默认镜像源用不了,所以我是用了github的镜像源:

1
docker pull ghcr.io/dani-garcia/vaultwarden:latest

之后在本地创建一个文件用来保存运行相关的环境变量:

ROCKET_PORT=1089
.....

当然了,也可以选择在运行docker的时候通过命令行带着,但是因为要加的变量很多,我就弄了个文件放。另外本地也要选择一个文件夹用来存放vaultwarden的数据。

1
docker run -d --name vaultwarden -v /data/vw-data:/data --network host --env-file /user/sam/env --restart unless-stopped ghcr.io/dani-garcia/vaultwarden:latest

我这里的配置是通过环境变量指定了端口,然后docker里面使用宿主机的网络,而不是像官网文档那样用了桥接,至于原因则是因为在openwrt里面停了重启发现网卡被占用启动不了。按照如上步骤即可完成vaultwarden的启动了。

但是这样服务还是不能使用,因为没有https服务,vaultwarden还无法完成身份认证。因此需要使用lucky了,我们可以选择把它安装在openwrt上,也可以安装到docker里面,而我发现我华硕路由器的koolshare软件中心里面就有,遂决定把他放到路由器里面。

安装完lucky后,首先是到自己的域名解析服务商那里把二级域名弄好,因为自动申请证书和DDNS都需要,DNS最好使用Cloudflare,阿里云,DNSPod等几家可以通过api修改解析,lucky里面又内置了的,这样可以减少很多麻烦。搞好之后,就可以去lucky里面先弄证书自动申请了,当然有证书的可以直接添加进去,我这里用了ACME申请Let's Encrypt证书。入口在“安全管理里面”点击添加证书,更加具体的可以看官方文档,这里搞好之后,后面设置端口转发或者设置web服务的时候都会使用这个证书。

搞完SSL证书,我想到我这里其实不需要通过端口转发来实现,完全可以通过Lucky的web服务功能来做,于是就创建一条web服务的规则,如下:

监听端口为对外暴露的端口,TLS启用就开启网站的HTTPS功能,前提也要先配置好证书才能打开。默认规则中服务类型选择反向代理,目标地址就是我们的服务的地址,例如http://192.168.1.10:1089,万事大吉打开,这样有些header都能正确的传过去。

这一切都搞完,就可以去浏览起打开注册用户了。

为了安全起见,最好注册完之后把注册功能给关掉,做法就是修改环境变量。

SIGNUPS_ALLOWED=false

另外,Admin页面也是默认关闭的,我自认为没有必要打开,因此就保留了原样。为了方便起见,把邮箱SMTP功能配置上,这样就可以去验证邮箱使用邮箱验证登录,同时主密码忘记提示词也可以发送到邮箱。配置上DOMAIN,记得要带上前面的https和后面的端口,这样就可以使用webauth了。一切 就绪,就可以去重新启动docker了。

1
2
3
docker stop vaultwarden
docker rm vaultwarden
docker run -d --name vaultwarden -v /data/vw-data:/data --network host --env-file /env --restart unless-stopped ghcr.io/dani-garcia/vaultwarden:latest

虽然把之前的docker容器删掉了,但是因为数据是映射到本地目录的,所以都还在。

前面这些搞完之后,为了数据的安全,我们还需要定期对数据进行备份,我是把阿里云盘挂载到本地了,因此直接把数据文件拷贝过去就实现了远程备份。为了足够高的安全,我是备份了两份,一份在阿里云盘,一份放到家里的另一块硬盘上。具体通过crontab每天定时执行脚本,把数据目录压缩,放置到对应的目录,备份的时候会把最老的那一个备份删掉。脚本如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash

SRC_DIR=/mnt/sda1/vw-data/
LOG_FILE=/mnt/sda1/log/Error_Log_$(date +%Y%m%d).log
MAX_NUM=10
NOTIFY_URL=https://sctapi.ftqq.com/[apikey].send
DEST_ALIYUN=/mnt/aliyundriver/backup/vaultwarden
DEST_SDB=/mnt/sdb1/backup/vaultwarden


function notify {
 curl --data-urlencode "title=${1}" "${NOTIFY_URL}"
}


function log {
 echo "$(date +'%Y-%m-%d %H:%M:%S') $1" >> ${LOG_FILE}
 notify "$1"

}

function compress {
 if [ ! -d "${DEST_SDB}" ]; then
 log "错误:第二块硬盘不存在,无法进行备份"
 return
 fi
 dest_file=${DEST_SDB}/vw_backup_$(date +%Y%m%d).zip
 7z a -tzip ${dest_file} ${SRC_DIR} > /dev/null 2>&1
 if [ $? -eq 0 ]; then
 echo "压缩完成,文件存在${dest_file}"
 if [ ! -d "${DEST_ALIYUN}" ];then
 log "错误:阿里云目录未挂载,请检查"
 return
 fi
 cp ${dest_file} ${DEST_ALIYUN}/
 else
 log "错误:压缩出现错误"
 return
 fi
 notify "今日备份成功$(date +%Y%m%d)"
}

function delete_old_archives {
 num=$(ls -l ${1} | grep "^-" | wc -l)
 echo $num
 while [ ${num} -gt ${MAX_NUM} ]
 do
 file=$(ls -rt ${1}/vw_backup_*.zip | head -n 1)
 if [ -n "${file}" ];then
 rm -f "${file}"
 echo "删除旧文件${file}"
 else
 echo "没有找到旧文件"
 break
 fi
 let num--
 done
}

function main {
 compress
 delete_old_archives "${DEST_ALIYUN}"
 delete_old_archives "${DEST_SDB}"
}

main

这样一通操作下来,自认为安全方面是有保障了,只是比之前的全部本地稍微差一点点。vaultwarden也提供了比较全的导入导出功能,因此我原来的keepass数据可以很容易到导入,基本做到了无缝切换。使用了两天下来,网页端的自动填充功能确实要强大很多。同时内置了OTP功能,一些需要二次验证的服务,可以自动把OTP Code输入了,这个后面可以把原来用的一些转移过来。唯独的问题是,vaultwarden的OTP code无法放到vaultwarden中去。

本来打算这个服务搭好之后,让老婆也一起用,提高全家账号的安全性,然而她却说用不上,手机上基本不需要输入密码,没必要多记一个密码了。不过对于大部分人来说也确实是,短信登录加上微信登录已经解决了大部分场景,密码管理服务对他们来说只是伪需求。也可能只对于我们这一小部分爱折腾的人才比较有点用吧。

搭建这个服务,参考了不少网上的内容。关于docker的使用和shell脚本的编写,也多亏了GPT。最后在列出一些参考了的资料:

  1. Vaultwarden wiki 中文版
  2. 自建 vaultwarden / bitwarden_rs 密码管理器
  3. Lucky使用指南

看完评论一下吧

记国产手机无法在Chrome使用Passkey问题解决

众所周知,在国产Android系统上面,Google play service是被阉割掉的。部分厂商提供了打开google play service的选项,让我们可以登录google 账号,使用Google play store,以及部分的Google 云服务,但是Google password manager以及Credential Api确是没有的。在Android手机上面,Passkey是依赖于GMS和 Credential Manager API的,因此,国行手机上面也就没法使用passkeykey。不过使用Chrome浏览器的话,还是能够使用Passkey的,这是因为Chrome提供了相关的实现。然而,前几日Chrome升级后,我的Passkey突然就不能使用了。

首先尝试了重新卸载重装Chrome,手机的google账号管理里面测试passkey等等,结果还是不行。最后只得尝试在Google搜索,找了很多,发现了这样一个页面How do I use Passkeys in Google Chrome on Android?, 其中介绍的是如何在android手机上使用1password。其中关于chrome的flag部分引起来我的注意,因为Android 14后开始支持使用除了google password外其他的应用提供的passkey功能,所以我猜想可能是因为这个,google 最近改动了chrome关于passkey的逻辑,默认会使用手机系统的Credential Management Api而不是Chrome自己内置的Api。尝试了一下把这个Flag改为Disabled, 重启一下Chrome,Passkey又工作正常了。

操作方法为Chome地址栏中输入:

chrome://flags

然后搜索Passkey,出现这个条目之后,修改其设置。

另外还要说一下,虽然Chrome中的passkey使用问题解决了,但是因为手机内没有Credential Manager Api,应用还是没法使用passkey的。除此之外,通过手机扫码,让电脑使用passkey的时候,也会一直处在连接中,最后也会失败,目前这个也无解。因此,如果想要顺畅的使用Passkey只要两个解决办法,一个方式是换iPhone,另一个方法是买一个海外版的Android手机,比如Google 的Pixel,三星,或者尝试一下海外版本的ROM。

看完评论一下吧

我的个人密码存储与管理

作为一个网民,使用每个服务都需要注册账号,而注册账号就需要设置用户名和密码。在早期,我会将所有的密码都设置成相同的,这样方便自己记忆,每次输入密码也都很方便。

很久之前的一个同事,他会将自己的所有密码都记在一个小本本上。彼时,一些使用iPhone的朋友已经开始使用1Password来存储自己的密码了。而我,作为一个坚定的Android用户,此时还没有使用过任何的密码管理软件的。

直到某一天,Chrome提醒我我的密码已经泄露不安全了。此时便开始研究适合我的密码管理软件。 最终选择了Keepass作为我的密码管理软件。

经过几年的使用,使用的软件终于稳定下来了,在此分享一下。

目前我需要查看软件的平台有三个Mac 电脑, Windows台式机,以及我的Android手机。 Android手机我使用的是:Keepass2Android ,windows和mac下使用的是 KeePassXC。密码库是一个kepass文件,可以理解为一个加密数据库,必须通过主密钥才能打开。客户端本身不提供密码的多平台同步功能,我本人使用了坚果云来存储kepass文件,Android手机上keepass2Android通过webdav访问和同步密码库, 电脑上使用坚果云的客户端来同步密码文件。

密码管理工具首先能满足的功能就是创建密码,三个平台的客户端都能自动的生成密码,并且允许配置密码的字符,长度,密码安全等级检查,软件也支持过滤弱密码。

一个做的比较差的密码管理工具,是需要用户在每次输入密码的时候都打开密码管理工具,来复制密码回去再进行粘贴的。这方面1Password做的是最好的,有很多的自动输入或者选择来提高易用性。kepass的客户端当然也是有的。

Android客户端首先是支持Android系统的自动填充服务的,Android 8.0以后的手机就支持,需要在系统设置中设置自动填充服务为Keepass2Android,同时密码保存的时候要保存当前这个应用的package name这样才能自动填充对应的密码。当然也可以先搜索到这个密码后,软件会保存package name,下一次就可以自动选中这一条密码了。对于不支持自动填充服务的手机,或者应用开发者关闭了自动填充,也可以输入的时候把输入法切换为keepass2Android(前提需要在系统的输入法中启用keepass2Android的输入法)。

对于电脑上面,可以通过浏览器插件来实现密码的自动填充,目前edge,firefox,chrome都有对应的插件,可以在上面的链接中找到。对于网页的自动填充,还需要在创建密码的时候,把网址填到密码信息中。

国内的大部分账号目前都是短信验证码登录,用不到密码。另外一些银行或者金融类的限制了自动填充,甚至自己写了个键盘,还是只能切到密码管理器去看密码再回来手动输入进来,短期内也不会有所改善。

总体来说,目前大部分的重要密码都保存到了keepass中,文件也是自己管理,比1password这种托管的更放心一点。目前海外已经开始使用passkey来替代密码,相信未来密码的使用会越来越少。

看完评论一下吧

❌