【無料】bitwardenをawsにserverlessでセットアップする


【追記 2019/11/01】完全無料なのは12ヶ月、1年間だけでした。API Gatewayが永年無料枠では無かったことを見落としていました。


パスワード管理、皆さんどうしてますか?私は警告を無視して使い回し、影響が検知されたところから変更、みたいなことをしてました(ダメじゃん)。

楽ちんなのはパスワードマネージャーですが、どうにもプロプライエタリな営利企業によるサービスには渡したくない。そんなあなたにbitwardenというものがあります。

bitwardenも8bit Solutions LLC.という営利企業による開発なのですが、オープンソースなのでセルフホスティングが可能です。

ここで悩むのが「どこにホスティングするか?」というところ。セキュリティに自信ニキは自宅鯖でもいいのかもしれませんが(そもそもパスワードマネージャーなんて使わないか)、私は自信がないし自宅のVPNもルーターの簡易機能を使ってるのであんまり安定しない。となると思いつくのはVPSやクラウドですが、公式のインストール方法によると、要求スペック(以下)が結構重く、無料でのホスティングはちょっと厳しそう。

SYSTEM REQUIREMENTS

  • Processor: x64, 1.4GHz or faster
  • Memory: 2GB of RAM or more
  • Storage: 10GB or more
  • Docker: Engine 1.8+ and Compose 1.17.1+

しかもDockerを使わないとなると、.NET Core 2.xSQL Server 2017といういかにもMicr○s○ftな構成になります。
Linux版もあるし別にいいんですけど

bitwardenは、先述のようにオープンソースなので、有志がunofficialで様々な実装をしています。その中の一つにbitwarden-serverlessというのがあったので試したのですが、セットアップで結構躓いたので、躓かない(であろう)方法を書き残しておきます。

前書きが長かった。反省している()

TL;DR

こんな後ろにあるTLDR見たことないヨ

  1. iAMユーザーを作る
  2. aws-cliに設定する
  3. bitwarden-serverlessをcloneしてくる
  4. デプロイ
  5. 設定

Requirements

  • git
  • npm
  • aws-cli
  • awsアカウント

細かく書くと某de_moduleみたいに大変なことになりそうなので、この辺は導入方法書かなくても分かって(嘆願)。aws-cliはpipが楽だよ。

(追記) nodeでも大丈夫でした

Structure

  • CloudFormation
  • API Gateway (12ヶ月無料)
  • CloudWatch
  • DynamoDB
  • Lambda
  • s3

Setup

1. iAMユーザーを作る → aws-cliに追加する

この辺はまだserverless frameworkに共通の部分。
ポリシーは新しくserverless用のを作成しますが、serverless公式のものでは上手く行かなかったので、Forkして必要なものを追加したものを用意しました。ポリシーの作成からjsonにペタリしてくださいな。

ユーザーが作成されるとAPIkey/Secretが出せるページになるので、aws-cliにコピペします。同時にCLIも開いておくと良いかも?

$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE # APIkey
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY # Secret
Default region name [None]: ap-northeast-1 # お好みで…
Default output format [None]: # そのままEnterでおk

2. Sourceのclone~デプロイ

ここは基本的にREADMEに書いてあるとおりです。

npm i -g serverless
git clone https://github.com/vvondra/bitwarden-serverless.git
cd bitwarden-serverless
npm i
serverless deploy --region ap-northeast-1 -v

成功すれば、ServiceEndpointとしてhttps://abcd01234.execute-api.ap-northeast-1.amazonaws.com/prodみたいなのが出てきます。

3. クライアント側の設定

この段階ではまだ「サーバーが建った」だけなので、bitwardenのアカウントを作ったりしないといけません。

その前に。
そ の 前 に 。 ダイジな事なので2回

クライアントにサーバーの設定をします。簡単です。
設定」をクリックすると、セルフホスティング環境の項目があるので、サーバーURLのところに、さっき出てきたServiceEndPointをペタリして、保存をクリック。

続いてアカウントを作ります。と言っても、メールアドレスと設定するパスワードを入れるだけなので、メール認証とかも飛びません(飛ばそうと思えば飛ぶのか…?)。パスワードのヒントも自由に設定できます。ここでのパスワードはマスターパスワードと同義なので、(間違えないとは思うけれど)一応。

あとは使うデバイスでログインすればおk。ログインの前にServiceEndPointの設定をお忘れなく。

(追記) どうもモバイルデバイスではうまくログインできないようです。

番外編:Chromeからのインポート

Googleに(*)のシワの数まで知られてるなんて人もいると思いますが、これをbitwardenにブチ込む方法もあります。

Chromeでエクスポート

chrome://settings/passwordsを開くと保存されたパスワード一覧が出てくると思いますが、「保存したパスワード」の右端若干上のをクリックするとエクスポートボタンが出てきます。エクスポートにはSystem(OS)のAdmin権限が必要です。csvで出力されます。

bitwardenにインポート

本来ならweb vaultからGUI操作でインポートするらしいのですが、bitwarden-serverlessではweb vaultが実装されていないので、CLIでインポートします。
場合によってはDynamoDBの書き込みキャパに引っかかるかも?とのこと。

npm i -g @bitwarden/cli
bw config server <api gateway url>
# e.g. https://abcd01234.execute-api.ap-northeast-1.amazonaws.com/prod/
# スラッシュ有

bw login
? Email address: [email protected]
? Master password: [hidden]
You are logged in!

To unlock your vault, set your session key to the `BW_SESSION` environment variable. ex:
$ export BW_SESSION="5PBYGU+5yt3RHcCjoeJKx/wByU34vokGRZjXpSH7Ylo8w=="
> $env:BW_SESSION="5PBYGU+5yt3RHcCjoeJKx/wByU34vokGRZjXpSH7Ylo8w=="

You can also pass the session key to any command with the `--session` option. ex:
$ bw list items --session 5PBYGU+5yt3RHcCjoeJKx/wByU34vokGRZjXpSH7Ylo8w==

# session keyをexportしてvaultをunlockする
export BW_SESSION="5PBYGU+5yt3RHcCjoeJKx/wByU34vokGRZjXpSH7Ylo8w=="

bw import chromecsv <path>
bw sync

エクスポートされたcsvファイルは一応消しておきましょう(パスワードが平文で載ってます)。

2FAは使えるみたいですが、個人的にデメリットのほうが大きく感じているのでまだ試してません。
また、独自ドメインについてはドメイン取得で料金が発生するので触れませんでしたが、AWS Certificate Managerでcloudfront向け(要はus-east-1)で証明書を発行してやれば出来るっぽい。詳しくはbitwarden-serverlessのREADME内のRun on own domainにあるのでお読みになって。

デプロイした後にLambdaで関数の設定を見てみたところ、トリガーやリソース呼び出しが図式で表示されたので、serverlessのなんとなくの理解にはもってこいかな、とも思います。