aws-vault のセッションがすぐ切れる?

id:kizashi1122 です

先々月にこちらのエントリを書かせてもらいました。

blog.ingage.jp

この中で、直接権限を持った AWS のアクセスキーをエンジニアに持たせないような取り組みについて発表しました。

具体的には aws-vault というツールを使って実現しています。 SSOやMFAもサポートしてますし、クレデンシャルはOSのキーストアに保存できたりするのでセキュアに運用できます。

クラスメソッドさんの記事も大変参考になりますね。

dev.classmethod.jp

問題発生

ようやく社内でも運用が始まったのですが、問題が発生しました。 開発業務をしている途中でアクセスキーの有効期限が切れると効率が悪いかなと思い、セッションの有効期限は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>

とすれば解決しそうです。

実際にこれをパートナーのエンジニアの方に試してもらい、セッションが切れないことが確認できました。

これで集中力を切らさずに開発してもらえそうです。