Ubuntu Weekly Recipe

第807回Vaultwardenでパスワードをセキュアに管理しよう

パスワードの安全な管理は頭の痛い問題ですよね。そもそも今時であれば、パスワードレス認証に移行すべきではあるのでしょう。ですが世の中のサービスすべてが、すぐにパスワードレス認証に対応してくれるわけでもありません。まだまだしばらく人類とパスワードの戦いは続きそうです。

パスワードを少しでも安全に使うためには、⁠十分に複雑で長い文字列を使う」⁠使い回しを避ける」といった対策が必須です。しかし十分な強度のパスワードを、サービスの数だけ暗記するのは、人間の頭脳では困難です。

図1 パスワードの暗記を諦めた人類は、こうしたアイテムに手を出しがちである
図1

そこで登場するのが「パスワードマネージャー」です。筆者は以前より、第508回でも紹介したpassword-storeを愛用していました。これはGPGで暗号化したテキストファイルをGitで管理するための、シェルスクリプトで実装されたパスワードマネージャーです。シンプルで使いやすいこと、シェルスクリプトで簡単に機能拡張できること、フォーマットの自由度が高いこと、コマンドラインとの親和性が高いこと、使い慣れたツールで構成されていることなどが採用の決め手でした。

図2 サイトのURL、ユーザー名、パスワード、OTPなどは連続して入力することが多いため、筆者は対話的に各項目をコピペできるpassword-storeのラッパーを使っている。これはシェル関数で実装した
図2

個人利用であれば、password-storeは非常に便利で気に入っているのですが、いくつか問題もあります。まず万人向けではない点です。会社などの組織では、部門でパスワードを共有したい場合もあるでしょう。ですが全員にGitとGPGの使用を強制するのは、少しハードルが高いと言わざるをえません。

次に、フォーマットが自由すぎる問題です。password-storeの中身はテキストファイルのため、フリーフォーマットで記述できます。フォーマットを強制する仕組みがないため、あらかじめ決めたルールを自主的に守らないと、簡単に管理は破綻します。Android用クライアントが長らく更新されておらず、機能的に不満がある点もマイナスです。

こうした背景もあり、筆者はもう少し一般向けのパスワードマネージャーへの乗り換えを決意しました。そしてその乗り換え先がBitwarden(Vaultwarden)です。

Vaultwardenとは

Bitwardenは、クライアントサーバー方式を採用している、オープンソースのパスワードマネージャーです。SaaSとしてサービスが提供されているため、ユーザー登録だけで簡単に使いはじめられます。サーバーサイドでデータを管理するため、複数デバイスやユーザー間でのパスワードの共有がしやすく便利です。

個人であればこうしたSaaSの利用がおすすめなのですが、企業などでは「機密情報を第三者に預けるなどまかりならん!」ということもあるでしょう。実はBitwardenにはオンプレミス版が用意されていて、組織内で独自に運用することもできます。それではUbuntuにBitwardenサーバーをインストールしましょう……と言いたいところなのですが、今回これは使いません。というのもBitwardeのオンプレミス版は、インストールするためにインストールキーの請求が必要なためです。この時点で、大抵のユーザーは回れ右でしょう。また一部の機能がロックされており、ロックを解除するにはSaaS版にアカウントを作った上で、有償のプレミアム版の契約が必要です。

前フリが長くなりましたが、ここでようやく登場するのがVaultwardenです。これは非公式なBitwardenサーバーの代替実装です。ユーザー登録といった面倒な作業なしに使えますし、もちろん機能制限もありません。そしてAPIに互換性があるため、スマホアプリも含めたBitwarden用のクライアントをそのまま流用できます。

Vaultwardenのインストール

Vaultwardenは、HTTPSコンテキストでのみ使用できる暗号化APIを使用しているため、適切に動作させるにはHTTPS化が必須です。そして今時のWebアプリあるあるですが、自己署名証明書を使うと、クライアントの様々な警告を黙らせる必要があり、逆に面倒です。そこでLet's Encryptによる正規のSSL証明書を取得することにします。サーバーがインターネットからアクセスできること、またドメインを所持しており、サーバーの名前解決が可能であることを前提に解説しますのでご了承ください。

なおSSLの処理は前段にリバースプロキシを配置して、そちらに任せることにします。使用するリバースプロキシはnginxです。ベースOSにはUbuntu 22.04 LTSを使用しました。Vaultwarden自体はコンテナで動かすのですが、コンテナ実行環境としてはDockerではなく、Podmanを使用しました。Dockerを使いたい人は、適宜コマンドを読み替えてください。

以下のコマンドで、必要なパッケージをインストールします。

