
1Password EnvironmentsでAWSのAccessKeyを安全に使うためのCLI Toolを作ってみた
こんばんは、情報システム部の夏目です。
昨年からローカルの環境に平文でアクセスキーなどを置くの危ないよねって感じがあります。
そのため、今回は1Password EnvironmentsでAWSのAccess Keyを安全に使うためのCLI Toolを作ってみました。
1Password Enviornments
1Password EnvironmentsではAPI Keyなどのシークレットなどを1Password Vaultに暗号化して保存しつつ必要なタイミングでアプリケーションやCLIに安全に渡すことができます。
今回はその中の .env ファイルマウント機能を使います。
この機能ではディスクに書き込みが行われず、読み取りアクセスがあったときにプロセスへ直接データが渡されます。
aws-credential-process-provider-from-dotenv
今回作ったのは、AWS CLIの credential_process で使用するCLI Toolです。
AWS CLIの機能ではありますが、AWSのSDK等でも動きます。
指定した .env ファイルを読み取り、 credential_process用のJSONを出力するCLI Toolです。
Githubのリリースページから対応するバイナリをダウンロードして使います。
使い方
.envファイルを用意する
ツールが読み取る .env ファイルは、以下のような形式です。
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS_SESSION_TOKEN=FwoGZX...
EXPIRATION=2024-01-01T00:00:00Z
SessionToken と Expiration はオプションです。一時的な認証情報(AssumeRole 等)でない場合は省略できます。
.env ファイルのキー名は、よく使われる複数の命名規則に対応しています。PascalCase、SCREAMING_SNAKE_CASE、snake_case、そしてそれぞれの Aws / AWS_ / aws_ プレフィックス付きの形式をすべて認識します。
| 認証情報フィールド | 認識されるキー名 |
|---|---|
| Access Key ID | AccessKeyId、ACCESS_KEY_ID、access_key_id、AwsAccessKeyId、AWS_ACCESS_KEY_ID、aws_access_key_id |
| Secret Access Key | SecretAccessKey、SECRET_ACCESS_KEY、secret_access_key、AwsSecretAccessKey、AWS_SECRET_ACCESS_KEY、aws_secret_access_key |
| Session Token | SessionToken、SESSION_TOKEN、session_token、AwsSessionToken、AWS_SESSION_TOKEN、aws_session_token |
| Expiration | Expiration、EXPIRATION、expiration |
上の順番で検索し、最初に見つかったものを使います。既存の .env ファイルがどんな命名規則を使っていても、たいていそのまま動きます。
そのまま使ってみる
コマンドラインから直接実行すると、認証情報の JSON が標準出力に出力されます。
aws-credential-process-provider-from-dotenv /path/to/credentials.env
出力はこのような形式です。
{
"Version": 1,
"AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
"SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"SessionToken": "FwoGZX...",
"Expiration": "2024-01-01T00:00:00Z"
}
.env ファイルに存在しないフィールドは、JSON から省略されます(null にはなりません)。
AWS CLIのShared Credentialに設定する
このツールの本来の使いどころは、AWS CLI の credential_process との連携です。~/.aws/config に以下を追記するだけで設定完了です。
[profile my-profile]
credential_process = /path/to/aws-credential-process-provider-from-dotenv /path/to/credentials.env
あとは通常の AWS CLI コマンドに --profile オプションをつけるだけで、.env ファイルの認証情報が透過的に使われます。
動かしてみる
1Password Environmentsで環境を用意する

アクセスキーを保存しました。
次は保存先でローカル.envファイルを作成します。


ファイルパスを選択します。

ここでは ~/.envs/credential_process_test.env とします。

ファイルパス選択だけでは使えないので、 .envファイルをマウントします。

これでマウント完了です。
少し見てみます。
$ file ~/.envs/credential_process_test.env
/Users/yuta/.envs/credential_process_test.env: fifo (named pipe)
テキストファイルでないことがわかります。
Shared Credentialを設定する
[profile credential_process_test]
credential_process = /Users/yuta/space/bin/aws-credential-process-provider-from-dotenv /Users/yuta/.envs/credential_process_test.env
region = ap-northeast-1
これで設定完了です。
aws sts get-caller-identity --profile credential_process_testを実行してみる
$ aws sts get-caller-identity --profile credential_process_test
実行してみると、

1Passwordのデスクトップアプリから認証を求められます。
Touch IDが使えるので、使うと問題なく動きました。

まとめ
credential_processを使って1Password Environmentsの.envからアクセスキーを得るためのCLI Toolを作ってみました。
今回紹介はしませんでしたが、1つの.envファイルで複数アカウントを区別できるようにするための機能もあります。
(1Password Environmentsの.envファイルは10個しかマウントできない)
良かったら使ってみてください。








