背景

いや、ちょっとこれも恥ずかしい話なんですがね。 僕は長いこと、「自作パスワード管理システム」的なものを運用していました。

どうやっていたかというと、 自前ホストしているRocket.Chat に、自分専用のチャンネルをひっそり立てて、 誰も入れないように鍵をかけて、 そのスレッドに “ログイン情報をラベル付きで投稿する” という、 ある意味 究極のアナログ DX をやっていたわけです。

もちろん一応、安全面は全く考えてなかったわけではなくて、

  1. Rocket.Chat のデータは gocryptfs で暗号化されたストレージに保存
  2. 通信経路は https で暗号化
  3. サーバは自分の管理下
  4. チャンネルは自分しかアクセスできない

と、一応「最低限の安全性」は確保しているつもりでした。 だけど、世の中ではみんな LastPass だの 1Password だの Bitwarden だのと言っているじゃないですか。 僕はこういう “流行り物” に疎いところがちょっとあって、 「パスワード管理ツールって本当に必要?」 と長年スルーしていたんですよね。 そんなとき、エンジニアの先輩から 「Bitwarden の OSS クローンで Vaultwarden っていうのがあって、自前ホストも簡単で、めっちゃ良いよ」 とすすめられました。

で、触ってみたら、UI も綺麗だし、ストレージ管理もラクだし、 正直「これはかなりイケてるな」と感じたわけです。

しかし、ここから僕の悪い癖が発動します。

“仕組みが分かっていないものに重要な情報を預けるのが嫌”

これは性格なんですが、 ブラックボックスは信用できない。 暗号化の仕組みがわからないと不安になる。

果たして、 自前のサーバ(しかもレンタル)に Vaultwarden を置いて、 そこに人生の全パスワードをぶち込んで大丈夫なのか? という疑念がどうしても消えない。

結論から言うと: Vaultwarden(Bitwarden)は、むしろ「Rocket.Chatにパスワードを書いてた頃の比じゃないほど安全」だった。

調べれば調べるほど「これは信頼できる暗号設計だな」と感じたので、 今回はその 安全性の仕組み をブログとしてまとめたいと思う。

安全性の評価

Bitwarden / Vaultwarden が扱う暗号モデルは、 いわゆる ゼロ知識暗号(Zero-Knowledge Encryption) である。

つまり:

  • サーバはユーザーのパスワードを一切知らない
  • サーバは復号に必要な鍵も持っていない
  • 復号はすべてクライアント側で行う

その結果、サーバに保存されているのは 暗号化されたゴミの山 だけ。

サーバには暗号化されたものしか送られないので、 たとえ僕の Vaultwarden サーバが、 乗っ取られても、データが盗まれても、ハッキングされても 攻撃者は「マスターパスワード」が分からない限り絶対に復号できない。

じゃあマスターパスワードはどう管理してるの?

これが面白くて、

  • マスターパスワードの “ログイン判定用ハッシュ値” はサーバに保存される
  • けど、これは復号鍵とは関係ない
  • 復号鍵(MasterKey)はクライアント側で Argon2 から毎回作る
  • サーバに鍵は送られない
  • 暗号化処理も復号処理も全部クライアント側で完結

という 二重構造になっている。

結果として: サーバが知っているのは「暗号化されたデータ」と「ログイン判定用のハッシュ値」だけ 復号に必要な鍵は一切サーバに存在しない という強力な仕組みが成立しているわけ。

Rocket.Chat の頃と比べると、 「セキュリティの構造が根本的に違う」ことに気づいて震えた。

懸念点

もちろん弱点がないわけではない。

ただ1つ、Vaultwarden の最大の弱点は:ストレージが壊れたら終わり

Bitwarden は暗号化データと鍵の保存をすべてサーバ側に依存しているので、 サーバの /data ディレクトリが消える=復元不可 となる。 つまり:

  • ストレージ障害
  • ディスク破損
  • rm -rf 誤爆
  • コンテナ破損
  • VPS 消滅(あるある)

こういうのが発生すると、 マスターパスワードを知っていても データは戻ってこない。 だから俺みたいに 「サーバを DIY で運用している人間」ほど、 必ず冗長化・バックアップを考える必要がある。

これを甘く見ると、本当に全データが消える。

まとめ

まとめ文章(最後に入れると締まる)

Vaultwarden は OSS でありながら、 商用パスワード管理アプリと同等、 もしくはそれ以上に強固な暗号モデルを備えている。

Rocket.Chat にパスワードを書いていた頃と比べると、 安全性は天と地ほど違った。

そして唯一の弱点である 「ストレージ障害が即詰み」 という部分も、冗長化を組めば十分対策できる。

安心して自前ホストできるパスワード管理ツールとして、 Vaultwarden はかなり優秀だった。