My memo


aws-vaultで複数アカウントの認証を通したい

Tags

  • AWS
  • aws-vault
  • MFA

前提

やりたいこと

現状

aws-mfa を使うことで、一応上記のやりたいことは達成できている

~/.aws/credentials

以下のCredentialsが保存されている

~/.aws/config

以下のような感じになっている

[default]
region = ap-northeast-1
mfa_serial = arn:aws:iam::123456789012:mfa/<mfa_token_name>

[profile account-a]
region = ap-northeast-1
role_arn = arn:aws:iam::123456789013:role/<some_role_to_assume>
source_profile = default

...

この時、 [profile account-a] の方に mfa_serial を設定しても動くが、この場合 account-a をAssume RoleしようとするたびにMFAでの認証を求められる。 default (ID集約用)に切り替わる時にMFAで認証しておけば、そのセッションが有効な間は当該のIAM Userについている「MFAがないと全部禁止」のPolicyに引っかからずに済む。

調べた内容

aws-mfa を使っているところを aws-vault に切り替えるにあたっての変化点は・・・

(というところまで調べて、継続調査中。。。config内の credential_process とかを使えばいける??)

GetSessionTokenの使い回し

AWS Vault will attempt to re-use a GetSessionToken between profiles that share a common mfa_serial.

とあるので、単純に複数のProfileの mfa_serial を設定すれば事足りるかも? (cf. MFA)

対象のソースは この辺 だが、特にCacheを使っていそうな処理は見当たらない。

この辺で読み取ったConfigからMFAのSerial Numberを取得して。。。

		input.SerialNumber = aws.String(p.GetMfaSerial())
		input.TokenCode, err = p.GetMfaToken()

ここ で素直にMFA Tokenを取得している

// GetMfaToken returns the MFA token
func (m *Mfa) GetMfaToken() (*string, error) {
	if m.mfaPromptFunc != nil {
		token, err := m.mfaPromptFunc(m.mfaSerial)
		return aws.String(token), err
	}

	return nil, errors.New("No prompt found")
}

何か勘違いしてるのだろうか・・・?

⇇ Back to home