先々月にこちらのエントリを書かせてもらいました。
この中で、直接権限を持った AWS のアクセスキーをエンジニアに持たせないような取り組みについて発表しました。
具体的には aws-vault というツールを使って実現しています。 SSOやMFAもサポートしてますし、クレデンシャルはOSのキーストアに保存できたりするのでセキュアに運用できます。
クラスメソッドさんの記事も大変参考になりますね。
問題発生
ようやく社内でも運用が始まったのですが、問題が発生しました。
開発業務をしている途中でアクセスキーの有効期限が切れると効率が悪いかなと思い、セッションの有効期限は9時間にしていました。
しかし1日の中でも何度も期限がきれるというのです。 しかもそれがパートナーのエンジニアの方にだけにおこるのです。
社員はIdPと連携して IAM Identity Center(AWS SSO)を使っています。 パートナーの方は IAM User を発行し、MFA を設定して使ってもらっています。
セッション時間の設定はそれぞれおこなっています。
PermissionSet (IAM Identity Center)
IAM Role
ん? こちらには Maximum という言葉がついています。
ということはどこかで制限されてるかもしれません。
これは aws-vault 側かもしれません。
aws-vault のヘルプ確認
$ aws-vault exec --help usage: aws-vault exec [<flags>] <profile> [<cmd>] [<args>...] Executes a command with AWS credentials in the environment Flags: --help Show context-sensitive help (also try --help-long and --help-man). --version Show application version. --debug Show debugging output --backend=keychain Secret backend to use [keychain pass file] ($AWS_VAULT_BACKEND) --prompt=terminal Prompt driver to use [kdialog osascript pass terminal ykman zenity] ($AWS_VAULT_PROMPT) --keychain="aws-vault" Name of macOS keychain to use, if it doesn't exist it will be created ($AWS_VAULT_KEYCHAIN_NAME) --secret-service-collection="awsvault" Name of secret-service collection to use, if it doesn't exist it will be created ($AWS_VAULT_SECRET_SERVICE_COLLECTION_NAME) --pass-dir=PASS-DIR Pass password store directory ($AWS_VAULT_PASS_PASSWORD_STORE_DIR) --pass-cmd=PASS-CMD Name of the pass executable ($AWS_VAULT_PASS_CMD) --pass-prefix=PASS-PREFIX Prefix to prepend to the item path stored in pass ($AWS_VAULT_PASS_PREFIX) --file-dir="~/.awsvault/keys/" Directory for the "file" password store ($AWS_VAULT_FILE_DIR) -d, --duration=DURATION Duration of the temporary or assume-role session. Defaults to 1h -n, --no-session Skip creating STS session with GetSessionToken --region=REGION The AWS region -t, --mfa-token=MFA-TOKEN The MFA token to use -j, --json Output credentials in JSON that can be used by credential_process -s, --server Alias for --ec2-server. Run a EC2 metadata server in the background for credentials --ec2-server Run a EC2 metadata server in the background for credentials --ecs-server Run a ECS credential server in the background for credentials (the SDK or app must support AWS_CONTAINER_CREDENTIALS_FULL_URI) --lazy When using --ecs-server, lazily fetch credentials --stdout Print the SSO link to the terminal without automatically opening the browser
お?
-d, --duration=DURATION Duration of the temporary or assume-role session. Defaults to 1h
とあります。デフォルトは 1h と書かれています。
解決
aws-vault exec --duration=9h <profile>
とすれば解決しそうです。
実際にこれをパートナーのエンジニアの方に試してもらい、セッションが切れないことが確認できました。
これで集中力を切らさずに開発してもらえそうです。