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

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

---

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

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

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.x`と`SQL Server 2017`といういかにもMicr○s○ftな構成になります。
~~Linux版もあるし別にいいんですけど~~

bitwardenは、先述のようにオープンソースなので、有志がunofficialで様々な実装をしています。その中の一つに**[bitwarden-serverless](https://github.com/vvondra/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にペタリしてくださいな。

- [IAMCredentials.json](https://gist.github.com/ycrack/2a9fec10c904768fe880123be17b637f)

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

```bash
$ 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でおｋ
```

## 2. Sourceのclone～デプロイ
ここは基本的にREADMEに書いてあるとおりです。

```bash
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回~~

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

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

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

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

## 番外編：Chromeからのインポート
Googleに（＊）のシワの数まで知られてるなんて人もいると思いますが、これをbitwardenにブチ込む方法もあります。

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

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

```bash
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: sample@example.com
? 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のなんとなくの理解にはもってこいかな、とも思います。