2.1.2 数字生活

本系列本站链接:

本系列知乎链接:

其他

  • 家里云网盘:就是 群晖/飞牛 自身,不做赘述
  • CloudDrive2:融合多网盘用过的就知道了。
  • Home Assistant: 不如米家。

家里云笔记 Obsidian

安装上 obsidian 之后,采用self-hosted livesync 进行同设备同步, 这个是教程

家里云密码本的横向对比及其安装

黑灰产领域,每天都有人在入侵计算机系统,盗取有价值信息 盗取账号 转卖。一个密码走天下的话,其密码早已经存在于 黑客的密码本中,用来进行暴力破解,之所以 很多人都保留着我简单密码也没人盗号的错觉,原因在于 有二步验证(手机验证码)等额外手段的保护和概率随机性的原因。

提高了密码复杂度,又实在不好管理如此多的账号。在金融方面,安全和方便快捷 永远是一对矛盾。在互联网安全方面也类似,只能在两者之间寻找平衡。而无论是玩 PT 、VPS,都需要特别注意个人隐私和安全。所以我觉得密码管理器是必不可少的。

主流密码管理器有:Bitwarden(免费/自托管/付费)、KeePass(免费) 和 1Password(付费),以下是横向对比。

核心定位与模式

特性 Bitwarden KeePass (及衍生品) 1Password
核心模式 云端同步 + 开源 本地存储 + 开源 云端同步 + 闭源商业
商业模式 免费版功能强大,付费版(或者自托管)进阶功能 完全免费(开源免费) 订阅制,无永久授权
数据存储 加密后同步至官方云/自建云 加密数据库文件(.kdbx)完全本地,需手动同步 加密后同步至1Password官方云

1. 安全性与信任

  • Bitwarden
    • 优势:完全开源,代码经过多次独立安全审计。采用零知识加密,服务器端无法解密你的数据。提供自托管选项(使用Vaultwarden),对技术控和注重隐私的用户是巨大加分项。
    • 顾虑:信任其云端服务(尽管是加密的)。
  • KeePass
    • 优势极致安全与隐私。数据100%本地,不开源的安全软件更受隐私极客信赖。你可以完全控制数据库文件,甚至可以在气隙计算机上使用。
    • 顾虑:安全性高度依赖用户习惯。如果数据库文件丢失、损坏或未加密备份,且没有同步,可能导致数据永久丢失。
  • 1Password
    • 优势:闭源但拥有顶尖的安全团队和卓越的安全记录。设计上非常注重用户体验和安全的最佳平衡。提供独特的 “秘密密钥” 机制,与主密码共同解密,即使云端被攻破且主密码较弱,也极难破解。
    • 顾虑:代码不公开,依赖对公司的信任。必须使用其云端服务。
      2. 成本
  • Bitwarden个人免费版完全够用。付费版($10/年或者自托管)增加TOTP验证码生成器、紧急访问、健康报告等。
  • KeePass完全免费。所有平台客户端均由社区免费开发。
  • 1Password纯订阅制(个人约$2.99/月起,家庭约$4.99/月起)。提供14-30天免费试用。
    3. 易用性与体验
  • Bitwarden:界面简洁,功能直观。浏览器插件和移动端App体验良好,设置稍显技术化但不难。跨设备同步自动。
  • KeePass学习曲线最陡峭。官方客户端(Windows)界面老旧。需要自行解决同步问题(如通过Dropbox、Nextcloud、Syncthing等同步数据库文件)。需要自行选择并配置各平台的客户端(如KeePassXC, KeeWeb, Strongbox, KeePassDX等)。
  • 1Password公认用户体验最佳。界面精美,引导清晰,功能设计人性化(如“旅行模式”隐藏密码、详细的物品类型)。设置简单,开箱即用,同步无缝。
    4. 平台与扩展支持
  • Bitwarden全平台覆盖(Win, Mac, Linux, iOS, Android)。浏览器插件支持所有主流浏览器。命令行工具强大。
  • KeePass核心在Windows。通过第三方客户端支持其他平台,但体验不一。浏览器集成通常需要配合插件(如KeePassXC-Browser)。
  • 1Password全平台原生应用,体验一致且优秀。浏览器插件集成度极高。对Apple生态(Watch, Safari)支持尤其好。
    5. 高级功能
  • Bitwarden:自托管、安全分享、TOTP(付费 或者自托管)、数据泄露监控(付费)、API访问。
  • KeePass:插件生态丰富(可扩展密码生成、自动输入规则、连接WebDAV等),高度可定制。
  • 1Password:家庭共享(最多5人,带权限管理)、旅行模式、物品回收站、家庭数字遗产规划(紧急工具箱)、与隐私服务(如Fastmail)的深度集成。

总结与选择建议