$ sudo apt install -y nginx podman certbot python3-certbot-nginx

certbotコマンドでSSL証明書を発行します。-dオプションで、サーバーのFQDNを指定してください。いくつか質問が表示されますので、対話的に回答を入力してください。

$ sudo certbot --nginx -d サーバーのFQDN

/etc/nginx/sites-available/defaultというファイルを、以下の内容に書き換えてください。server_nameや証明書のパスには、サーバーのFQDNを指定する必要があります。お使いのサーバーのドメイン名にあわせて、適宜変更してください。

upstream vaultwarden-default {
  zone vaultwarden-default 64k;
  server 127.0.0.1:8080;
  keepalive 2;
}

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      "";
}

server {
	listen 80 default_server;
	listen [::]:80 default_server;
	server_name _;
	root /var/www/html;
	index index.html index.htm index.nginx-debian.html;

	location / {
		try_files $uri $uri/ =404;
	}
}

server {
    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    server_name サーバーのFQDN;
	root /var/www/html;
	index index.html index.htm index.nginx-debian.html;

    ssl_certificate /etc/letsencrypt/live/サーバーのFQDN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/サーバーのFQDN/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_pass http://vaultwarden-default;
    }
}

server {
	listen 80 ;
	listen [::]:80 ;
    server_name サーバーのFQDN;

    if ($host = サーバーのFQDN) {
        return 301 https://$host$request_uri;
    }
    return 404;
}

nginxを再起動します。

$ sudo systemctl restart nginx

/srv/vaultというディレクトリを作成し、ここにデータベースを格納することにします。パスワードマネージャーのデータベースですから、パーミッションには気をつけてください。

$ sudo install -o root -g root -d -m 700 /srv/vault

PodmanでVaultwardenのコンテナを起動します。--restart alwaysオプションをつけているため、ホストの再起動後も自動的にコンテナが起動します。

$ sudo podman run -d --name vaultwarden -v /srv/vault/:/data/ --restart always -p 8080:80 docker.io/vaultwarden/server:latest

Vaultwardenの使い方

Webブラウザから、⁠https://server_nameに設定したホスト名」にアクセスします。Vaultwardenのログイン画面が表示されますので、まずは「アカウントの作成」をクリックしてください。

図3 最初はアカウントが存在しないので、サインアップから
図3

メールアドレス、名前、マスターパスワードを入力して「アカウントの作成」をクリックします。

図4 マスターパスワードは紛失すると、サーバー管理者でもデータを復元できないため注意
図4

アカウントの作成が完了したら、再度ログイン画面に戻り、メールアドレスとマスターパスワードを入力してください。Vaultwardenにログインできます。

図5 初期状態のVaultwardenのWebインターフェイス
図5

Vaultwardenでは、ログイン情報やカード情報といった機密情報を「アイテム」という単位で管理します。右上の「新規作成⁠⁠→⁠アイテム」をクリックしてください。

新しいアイテムの作成ダイアログが表示されるので、必要な情報を入力していきましょう。アイテムのタイプは「ログイン」⁠カード」⁠ID」⁠セキュアメモ」の4種類があります。⁠ログイン」は一般的なユーザー名とパスワードなど、⁠カード」はクレジットカード情報、⁠ID」はパスポート番号、免許証番号、社会保証番号といった個人的な情報、⁠セキュアメモ」はフリーフォーマットで任意のメモを記述できます。一般的な用途であれば、⁠ログイン」「カード」以外はほぼ使わないのではないでしょうか。他のアイテムにもフリーフォーマットのメモ欄が存在しますので、ちょっとした付帯情報であればここに記述できます。

アイテムは「フォルダ」を使って整理できます。⁠Webサービス」⁠銀行」⁠オンラインショップ」のように、ジャンルごとにフォルダを作成すると便利です。

ユーザー名、パスワード、認証キー、URLなどを入力しましょう。パスワードはランダムなものをこの場で生成したり、そのパスワードが流出していないか確認することもできます。なお認証キーを入力しておくと、自動的に6桁のTOTPを計算してくれ、コピペが可能になります。非常に便利な機能ですが、本家Bitwardenでは、この機能は有償プランを契約しないと使えません。この点もVaultwardenのアドバンテージですね。ただし2要素認証のシークレットは、パスワードマネージャーに登録した時点で、2要素認証の体を成さなくなってしまう点には注意が必要です。

「カスタムフィールド」には、ユーザーが自由にフィールドを追加できます。

図6 ちなみに筆者は、クレジットカードを登録しているWebサービスを忘れないよう、⁠card」フィールドを作っている。こうしておくことで、カードが新しくなった時の再登録作業が、格段に楽になる
図6

