KeePassXC で AWS アカウントを便利に運用する

## はじめに

これは [KWC Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kwc) の記事です。

KWC でバックエンドエンジニアをしている @kwc_takemori です。
皆さんはお仕事で利用するアカウントをどのように管理していますか？
私は普段 KeePassXC を利用させてもらっています。
これがとても便利なので、AWS アカウントを題材に、導入手順と簡単な使い方を紹介させていただこうと思います。

1Password や Bitwarden などのパスワード管理サービスを社内で公的に利用できず、色々悩みつつ結局ローカルのテキストファイルで手動アカウント管理になっているというような方々にとって一つの参考になれば幸いです。


## 個人的な選定理由

当初はメモ帳管理を止めたいぐらいのものだったのでさほど深い理由はありません。

- 無料
- MacOS と Windows 両方をサポートしている
  - 弊社は貸与 PC として Mac と Windows どちらにするか選べるので、両方サポートされているほうが周りに勧めやすい
- ローカルにデータを保持している
  - 機密データの在処がローカルというだけで色々な説明が通りやすい
- ブラウザに対する自動入力が可能
  - とても便利

KeePassXC の起源である KeePass でも上記は満たせますが、KeePass はサポート OS のメインが Windows で他 OS は非公式での対応かつ最新からは少し遅れているようだったので、バージョン周りで気を揉む要素が少なそうな KeePassXC にしました。


## 公式ドキュメント

