IAM Identity Centerでもaws-vaultでセキュアにAWS CLIを使う

こんにちはSREチームの宮後(@miya10kei)です。最近、トリュフナッツにハマりビール🍺の消費量が増えています。

AWS CLIを使用する時にaws-vaultは使っていますか?
AWSのユーザ管理をAWS IAM Identity Centerに移行した際にaws-vaultの設定でつまずいたので解決方法を紹介したいと思います。

AWS IAM Identity Centerとは?

複数の AWSアカウントやアプリケーションへのワークフォースのアクセスを一元管理するためのサービスです。外部IDプロバイダーと接続しSSO(シングルサインオン)連携をすることができます。ニーリーではGoogle Workspaceと連携させGoogleアカウントでログインできるようにしています。

aws-vaultとは?

aws-vaultはAWS CLIを使用する際の認証情報を安全に保存し、アクセスするためのOSSです。認証情報はOSのキーストアに保存されるため、よりセキュアにAWS CLIを使用することができます。AWS CLIには外部プロセスの標準出力から認証情報を取得するcredential_processという機能があります。credential_procesとaws vault を介して、キーストアに認証情報を保存しながら透過的にAWS CLIを利用することができます。

AWS IAMでユーザ管理をしていたときの設定

まずはAWS IAMでユーザ管理をしていた頃のaws-vaultの設定について紹介します。

次のコマンドを実行すると$HOME/.aws/configというファイルが作成され<profile名>のテーブルが書き込まれます。

$ aws-vault add <profile名>
Enter Access Key ID: AKIAXXXXXXXXXXXXXXXX
Enter Secret Access Key:
Added credentials to profile "<profile名>" in vault

入力したAccess Key IDとSecret Access Keyはキーストアに保存されます。
キーストアにpassを利用している場合は次のように保存されます。

$ aws-vault add sample
Enter Access Key ID: sample-access-key-id
Enter Secret Access Key: ************************
Added credentials to profile "sample" in vault

$ pass ls
Password Store
└── aws-vault
    └── sample

$ pass aws-vault/sample | jq .
{
  "Key": "sample",
  "Data": "eyJBY2Nlc3NLZXlJRCI6InNhbXBsZS1hY2Nlc3Mta2V5LWlkIiwiU2VjcmV0QWNjZXNzS2V5Ijoic2FtcGxlLXNlY3JldC1hY2Nlc3Mta2V5IiwiU2Vzc2lvblRva2VuIjoiIiwiU291cmNlIjoiIiwiQ2FuRXhwaXJlIjpmYWxzZSwiRXhwaXJlcyI6IjAwMDEtMDEtMDFUMDA6MDA6MDBaIn0=",
  "Label": "aws-vault (sample)",
  "Description": "",
  "KeychainNotTrustApplication": true,
  "KeychainNotSynchronizable": false
}

$ echo "eyJBY2Nlc3NLZXlJRCI6InNhbXBsZS1hY2Nlc3Mta2V5LWlkIiwiU2VjcmV0QWNjZXNzS2V5Ijoic2FtcGxlLXNlY3JldC1hY2Nlc3Mta2V5IiwiU2Vzc2lvblRva2VuIjoiIiwiU291cmNlIjoiIiwiQ2FuRXhwaXJlIjpmYWxzZSwiRXhwaXJlcyI6IjAwMDEtMDEtMDFUMDA6MDA6MDBaIn0=" | base64 -d
{"AccessKeyID":"sample-access-key-id","SecretAccessKey":"sample-secret-access-key","SessionToken":"","Source":"","CanExpire":false,"Expires":"0001-01-01T00:00:00Z"}

MFAを設定している場合には次のようにmfaデバイスの情報を設定します。

[profile <profile名>]
mfa_serial=arn:aws:iam::<AWSアカウントID>:mfa/<mfaデバイス名>

credential_processを次のように設定することでAWS CLIから透過的にaws-vaultを利用することができます。

[profile <profile名>]
credential_process=aws-vault exec <profile名> --duration 12h --json

最後に次のコマンドを実行しidentity情報が取得できれば設定完了です!

$ aws sts get-caller-identity

AWS IAM Identity Center移行後の設定

ここまではネットにも多くの情報があり、よく利用されている設定かと思います。
続いてAWS IAMからAWS IAM Identity Centerに移行し、SSOを有効化した場合の設定について紹介します。

まずは$HOME/.aws/config設定の全量を載せます。

[sso-session sso]
sso_start_url = https://xxxxxxxxxxxx.awsapps.com/start
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access

[profile sample-sso]
sso_session = sso
sso_account_id = xxxxxxxxxxxxx 
sso_role_name = xxxxxxxxxxxxx

[profile sample]
credential_process=aws-vault exec sample-sso --json
region = ap-northeast-1
output = json

[sso-session sso] テーブルの設定

こちらは認証セッションについての設定になります。
AWS Identity Centerを導入するとAWS アクセスポータルの URLが払い出されます。
sso_start_urlには払い出されたURLを設定してください。

[profile sample-sso]テーブルの設定

こちらはどのAWSアカウントにどのロールで認証するかの設定になります。
sso_sessionには[sso-session sso] テーブルの設定を参照するように設定してください。
sso_account_idには対象のAWSアカウントのIDを設定してください。
sso_role_nameにはAWS Identity Centerで作成した許可セット名を設定してください。

[profile sample]テーブルの設定

こちらはaws-cli利用時に指定するprofileの設定になります。
credential_processでaws-vaultのコマンドを実行するのはAWS IAM利用時と変わらないですが、profileには[profile sample-sso]テーブルのprofile名を設定してください。 このように設定するとAWS IAMを利用していた時と同様にaws-cliから透過的にaws-vaultを利用することができます(セッションが無効な場合にはブラウザでSSOのログイン画面が自動起動します)。

設定後は次のコマンドを実行しidentity情報が取得できるか確認してみてください。

$ aws sts get-caller-identity

Tips

コンテナ内などブラウザが自動起動しない環境で利用したい場合には次のように設定することでログインURLが標準出力されるようになるので試してみてください。

credential_process=bash -c "aws-vault exec sample-sso --duration=12h --stdout --json 2> /dev/tty"

まとめ

今回はTips的な紹介になりましたが、探してもあまり情報が見つからない部分でしたので紹介してみました!まだ、aws-vaultを使われていない方は是非試してみてください!よりセキュアな世界を目指していきましょう💪💪💪