登録したアイテムは、保管庫内に一覧表示されます。より詳しい使い方は、Bitwardenのマニュアルを参照してください。

図7 右側にあるケバブメニューをクリックすると、ここからユーザー名やパスワードをクリップボードにコピーできる
図7

会社など複数人でパスワード共有したい場合は、⁠組織」を作り、組織の保管庫を使ってアイテムを管理します。組織では「フォルダ」のかわりに「コレクション」でアイテムへのアクセスを制限するなど、多少使い方が変わります。こちらもBitwardenのマニュアルを参照してください。

Bitwardenクライアントのインストール

VaultwardenはWebブラウザでも利用できますが、専用のクライアントアプリも存在します。UbuntuではSnapパッケージでインストールできます。

$ sudo snap install bitwarden

アプリを起動すると、ログイン画面が表示されます。⁠ログイン先」をクリックして、サーバーのFQDNを指定してください。

図8 そのままだとBitwardenのSaaSに繋がってしまうため、接続先を変更してログインする
図8

ユーザー名とパスワードを入力してログインします。Web UIをそのままアプリ内に落とし込んだような作りのため、特に戸惑うこともなく使えるでしょう。

図9 先ほどブラウザから登録したアイテムが、アプリから確認できた
図9

Ubuntuで動くBitwardenクライアントには、大きく「Bitwardenが配布しているDebパッケージ」⁠AppImage」⁠Snap」の3つが存在しますが、インストールやアップデートの手間を考えると、Snapが一番おすすめです。

コマンドラインクライアントを使う

サーバーから利用するような場合は、CLIから使えるクライアントもほしくなりますよね。BitwardenにはLinux向けのCLIクライアントも用意されています。そしてUbuntuでは、こちらもSnapでインストールできます。以下のコマンドでbwパッケージをインストールしてください。

$ sudo snap install bw

CLIクライアントもGUIアプリと同じく、接続するサーバーを変更します。bw config serverの引数にサーバーのURLを指定してください。

$ bw config server https://サーバーのFQDN

サーバーにログインします。ユーザー名とパスワードを入力してください。

$ bw login

ログインに成功すると、セッションキーという文字列が表示されます。メッセージにあるように、このキーを環境変数BW_SESSIONとしてエクスポートしてください。

図10 bashならばexport BW_SESSION='xxxx'を実行する
図10

環境変数BW_SESSIONにセッションキーがセットされていると、bwコマンドで様々な操作が可能になります。例えばbw list itemsで、保管庫内の全アイテムをJSON形式で取得できます。

$ bw list items

JSON形式で取得できるところがポイントで、jqなどのパーサーと組み合わせることで、より複雑な処理を組立てることもできます。例えば前述の通り、筆者はクレジットカードを登録しているサービスのアイテムには、⁠card」という独自フィールドを追加しています。そのため以下のコマンドで、クレジットカードを登録しているサービスの一覧を取得できるわけです。もう少しフィルタを追加すれば、カードの種類で絞り込むこともできます。カードが新しくなった時は、ここに表示されるサービスに対して、登録情報を変更すればよいというわけです。

$ bw list items | jq -r ".[] | select(.fields != null) | select(.fields[].name == \"card\") | .name"

bw get passwordにアイテムIDを指定すると、パスワードを取得できます。アイテムIDはbw list itemsで調べられます。

$ bw get password アイテムID

Vaultwardenを使い終わったら、以下のコマンドでログアウトしてください。これで発行されたセッションキーが無効になります。セッションキーをそのまま放置するのはセキュリティ上問題ですから、ログアウトは忘れないようにしましょう。

$ bw logout

組織のパスワード管理にVaultwardenはオススメ

いよいよ新年度がはじまりました。色々なアカウントが大量に発行されてしまい、その管理に困ってしまう新入学生や新社会人も多いのではないでしょうか。それに伴って必ず発生する、無数の「パスワードを忘れました」に、情シス部門は対応しなくてはならないことでしょう。お互いの苦労を軽減するためにも、職場や研究室にVaultwardenを用意するのはよい考えです。

世間には「そもそもパスワード管理なんかしない(なので忘れる⁠⁠忘れないよう)覚えやすいパスワードを全サービスで使い回している」という人が多く存在します。こうしたユーザーの存在は、組織としてはセキュリティリスクにもなります。使いやすいパスワードマネージャーを最初から用意してあげることで、こうした問題を少しでも減らす手助けになるかもしれませんね。

なに? マスターパスワードを忘れそう? ……パスワード管理ノートにメモして、金庫に入れておくのはどうですかね。

おすすめ記事

記事・ニュース一覧