🔑

AWS CLI のプロファイルを chezmoi とBitwarden で管理する

2023/03/21に公開

はじめに

みなさん dotfiles はご存知ですか。
ざっくりいうと、ホームディレクトリ配下の.から始まる設定ファイル群のことです。広義にはそれらのファイルを Git リポジトリで管理することを指します。

https://dotfiles.github.io/

dotfiles を Git で管理することは古くからあるプラクティスですが、VSCode が Devcontainer をサポートしたことで最近また注目を集めている気がしますね。

dotfiles を Git リポジトリで管理するときに気を付けるのは機密情報の取り扱いです。当たり前ですが、Git リポジトリにパスワードなどの機密情報をアップロードすることは NG です。それはわかってるんですが、日々増えていく AWS CLI のプロファイル(~/.aws/credentialsとか)はできれば Git で管理したい…。どうしたものかと考えていたときに、以下の情報を見つけました。

https://www.chezmoi.io/user-guide/password-managers/bitwarden/

chezmoi のテンプレート機能と Bitwarden を組み合わせることで、apply 時にシークレットを取得できるようです。実際にやってみたので内容をシェアします。

Bitwarden

まずは Bitwarden にアイテムを作成します。すでに Bitwarden を使用していて、AWS マネジメントコンソールへのログイン情報を登録済みの場合は、既存のアイテムに設定を追加しても OK です。

アクセスキー ID、シークレットアクセスキー用にカスタムフィールドを 2 つ作成します。

以下の項目は chezmoi からシークレットを取得するときに使用します。パラメーターはご自身の環境に合わせて設定してください。

項目名 説明
URI 1 AWS アカウントのサインインページの URL
ACCESSKEYID アクセスキー ID
SECRETACCESSKEY シークレットアクセスキー

chezmoi

次に chezmoi の設定です。以下のコマンドを実行して~/.aws/config~/.aws/credentialsを登録します。~/.aws/credentialsには機密情報が含まれるので、テンプレート形式で追加します。

$ chezmoi add ~/.aws/config
$ chezmoi add --template ~/.aws/credentials

各ファイルを以下のように編集します。

~/.local/share/chezmoi/dot_aws/private_config
[profile profile1]
region = ap-northeast-1
output = json
~/.local/share/chezmoi/dot_aws/private_credentials.tmpl
[profile1]
aws_access_key_id = {{ (bitwardenFields "item" "https://Your_Account_ID.signin.aws.amazon.com/console/").ACCESSKEYID.value }}
aws_secret_access_key = {{ (bitwardenFields "item" "https://Your_Account_ID.signin.aws.amazon.com/console/").SECRETACCESSKEY.value }}

https://Your_Account_ID.signin.aws.amazon.com/console/ は Bitwarden に登録したアイテムのURI 1と合わせます。

動作確認

簡単な動作確認を行います。Personal API キーが必要になるので、以下の公式ドキュメントに従って取得しておきましょう。

https://bitwarden.com/help/personal-api-key/

まずは Bitwarden CLI をインストールします。バイナリファイルをダウンロードするだけです。

$ export BW_VERSION=1.22.1
$ curl -sSLO https://github.com/bitwarden/cli/releases/download/v${BW_VERSION}/bw-linux-${BW_VERSION}.zip
$ unzip bw-linux-${BW_VERSION}.zip
Archive:  bw-linux-1.22.1.zip
  inflating: bw                      
$ chmod +x bw
$ sudo cp bw /usr/bin/
$ rm bw bw-linux-${BW_VERSION}.zip

bw loginコマンドを実行して、対話形式で Bitwarden にログインします。E メールアドレスとマスターパスワードを入力するのですが、そのデバイスで初めてログインする場合は API キーの入力も必要になります。

https://github.com/bitwarden/cli/issues/383#issuecomment-940033638

Additional authentication required.が表示された場合は、事前に取得したclient_secretを入力します。

$ bw login
? Email address: 
? Master password: 
? Additional authentication required.
API key client_secret: 
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==

ログインに成功したらBW_SESSION環境変数を設定するサンプルコマンドが表示されるはずです。サンプルコマンドをそのまま実行します。

$ export BW_SESSION="5PBYGU+5yt3RHcCjoeJKx/wByU34vokGRZjXpSH7Ylo8w=="

試しに先ほど Bitwarden に登録したアイテムを取得してみます。

$ bw get item https://Your_Account_ID.signin.aws.amazon.com/console/

アイテムを取得できることが確認できたらchezmoi applyを実行して dotfiles を生成してみましょう。

$ chezmoi apply -v

~~/.aws/credentialsに Bitwarden から取得したアクセスキー ID、シークレットアクセスキーが正しく反映されていれば成功です。お疲れさまでした🙌

Devcontainer

ここからはオマケですが、Devcontainer は dotfiles をサポートしています。

https://code.visualstudio.com/docs/devcontainers/containers#_personalizing-with-dotfile-repositories

以下のパラメーターを設定することで、自動的に Git リポジトリからファイルをコピーして、dotfiles.installCommandに指定した初期化スクリプトを実行してくれます。

settings.json
{
  "dotfiles.repository": "your-github-id/your-dotfiles-repo",
  "dotfiles.targetPath": "~/dotfiles",
  "dotfiles.installCommand": "install.sh"
}

今回紹介した内容を初期化スクリプトを使用して自動化する場合は、以下のような処理を記述します。

~/dotfiles/install.sh
BW_VERSION=1.22.1

# bitwarden cli
curl -sSLO https://github.com/bitwarden/cli/releases/download/v${BW_VERSION}/bw-linux-${BW_VERSION}.zip
unzip bw-linux-${BW_VERSION}.zip
chmod +x bw
sudo cp bw /usr/bin/
rm -rf bw bw-linux-${BW_VERSION}.zip
export BW_SESSION=`bw login ${BW_EMAIL} ${BW_PASSWORD} --raw`

# chezmoi
sh -c `curl -fsLS chezmoi.io/get`
chmod +x ./bin/chezmoi
sudo cp ./bin/chezmoi /usr/bin/
rm -rf ./bin
chezmoi apply -v

初期化スクリプトはコンテナが再構成されたときに実行されるので、bw loginコマンドが実行されるタイミングは「デバイスで初めてログインした場合」の条件に当てはまるはずです。マスターパスワードだけでなくclient_secretも必要となる点に注意しましょう。

非対話形式でbw loginを行う場合は、環境変数のBW_CLIENTSECRETを設定しておけば自動的に読み取ってくれます。
初期化スクリプトでは以下の環境変数を使用しています。

変数名 説明
BW_EMAIL Bitwarden の Eメールアドレス
BW_PASSWORD Bitwarden のマスターパスワード
BW_CLIENTSECRET Bitwarden のclient_secret

おわりに

機密情報が dotfiles に含まれるケースは結構多いと思うので、いろいろ応用できそうです。
また、Bitwarden は自前でサーバーを構築することもできます。クラウドでパスワードを管理することが気になるようであれば、オンプレミスに構築するのも選択肢のひとつです。

https://bitwarden.com/help/install-on-premise-linux/

Discussion