公式のドキュメントが画像付きでとても親切なので、各機能の詳細が気になる方はご参照ください。（本稿でも引用させていただいています）
- [User Guide](https://keepassxc.org/docs/KeePassXC_UserGuide.html)
- [Getting Started Guide](https://keepassxc.org/docs/KeePassXC_GettingStarted.html)


## 動作確認環境

- MacOS 13.0.1
- KeePassXC 2.7.4
- Google Chrome 108.0.5359.98（Official Build） （x86_64）
- KeePassXC-Browser 1.8.3.1


## KeePassXC のインストール

[公式 Getting Started Guide のインストール手順](https://keepassxc.org/docs/KeePassXC_GettingStarted.html#_downloading_keepassxc)に基づいてインストールを行います。

もう解決しているみたいですが[「Microsoft Store」で KeePassXC の偽物が公開されていたりもした](https://forest.watch.impress.co.jp/docs/news/1445178.html)ようなので、できる限り公式ドキュメントに則り、公式の配布元からダウンロードしたインストーラでインストールすることをお勧めします。


## データベースの作成

KeePassXC では `.kdbx` 形式のファイルに、管理対象として登録したアカウント情報が保管されます。

初回はデータベースファイルの作成からスタートです。
KeePassXC を起動し、「新しいデータベースを作成する」をクリックします。
![start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/a96c32cd-fbeb-2e7d-f13c-60e4f1c77b4d.png)

データベース名を入力し、「続き」をクリックします。
![create_db_name.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/269c331f-f1c8-bfef-71d0-ea89c1744dfa.png)

全てデフォルトのままで「続き」をクリックします。
![create_db_encrypt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/f81142b8-8a4f-cb5c-ae09-d5e0a5aaf19b.png)

データベースを開くためのマスターパスワードを設定します。
パスワードとなる文字列を設定と確認のために二度入力し、「終了」をクリックします。
![create_db_password.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/f653ebed-4139-62ed-52f4-34d97cbedcd7.png)

別ウインドウでデータベースファイルの保存場所指定画面が表示されるので、ファイル名を入力し、保存場所を指定して「Save」をクリックします。保存場所は KeePassXC がファイルを読み書きできる場所なら任意です。

参考までに私は `~/.keepassxc/` ディレクトリを作成して、その直下に配置しています。


## データベースの開き方

よく利用する手順なので先に紹介しておきます。

デフォルト設定だと直近で開いたデータベースファイルを記憶しており、KeePassXC を起動すると自動で開いて下記のようなロック解除画面に遷移してくれます。データベースのマスターパスワードを入力して「ロックを解除」をクリックすることでデータベースを開くことができます。
![create_entry_unlock_db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/fbff1ed2-25eb-fd57-1c61-3f1b5632a28d.png)


## KeePassXC-Browser のインストール

KeePassXC-Browser というブラウザ拡張を各種ブラウザにインストールすることで、KeePassXC に登録したユーザ名やパスワードをサインイン画面の入力フィールドに自動入力することができるようになります。

具体的な対応ブラウザは[公式のユーザガイド](https://keepassxc.org/docs/KeePassXC_GettingStarted.html#_setup_browser_integration)を参照してください。

本記事では Google Chrome を利用します。
[chrome ウェブストア](https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk)にアクセスし、「Chrome に追加」をクリックします。
![plugin_install_add_extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/2916bf9d-5488-0758-816d-3ddf90abad6e.png)

確認画面がポップアップされるので、「拡張機能を追加」をクリックします。
![plugin_install_confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/0dcb2cb9-9086-ebb3-6fe0-d195963c1dde.png)

ローカルのデータベースへの再接続などで頻繁にクリックすることになるので、KeePassXC-Browser をすぐに利用できるように拡張機能のショートカットを固定しておくと便利です。
Chrome の URL 入力フィールド右にある拡張機能管理のアイコンをクリックし、KeePassXC-Browser の押しピンアイコンをクリックすると固定できます。
![plugin_install_pinning_extension.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/85408234-05ee-5cef-204f-0194b1029f3d.png)


## ブラウザ統合用の設定

ブラウザ統合機能を利用するためには、KeePassXC 側で機能の有効化を行う必要があります。

KeePassXC を起動して上部メニューの歯車アイコンをクリック後、右メニューの「ブラウザー統合」をクリックするとブラウザ統合の設定画面に遷移するので、下図の通りにチェックを入れて「OK」をクリックしてください。
![integration_setup_enable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/39ed7108-209c-0929-a340-bb68534be12f.png)

続いて KeePassXC-Browser と KeePassXC のペアリングを行います。
keePassXC を起動し、データベースを開いた状態で、ブラウザ上の KeePassXC-Browser のアイコンをクリックして「接続」をクリックします。
![integration_setup_pairing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/1f8888ef-a941-442e-3486-c2842f5dca4d.png)

下記のような画面がポップアップしてくるので、ペアリング用の ID となる文字列を入力して「アクセスを許可して保存」をクリックします。
![integration_setup_pairing_confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/e3100b03-9f51-8549-eb6a-ab99de75c858.png)


## エントリの追加

いよいよ AWS アカウントを管理対象として登録してみようと思います。

データベースを開いて、上部メニューの「+」をクリックします。
![create_entry_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/7d656bcc-d510-e273-0331-a0cf428bf44a.png)

下記を入力して「OK」をクリックします。
- タイトル：エントリーの名前
- ユーザー名：IAM ユーザ名
- パスワード：IAM パスワード
- URL：サインイン画面のベース URL

URL は KeePassXC-Browser が参照すべきエントリを特定するために利用されるので、サインイン画面のベース URL を入力する必要があります。`https://{{ AWS Account ID or Alias }}.signin.aws.amazon.com/console` 形式の URL はリダイレクトされてベース URL が変わるため、自動入力の対象エントリーとして認識されないのでご注意を。
![create_entry_input_entry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/d4aa12d7-601e-e851-ae21-9b5703446e32.png)


## KeePassXC-Browser からエントリに対するアクセス要求を許可する

登録したエントリを KeePassXC-Browser から参照できるように許可設定を行います。

データベースを開いた状態でブラウザから AWS マネージドコンソールのサインイン画面にアクセスすると、エントリへのアクセス許可設定画面が別ウインドウでポップアップするので、「記憶する」にチェックを入れて「選択したものを許可」をクリックします。
![integration_setup_allow_access_entry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/f8671d18-d1c7-06b6-9473-dcf7f7217bd3.png)

エントリーに参照できるようになると、ユーザ名入力フィールド上の KeePassXC-Browser アイコンが緑になるので、そのアイコンをクリックするとユーザ名とパスワードが自動で入力されます。
![integration_setup_auto_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/da722bf5-a332-21a2-f40f-c105a656784d.png)

もし自動入力がうまくいかない場合は再度、データベースを開いた状態で AWS マネージドコンソールの画面を開き直してみてください。


## AWS MFA の OTP を KeePassXC から自動入力できるようにする

KeePassXC には TOTP を生成する機能があるので、AWS MFA の OTP 生成用仮想デバイスとして利用可能です。
先ほど登録した AWS アカウントを MFA 対応させ、サインイン時の OTP を KeePassXC から自動入力するように設定してみたいと思います。

**セキュリティ強度が気になる方は別の物理デバイスで管理してください。本記事では KeePassXC の TOTP を利用することの是非については考慮しません。**

MFA を自己管理できるように IAM の権限が付与されている前提とします。本記事では[こちら](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html)を参考に最低限の権限を付与しました。

MFA デバイス追加を途中キャンセルすると CLI でしか削除できないゴミが残って面倒なので、やり切ってしまうことを推奨します。もしキャンセルしてしまった場合は[クラスメソッドさんのこちらの記事](https://dev.classmethod.jp/articles/mfa-device-alredy-exists/)がとても参考になります。

AWS マネージドコンソールの右上にあるアカウントメニューから「セキュリティ認証情報」をクリックします。
![totp_iam_setup_mfa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/43e1bcfc-a092-1058-0ce0-a51f5d9037b3.png)

「多要素認証（MFA）」の「MFA デバイスの割り当て」をクリックします。
![totp_iam_assign_mfa_device.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/51afe683-4bbe-7c2d-8eed-a2d1f4760bea.png)

「名前」に適当なデバイス名を入力して「仮想 MFA デバイス」が選択されているのを確認して「続行」をクリックします。
なお、本記事と同様の IAM 権限の場合、「名前」はユーザ名と同じ文字列でなければ次の画面で権限エラーになります。
![totp_iam_name_mfa_device.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/5857a397-2d69-7db3-b2cf-476b836bf6ea.png)

画面中央辺りにある「シークレットキーの表示」をクリックすると MFA シークレットキーが真下に表示されるので、それをコピーしておきます。（この文字列は後で KeePassXC のエントリに登録します）
![totp_iam_copy_mfa_secret_key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/d8859001-a395-0a00-06f6-c925eed22c16.png)

KeePassXC のエントリー一覧から対象エントリーを右クリックで選択して「TOTP」>「TOTP の設定」をクリックします。
![totp_setup_totp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/ddd5b2d8-67ff-701a-b99a-4f73f0c2c672.png) 

「秘密鍵」に事前にコピーした MFA シークレットキーを入力し、「規定の設定 (RFC 6238)」が選択されていることを確認して「OK」をクリックします。
![totp_iam_show_mfa_secure_key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/0045b044-5223-352b-6e3a-5366556253fc.png)
![totp_input_mfa_secret_key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/2ea9d0c0-aab4-62e9-c833-0cb27beb24bf.png)

再度対象エントリーを右クリックで選択して「TOTP」>「TOTP の表示」をクリックします。
![totp_show_totp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/82a16d3d-8bfd-8358-f6dc-2c568ed629d3.png)

現在表示されている OTP をコピーして IAM の MFA デバイス登録画面の「MFA コード 1」に入力します。続いてその次に表示される OTP をコピーして「MFA コード 2」に入力して「MFA の割り当て」をクリックします。
![totp_copy_totp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/7bc5c4e6-b6a4-4aae-21c4-1cddeafff8ec.png)
![totp_iam_input_otp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/9fbccfe4-3ede-303f-8dc7-8b0b394d235e.png)

その後登録完了画面が表示されるので「閉じる」をクリックします。

ここまでの設定で、MFA の OTP も KeePassXC から自動入力できるようになりました。

AWS マネジメントコンソールサインインの OTP 入力画面で、入力フィールドの吹き出しのようなアイコンをクリックすると、OTP が自動入力されます。
![totp_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/d1d95485-10ff-4c3b-ba26-805223ffb3ce.png)


## 普段の運用で改善したいと思っているところ

### MFA ありの AWS アカウントを本記事のやり方で複数管理すると入力自動化が中途半端になる

MFA ありの AWS アカウントを本記事のやり方で運用すると、ユーザ名/パスワードの入力と OTP の入力で二度、手動で KeePassXC のエントリにアクセスする必要があることがわかると思います。私の場合は管理しているアカウント数が少ないので大した手間ではないのですが、ちょっとすっきりしません。

<img width="600" alt="select_entry_twice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2989036/77aa4fed-0a1b-6901-5c51-fe510a3fd003.png">

KeePassXC-Browser か[自動入力](https://keepassxc.org/docs/KeePassXC_UserGuide.html#_auto_type)機能を上手く使えば解消できるかもと思っているのですが検証できていないです。

## おわりに

以上、KeePassXC の導入手順と便利な機能についての簡単な使い方を紹介しました。
ローカルに機密情報を保持しつつ利用できるので、業務利用する際の導入ハードルは低いのではないかと思います。
今回はブラウザからの自動入力にしか触れませんでしたが、[CLI も存在します](https://keepassxc.org/docs/KeePassXC_UserGuide.html#_command_line_tool)。
こちらも合わせて利用すれば、日々のアカウント運用をより楽にできそうですね。

[KWC Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kwc) はまだあと少しだけ続きます。
明日の投稿にもご期待ください。