AWS CLI のプロファイルを chezmoi とBitwarden で管理する
はじめに
みなさん dotfiles はご存知ですか。
ざっくりいうと、ホームディレクトリ配下の.
から始まる設定ファイル群のことです。広義にはそれらのファイルを Git リポジトリで管理することを指します。
dotfiles を Git で管理することは古くからあるプラクティスですが、VSCode が Devcontainer をサポートしたことで最近また注目を集めている気がしますね。
dotfiles を Git リポジトリで管理するときに気を付けるのは機密情報の取り扱いです。当たり前ですが、Git リポジトリにパスワードなどの機密情報をアップロードすることは NG です。それはわかってるんですが、日々増えていく AWS CLI のプロファイル(~/.aws/credentials
とか)はできれば Git で管理したい…。どうしたものかと考えていたときに、以下の情報を見つけました。
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
各ファイルを以下のように編集します。
[profile profile1]
region = ap-northeast-1
output = json
[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 キーが必要になるので、以下の公式ドキュメントに従って取得しておきましょう。
まずは 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 キーの入力も必要になります。
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 をサポートしています。
以下のパラメーターを設定することで、自動的に Git リポジトリからファイルをコピーして、dotfiles.installCommand
に指定した初期化スクリプトを実行してくれます。
{
"dotfiles.repository": "your-github-id/your-dotfiles-repo",
"dotfiles.targetPath": "~/dotfiles",
"dotfiles.installCommand": "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 は自前でサーバーを構築することもできます。クラウドでパスワードを管理することが気になるようであれば、オンプレミスに構築するのも選択肢のひとつです。
Discussion