适合人群 推荐工具 关键理由
隐私极客/技术爱好者/预算有限者 KeePass 要完全控制、100%本地、免费。不嫌麻烦,享受DIY过程。
大多数普通用户/平衡派 Bitwarden 追求高性价比,既要强大免费或低价,又要开源可信和便捷的云端同步。
家庭用户/追求最佳体验/苹果生态用户 1Password 愿意为顶级用户体验、无缝同步、出色的设计和家庭功能付费,信任其商业安全公司模式。
企业团队 Bitwarden 或 1Password 两者都有优秀的企业版。Bitwarden成本更低、可自托管;1Password体验更佳、服务更全面。

一句话概括

  • KeePass工具箱——完全自由,但所有事(尤其是同步)要自己动手。
  • Bitwarden瑞士军刀——开源、灵活、性价比高,兼顾了安全与便利。
  • 1Password精致家电——设计优美、体验流畅、开箱即用,但需要持续付费。

由于本文玩的是 自托管,那肯定就是 在 bitwarden 和 keepass 之间选择,bitwarden 体验比 keepass 要好。

密码管理器 vaultwarden 的两个版本

vaultwarden 是 bitwarden 的轻量实现版本,能够完全兼容官方的 app,并且所需资源更小,适合部署在 1c1g 的小 vps 上。vaultwarden 存储存储用户数据所使用的数据库 可以是 基于文件的 sqlite 或者 mysql .

简而言之,SQLite适合轻量级、低负载的使用场景,而MySQL/MariaDB适合需要扩展、高并发和高可用性的环境。

两者对比如下。

Vaultwarden使用SQLiteMySQL/MariaDB作为后端数据库时,主要区别体现在以下几个方面:

  1. 性能和可扩展性:
    • SQLite:轻量级、适合小规模部署,性能瓶颈在高并发和大数据量下。
    • MySQL/MariaDB:高性能,适合大规模部署,支持高并发和水平扩展。
  2. 维护与配置:
    • SQLite:无需单独的数据库服务器,简单易用,但功能受限。
    • MySQL/MariaDB:需要配置数据库服务器,支持复杂的管理和调优,适合团队或大型部署。
  3. 冗余与容错:
    • SQLite:无内建冗余,单一数据库文件,易受损。
    • MySQL/MariaDB:支持主从复制、集群等冗余配置,高可用性和故障恢复能力强。
  4. 事务处理:
    • SQLite:适合低并发写入,高并发时性能受限。
    • MySQL/MariaDB:强大的事务支持,能处理复杂事务和高并发写入。
  5. 使用场景:
    • SQLite:个人用户、小规模应用,低并发、低数据量。
    • MySQL/MariaDB:中大型团队或企业,需支持高负载和高可用性。

Vaultwarden sqlite 版本

在部署 docker 容器前,为了方便管理,一般都将 docker 容器的配置和产生的数据集中放置到同一个 目录。假设 我在群晖 部署,也就是首先在 /volume1/docker 创建一个 vaultwarden 目录,然后再 新建一个 docker-compose.yml 的文本文件,将如下内容粘贴进去,并修改一些注意事项提到的东西,改成自己的内容, 最后 在命令行执行 docker compose up -d

部分解释说明:

  1. environment 中 的 DOMAIN 填写自己的域名
  2. volumes 卷映射处,首先在 vaultwarden 目录下先创建一个 data 目录
  3. ports 暴露端口选择包括到 本地或者 某个端口,再通过 Nginx 反向代理 加上 SSL 再暴露出来, http 直接访问是无法使用的。

第三点为什么要这么做?因为 本服务是一个密码管理器的服务,安全尤为重要。 程序启动以后,用户访问 vaultwarden 的http 协议的网络通讯是明文,会造成安全隐患,因此通过 http://ip:ports 的方式是无法访问的,一定得加上 ssl 反向代理加密通讯内容 才行。

整个网络通讯过程如下图:用户 其实是间接和 vaultwarden 通讯的,Nginx中间人充当一个加密和解密的角色,用户 和 Nginx 协商好一个加密方式和密钥,两者间所有的通讯内容都采用该方式加密。例如用户说 “查询一下 gmail 的账户密码是多少”, 浏览器加密一下 这句话,发到 Nginx, Nginx 再将其解密后发到 vaultwarden, vaultwarden于是就查询,接着对 Nginx 说 “你的 gmail 账户是 [email protected], 密码是 12345678”, Nginx 以协商好的方式和密钥 加密这段话,回复给用户,用户再解密得到 账户密码。

用户 和 Nginx 间的通讯是发生在公网的,受加密保护,而Nginx 和 vaultwarden 间的通讯发生在局域网内部,没有加密。

用户  --> Nginx() -> vaultwarden 
                         |
                         |
                         \/
