継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

IAM Identity Center のロールで発行される一時認証情報をaws-sso-go 経由で 1Password に入れて利用する

タダです.

以前の記事で 1Passowrd Shell Plugin を使って IAM アクセスキーとシークレットアクセスキーを保存して AWS CLI を使うのをやってみました.この記事では IAM Identicy Center(旧 AWS SSO) のロールで発行される一時認証情報を 1Password に入れたり更新ができたらローカルにクレデンシャルを残さずに使えてセキュアになるため,その検証を行ったのをまとめていきます.

sadayoshi-tada.hatenablog.com

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

github.com

このツールを使うためにまず,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/configsso_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 を使う機会があったのでまとめました.非常にありがたいツールを開発いただき,開発者様には感謝しかないです.