タダです.
以前の記事で 1Passowrd Shell Plugin を使って IAM アクセスキーとシークレットアクセスキーを保存して AWS CLI を使うのをやってみました.この記事では IAM Identicy Center(旧 AWS SSO) のロールで発行される一時認証情報を 1Password に入れたり更新ができたらローカルにクレデンシャルを残さずに使えてセキュアになるため,その検証を行ったのをまとめていきます.
IAM Identity Center のロールで発行される一時認証情報を保管する
IAM Identity Center と 1Password の連携は公式サポートされてないため,aws-sso-go を使わせていただきます.このツールではロールの一時認証情報を取得し,1Password のアイテムに保存します.
[ERROR] could not run plugin AWS CLI: failed to provision credentials, encountered error(s): SSO Authentication is not yet supported by the AWS Shell Plugin. If you would like for this feature to be supported, upvote or take on its issue: https://github.com/1Password/shell-plugins/issues/210
このツールを使うためにまず,README に沿って実行準備をします.
$ go install github.com/mrtc0/aws-sso-go@latest $ cat <<EOF > /usr/local/bin/update-1password-aws-credentials.sh #!/bin/bash # This script is save aws-sso-go results to 1Password. # # Usage: aws-sso-go | update-1password-aws-credentials.sh <1Password item name> # e.g. aws-sso-go | update-1password-aws-credentials.sh aws-credentials # # You can handle AWS credentials by running `op run --env-file .env` with a `.env` file like: # AWS_ACCESS_KEY_ID="op://Private/aws-credentials/access key id" # AWS_SECRET_ACCESS_KEY="op://Private/aws-credentials/secret access key" # AWS_SESSION_TOKEN="op://Private/aws-credentials/session token" while read -r line; do AWS_SECRET_ACCESS_KEY=$(echo $line | jq -r '.SecretAccessKey') AWS_ACCESS_KEY_ID=$(echo $line | jq -r '.AccessKeyId') AWS_SESSION_TOKEN=$(echo $line | jq -r '.SessionToken') op item edit "$1" "secret access key=$AWS_SECRET_ACCESS_KEY" "access key id=$AWS_ACCESS_KEY_ID" "session token=$AWS_SESSION_TOKEN" done EOF $ chmod +x /usr/local/bin/update-1password-aws-credentials.sh
実行準備が終わったら, ~/.aws/config
の sso_region
で指定している IAM Identity Center のエンドポイントリージョンを環境変数にセットしましょう.この変数が誤っていると画像のようにエラーがでました.
リージョンの環境変数をセットして aws-sso-go
の実行が成功したら保管されるクレデンシャルが標準出力され,1Password にクレデンシャルが保管されます.
実行例
$ export AWS_REGION=us-east-1 $ aws-sso-go --profile hoge | update-1password-aws-credentials.sh aws-credentials(1Password の保管先名) ID: xxx Title: aws-credentials Vault: Private (xxx) Created: 1 week ago Updated: now by Sadayoshi Tada Favorite: false Version: 5 Category: API_CREDENTIAL Fields: access key id: [アクセスキー ID] secret access key: [シークレットアクセスキー] session token: [セッショントークン]
1Password 保管庫
保管したクレデンシャルを使って AWS CLI を実行する
保管したクレデンシャルを使って AWS CLI を実行してみます.env
ファイルに書き出して使ってみます.以下が実行例です.
you can use op run --env-file .env to handle AWS credentials.
実行例
$ cat .env.template AWS_ACCESS_KEY_ID="op://Private/aws-credentials/access key id" AWS_SECRET_ACCESS_KEY="op://Private/aws-credentials/secret access key" AWS_SESSION_TOKEN="op://Private/aws-credentials/session token" $ op inject -i .env.template -o .env $ cat .env AWS_ACCESS_KEY_ID="保管庫にあるアクセスキー" AWS_SECRET_ACCESS_KEY="保管庫にあるシークレットアクセスキー" AWS_SESSION_TOKEN="保管庫にあるセッショントークン"
README に記載がありますが,env
ファイルにあるクレデンシャルを使って AWS CLI を実行するには op run --env-file .env -- aws s3 ls
のように実行できます.都度 op コマンドを打つのではなくスクリプト化して AWS CLI のコマンドを打つようにしてもいいかもしれません.
aws-exec sts get-caller-identity { "UserId": "hoge", "Account": "1234567891011", "Arn": "arn:aws:sts::1234567891011:assumed-role/hoge/hoge" }
まとめ
IAM Identity Center のロールの認証情報を 1Password に保管できる aws-sso-go
を使う機会があったのでまとめました.非常にありがたいツールを開発いただき,開発者様には感謝しかないです.