用户 <-- Nginx <-- vaultwarden                  
services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      - DOMAIN=${VAULTWARDEN_DOMAIN:-https://vault.your.domain}
    volumes:
      - ./data/:/data/
    ports:
      - "127.0.0.1:8002:80"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80/alive"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 30s
    logging:
      driver: "json-file"
      options:
        max-file: "3"
        max-size: "10m" 

VaultWarden mysql 版本

具体的部署过程同 sqlite 版本大同小异。

解释说明:

  1. mysql 版本的 vaultwarden 需要启动两个容器:mariadb 和 vaultwarden.
  2. 卷映射:首先在集中管理容器的根目录创建一个 vaultwarden 的目录,例如 vaultwarden-mysql, 接着在该目录下创建 mariadb-data.
  3. environment 环境变量:为了避免在 compose.yml 泄露密码,首先创建一个 .env 文本文件,如下所示,上面记录一些密码环境变量. 将 ADMIN_TOKEN 对应的值 lQTQseoHLlwWfIiIvpzj930jMoosVLTD 改成另外一个即可, 将MYSQL_PASSWORD 对应的值 password19700101 另外一个密码,或者保持默认即可。
  4. ports 端口映射: 端口映射 可以采用 127.0.0.1:9000:9000 或者 "REVERSE_PROXY_SERVER_IP:9000:9000" ,只将端口开放给 特定 IP,例如 本地 或者 https 反向代理的服务器。
ADMIN_TOKEN=lQTQseoHLlwWfIiIvpzj930jMoosVLTD
MYSQL_ROOT_PASSWORD=password19700101
MYSQL_PASSWORD=password19700101
MYSQL_DATABASE=vaultwarden
MYSQL_USER=vaultwarden
DATABASE_URL=mysql://vaultwarden:password19700101@vaultwarden-db/vaultwarden
services:
 vaultwarden-db:
  image: mariadb
  container_name: "vaultwarden-db"
  restart: always
  env_file:
   - ".env"
  volumes:
   #- "vaultwarden-db_vol:/var/lib/mysql"
   - "./mariadb-data:/var/lib/mysql:rw"
   - "/etc/localtime:/etc/localtime:ro"
  environment:
   - "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}"
   - "MYSQL_PASSWORD=${MYSQL_PASSWORD}"
   - "MYSQL_DATABASE=vaultwarden"
   - "MYSQL_USER=vaultwarden"
  healthcheck:
   test: mariadb-admin ping -h 127.0.0.1 -u vaultwarden --password=${MYSQL_PASSWORD}
   start_period: 5s
   interval: 5s
   timeout: 5s
   retries: 55
   
 vaultwarden:
	  image: "vaultwarden/server:latest"
  container_name: "vaultwarden-mysql"
  hostname: "vaultwarden-mysql"
  depends_on:
   vaultwarden-db:
    condition: service_healthy
  restart: always
  env_file:
   - ".env"
  volumes:
   #- "vaultwarden_vol:/data"
   - "./vw-data:/data"
  environment:
   - WEBSOCKET_ENABLED=true
   - DATABASE_URL=mysql://vaultwarden:${MYSQL_PASSWORD}@vaultwarden-db/vaultwarden
   - ADMIN_TOKEN=${ADMIN_TOKEN}
   - RUST_BACKTRACE=1
  ports:
   - "127.0.0.1:9000:9000"

     #volumes:
     # vaultwarden_vol:
     # vaultwarden-db_vol:

反向代理服务Nginx的 部署

此处参考《将私服暴露到公网, 安全便利地回家及无缝网络服务》

由于 Nginx 配置更加复杂,本文采用更简单的 nginx proxy manager, 部署和配置都非常简单。

说明:

  1. 目录管理:同理为了便于集中管理, 在 容器统一管理根目录下创建 npm 目录,并建立 docker-compose.yml 文件,粘贴如下内容
  2. 卷存储映射:在目录下面创建 letsencryptdata, 用于存储 letsencrypt 证书和 npm 及nginx 等等的配置数据,例如 npm/data/database.sqlite 存储每个 nginx 反代的host的配置,npm 会根据这个数据中的内容自动生成在 npm/data/nginx/proxy_host 中给nginx真正读取到 host 配置。
services:
  nginx-proxy-manager:
    network_mode: "host"
    container_name: npm
    image: 'docker.io/jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    dns:
      - 127.0.0.1

在部署好服务后,需要简单配置一下。

  • 证书配置。证书配置可以采用自签名证书, 或者 证书机构颁发的证书。
  • Proxy host 配置.

证书配置:选择 custon 则自己上传准备好的证书文件,如 certicate key 和 certificate file. 选择 letsencrypt 则需要填写 对应域名的托管服务器的 api key token 之类的信息来自动获取 3个月一次更新的免费证书。如下图展示的是使用 腾讯的 DNSpod 域名托管商时,填写对应的域名、邮箱、托管平台上账户的 id 等信息,当然事先需要将自己的域名托管到该平台上。


Proxy host 一般来讲,代理项目的添加比较简单,在如下图中 Details 和SSL 两栏中,填写好域名、http/https 协议、转发请求的目标机器的 IP 和对应端口,最够勾选一下 缓存静态资源 “cache assets”, 支持 websockets 协议 即可。接着填写 SSL 证书内容。选择自己的证书后,勾选 强制 SSL 即可。如无以外能正常通过域名访问了,但是有些情况 因为 跨域请求 等问题还不行,需要手动更多 nginx 的配置。本文的 vaultwarden 目前不需要继续配置。

4 个赞