aws cliでassumerole

44
AWS CLIでAssumeRole

Upload: tetsunori-nishizawa

Post on 11-Jan-2017

2.455 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: AWS CLIでAssumeRole

AWS CLIでAssumeRole

Page 2: AWS CLIでAssumeRole

前置き

設定は自己責任でお願いします。

Page 3: AWS CLIでAssumeRole

Temporary Security Credential

AccessKeyId

SecretAccessKey

AccessKeyId

SecretAccessKey

SessionToken

期限なし認証 期限付き認証

Page 4: AWS CLIでAssumeRole

Temporary Security Credentialの種類

種別 説明 権限

GetSessionToken 自身の権限で一時認証自身の権限と同じ

クロスアカウント不可 MFA利用可

GetFederationToken 信頼ユーザで一時認証自身の権限内で規定 クロスアカウント不可

MFA利用不可

AssumeRole IAMロールとマッピングIAMロールで規定 クロスアカウント可

MFA利用可

(参考)http://docs.aws.amazon.com/ja_jp/STS/latest/UsingSTS/Welcome.html#AccessingSTS

Page 5: AWS CLIでAssumeRole

Temporary Security Credentialの取得

Security Token Service(STS)から取得

取得したTokenは有効期限が切れるまで無効化できない(STSはTokenを払い出すところだけやる)

(参考)http://docs.aws.amazon.com/ja_jp/STS/latest/UsingSTS/DisablingTokenPermissions.html

Page 6: AWS CLIでAssumeRole

GetSessionToken

Page 7: AWS CLIでAssumeRole

GetSessionTokenのイメージ

期限なし認証を使って、STSから期限付き認証を取得

AccessKeyId SecretAccessKey

AccessKeyId SecretAccessKey SessionToken

Page 8: AWS CLIでAssumeRole

GetSessionTokenのポイント

要求した人のアクセス権限そのまま

MFA保護のAPIも利用可能

Page 9: AWS CLIでAssumeRole

AWS CLIでGetSessionToken(コマンド) $ aws sts get-session-token

(結果) { "Credentials": { "SecretAccessKey": "yyyyyyyy", "SessionToken": "zzzzzzzzzzzz", "Expiration": "2015-05-25T19:00:00Z", "AccessKeyId": "xxxx" } } ※KeyやTokenは実際にはもっと長い

Page 10: AWS CLIでAssumeRole

get-session-tokenで 使えるオプション

--duration-seconds 有効期間(単位:秒)を設定 IAMユーザは、15m~36h(デフォルト12h) AWSアカウントは、15m~1h(デフォルト1h)

--serial-number, --token-code MFA保護でも利用可能

(参考)http://docs.aws.amazon.com/cli/latest/reference/sts/get-session-token.html

Page 11: AWS CLIでAssumeRole

期限付き認証の使い方取得した期限付き認証を使いたい人に渡す

環境変数で指定 export AWS_ACCESS_KEY_ID=xxxx export AWS_SECRET_ACCESS_KEY=yyyyyyyy export AWS_SESSION_TOKEN=zzzzzzzzzzzz

configファイルで指定も可能 [profile temp-profile] aws_access_key_id=xxxx aws_secret_access_key=yyyyyyyy aws_session_token=zzzzzzzzzzzz ※credentialに記載の場合は"profile"は不要

(参考)http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html

Page 12: AWS CLIでAssumeRole

(蛇足)期限付き認証ワンライナー

aws sts get-session-token | awk ' $1 == "\"AccessKeyId\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_ACCESS_KEY_ID="$2 } $1 == "\"SecretAccessKey\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_SECRET_ACCESS_KEY="$2 } $1 == "\"SessionToken\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_SESSION_TOKEN="$2 } '

Page 13: AWS CLIでAssumeRole

GetSessionTokenユースケース

同一アカウント内で特定のAPIにのみMFA保護

(参考)http://docs.aws.amazon.com/ja_jp/STS/latest/UsingSTS/permissions-get-session-token.html

Page 14: AWS CLIでAssumeRole

GetFederationToken

Page 15: AWS CLIでAssumeRole

GetFederationTokenのイメージ

STSにFederatedユーザ作成を要求

Federated User

Federated Userは要求の度に作られる

Tokenと一緒に指定された権限を付与

Page 16: AWS CLIでAssumeRole

GetFederationTokenのポイント

要求の度にFederated Userは作成される

発行の時にポリシー指定をしないと原則何も権限が無い(リソースベースで明示的な許可があればアクセス可)

(参考)http://docs.aws.amazon.com/ja_jp/STS/latest/UsingSTS/permissions-get-federation-token.html

Page 17: AWS CLIでAssumeRole

AWS CLIでGetFederationToken

(コマンド) $ FED_USER=feduser $ POLICY_FILE=policy.json

$ aws sts get-federation-token \ --name ${FED_USER} \ --policy file://./${POLICY_FILE}

ポリシーを定義したjsonは事前に作成しておく

Page 18: AWS CLIでAssumeRole

(結果) { "FederatedUser": { "FederatedUserId": "111122223333:feduser", "Arn": "arn:aws:sts::111122223333:federated-user/feduser" }, "Credentials": { "SecretAccessKey": "yyyyyyyy", "SessionToken": "zzzzzzzzzzzz", "Expiration": "2015-05-22T00:41:22Z", "AccessKeyId": "xxxx" }, "PackedPolicySize": 5 } ※KeyやTokenは実際にはもっと長い

Page 19: AWS CLIでAssumeRole

get-federation-tokenで 使えるオプション

--duration-seconds 有効期間(単位:秒)を設定 IAMユーザは、15m~36h(デフォルト12h) AWSアカウントは、15m~1h(デフォルト1h)

(参考)http://docs.aws.amazon.com/cli/latest/reference/sts/get-federation-token.html

Page 20: AWS CLIでAssumeRole

GetFederationTokenの使い方

前述の期限付き認証の使い方と同じ

Page 21: AWS CLIでAssumeRole

GetFederationTokenユースケース

開発者に本番環境のアカウントを期限付きで貸し出し

構築ベンダに期限付き認証で作業を依頼

デモやハンズオンでも使えそう

Page 22: AWS CLIでAssumeRole

AssumeRole

Page 23: AWS CLIでAssumeRole

AssumeRoleのイメージ

STSにIAMロールを要求

Tokenと一緒にIAMロール権限を付与

Trusted Entity Assumed Role

Assumed Roleは元のTrusted Entityとは別人

arn:aws:iam::111122223333:user/IAM-User-AssumeTest

arn:aws:sts::222233334444:assumed-role/IAM-Role-AssumeTest/AssumeTest-Session

Page 24: AWS CLIでAssumeRole

AssumeRoleのポイント

権限は関連付けられたIAMロールで設定

クロスアカウント可能

MFA認証済みEntityのみ信頼する設定も可能

(参考)http://docs.aws.amazon.com/ja_jp/STS/latest/UsingSTS/permissions-get-federation-token.html

Page 25: AWS CLIでAssumeRole

IAMロールのポイント

IAMロールは、Role PolicyとAssumeRolePolicyDocument(Trust Relationship)の2要素で構成される

AssumeRolePolicyDocumentで許可されたTrusted Entityと組み合わせてRole Policy権限で動作する

Page 26: AWS CLIでAssumeRole

Trusted Entityになれる人

AssumeされるIAMロールのAssumeRolePolicyDocument(Trust Relationship)に設定できる人

 =少なくともPrincipalに指定できないとダメ

AWSアカウント(root)はAssumeRoleできない

Page 27: AWS CLIでAssumeRole

Principal設定例"Principal": {"AWS": "111122223333"}

"Principal": {"AWS": "arn:aws:iam::111122223333:root"}

"Principal": {"AWS": "arn:aws:iam::111122223333:user/iam-user"}

"Principal": {"AWS": "arn:aws:iam::111122223333:role/iam-role"}

"Principal": {"Service": "ec2.amazonaws.com"}

"Principal": {"Federated": "www.amazon.com"}

(参考)http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/AccessPolicyLanguage_ElementDescriptions.html#Principal

Page 28: AWS CLIでAssumeRole

Pricipal設定の注意

PrincipalにAWSアカウントを指定すると、全てのIAMアカウントが許可対象となる

IAMグループ単位でのPrincipal指定は不可

EC2サービスでPrincipal指定するのは、EC2インスタンスプロファイル用

Page 29: AWS CLIでAssumeRole

(補足1) ユーザベース認証とリソースベース認証

Resourceで権限範囲を規定

Principalで権限範囲を規定

IAM

STS、S3 bucket等

Resource, Principalで設定できるARNには、制限が多いので公式ドキュメント確認と検証が必須(特にアスタリスク指定に注意)

Actionとの組み合わせにも要注意

(参考)http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/PermissionsOverview.html

Page 30: AWS CLIでAssumeRole

AssumeRolePolicyDocumentの設定例{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:user/IAM-User-AssumeTest" }, "Action": "sts:AssumeRole" } ] }

ExternalId(ユニークなキー)やMFA必須も設定可能

"Condition": { "StringEquals": { "sts:ExternalId": "TestExternalId" }, "Bool": { "aws:MultiFactorAuthPresent": true } }

Page 31: AWS CLIでAssumeRole

AssumeRoleする側の設定例$ IAM_USER_NAME=IAM-User-AssumeTest $ aws iam get-account-authorization-details --filter User \ --query "UserDetailList[?UserName==\`${IAM_USER_NAME}\`]" [ { "UserName": "IAM-User-AssumeTest", "GroupList": [], "CreateDate": "2015-05-13T01:12:40Z", "UserId": "AIDAIN5BGYGE4BGFZ6ZL6", "Path": "/", "AttachedManagedPolicies": [ { "PolicyName": "BeforeAssumeRole-Policy", "PolicyArn": "arn:aws:iam::111122223333:policy/BeforeAssumeRole-Policy" } ], "Arn": "arn:aws:iam::111122223333:user/IAM-User-AssumeTest" } ]

一応ManagedPolicyを使ってみた

Page 32: AWS CLIでAssumeRole

$ ATTACHED_USER_POLICY_NAME=`aws iam list-attached-user-policies --user-name ${IAM_USER_NAME} \ --query "AttachedPolicies[0].PolicyName" --output text` $ aws iam get-account-authorization-details --filter LocalManagedPolicy \ --query "Policies[?PolicyName==\`${ATTACHED_USER_POLICY_NAME}\`]" [ { "PolicyName": "BeforeAssumeRole-Policy", "CreateDate": "2015-05-14T03:03:33Z", "AttachmentCount": 1, "IsAttachable": true, "PolicyId": "ANPAJOUZGMVOPZZI3FLDW", "DefaultVersionId": "v1", "PolicyVersionList": [ { "CreateDate": "2015-05-14T03:03:33Z", "VersionId": "v1", "Document": { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::222233334444:role/IAM-Role-AssumeTest", "Effect": "Allow" } ] }, "IsDefaultVersion": true } ], "Path": "/", "Arn": "arn:aws:iam::111122223333:policy/BeforeAssumeRole-Policy", "UpdateDate": "2015-05-14T03:03:33Z" } ]

AssumeRoleする権限のみ付与

{ "Action": "sts: AssumeRole", "Resource": "arn:aws:iam::222233334444:role/IAM-Role-AssumeTest", "Effect": "Allow" }

Page 33: AWS CLIでAssumeRole

AssumeRoleされる側の設定例$ IAM_ROLE_NAME=IAM-Role-AssumeTest $ aws iam get-account-authorization-details --filter Role \ --query "RoleDetailList[?RoleName==\`${IAM_ROLE_NAME}\`]" [ { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::111122223333:user/IAM-User-AssumeTest" }, "Effect": "Allow", "Sid": "" } ] }, "RoleId": "AROAJAF2IVAI6NIZZ3X34", "CreateDate": "2015-05-14T04:07:58Z", "InstanceProfileList": [], "RoleName": "IAM-Role-AssumeTest", "Path": "/", "AttachedManagedPolicies": [ { "PolicyName": "AfterAssumeRole-Policy", "PolicyArn": "arn:aws:iam::222233334444:policy/AfterAssumeRole-Policy" } ], "RolePolicyList": [], "Arn": "arn:aws:iam::222233334444:role/IAM-Role-AssumeTest" } ]

前述のAssumeRolePolicyDocument

一応ManagedPolicyを使ってみた

Page 34: AWS CLIでAssumeRole

$ ATTACHED_ROLE_POLICY_NAME=`aws iam list-attached-role-policies --role-name ${IAM_ROLE_NAME} \ --query "AttachedPolicies[0].PolicyName" --output text` $ aws iam get-account-authorization-details --filter LocalManagedPolicy \ --query "Policies[?PolicyName==\`${ATTACHED_ROLE_POLICY_NAME}\`]" [ { "PolicyName": "AfterAssumeRole-Policy", "CreateDate": "2015-05-14T04:10:33Z", "AttachmentCount": 2, "IsAttachable": true, "PolicyId": "ANPAJTNO5P4GDC4GTFPC2", "DefaultVersionId": "v1", "PolicyVersionList": [ { "CreateDate": "2015-05-14T04:10:33Z", "VersionId": "v1", "Document": { "Version": "2012-10-17", "Statement": [ { "Action": "s3:*", "Resource": "*", "Effect": "Allow" } ] }, "IsDefaultVersion": true } ], "Path": "/", "Arn": "arn:aws:iam::222233334444:policy/AfterAssumeRole-Policy", "UpdateDate": "2015-05-14T04:10:33Z" } ]

S3フルアクセス権限のみ付与する例

{ "Action": "s3:*", "Resource": "*", "Effect": "Allow" }

Page 35: AWS CLIでAssumeRole

AWS CLIでassume-role

(コマンド) $ AWS_ID=222233334444 $ IAM_ROLE_NAME=IAM-Role-AssumeTest $ IAM_ROLE_ARN=arn:aws:iam::${AWS_ID}:role/${IAM_ROLE_NAME} $ ROLE_SESSION_NAME=AssumeTest-Session

$ aws sts assume-role \ --role-arn ${IAM_ROLE_ARN} \ --role-session-name ${ROLE_SESSION_NAME}

任意のセッション名

Page 36: AWS CLIでAssumeRole

(結果) { "AssumedRoleUser": { "AssumedRoleId": "AROAJAF2IVAI6NIZZ3X34:AssumeTest-Session", "Arn": "arn:aws:sts::222233334444:assumed-role/IAM-Role-AssumeTest/AssumeTest-Session" }, "Credentials": { "SecretAccessKey": yyyyyyyy", "SessionToken": "zzzzzzzzzzzz", "Expiration": "2015-05-25T19:00:00Z", "AccessKeyId": "xxxx" } }

Page 37: AWS CLIでAssumeRole

assume-roleで使えるオプション--duration-seconds

有効期間(単位:秒)を設定 15m~1h(デフォルト1h)

--external-id 任意のユニークな文字列を指定可能 ※AssumeRolePolicyDocumentのConditionと組み合わせて利用

--serial-number, --token-code MFA保護でも利用可能 ※AssumeRolePolicyDocumentのConditionと組み合わせて利用

(参考)http://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html

Page 38: AWS CLIでAssumeRole

Assumed Roleの使い方

前述の期限付き認証の使い方と同じ

Page 39: AWS CLIでAssumeRole

(補足2)configファイル利用で 簡単にAssumeRole

[profile assumed] role_arn = arn:aws:iam::222233334444 :role/IAM-Role-AssumeTest source_profile = IAM-User-AssumeTest

上記設定で、Assumed Roleがprofileの1つ(--profile)として利用できる

source_profileを指定する場合は、事前設定が必要

期限が切れても自動更新されるのでセキュリティに要注意

(参考)http://dev.classmethod.jp/cloud/aws/aws-cli-supports-assume-role-credentials-provider-and-mfa/

Page 40: AWS CLIでAssumeRole

(補足3)Mangement Consoleでも AssumeRole(Switch Role)

元アカウントでManagement Consoleログインできる状態で前述の設定をすると、Mangement ConsoleでもSwitch Roleできてしまう

セキュリティに要注意

(参考)http://dev.classmethod.jp/cloud/aws/switching-to-a-iam-role/

Page 41: AWS CLIでAssumeRole

AssumeRoleのユースケース

複数のAWSアカウントを利用して作業する際に、多くのIAMパスワードを管理したくない

Page 42: AWS CLIでAssumeRole

(補足4) EC2インスタンスプロファイルも実装は同じ$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2RoleTest { "Code" : "Success", "LastUpdated" : "2015-05-14T09:36:35Z", "Type" : "AWS-HMAC", "AccessKeyId" : "xxxx", "SecretAccessKey" : "yyyyyyyy", "Token" : "zzzzzzzzzzzz", "Expiration" : "2015-05-14T16:00:15Z" }

CLIでIAMロールを作成する場合、Instance Profileは別途作成、ロールへの割当が必要な点に注意

$ aws iam create-instance-profile --instance-profile-name ${INSTANCE_PROFILE_NAME} $ aws iam add-role-to-instance-profile --role-name ${IAM_ROLE_NAME} \ --instance-profile-name ${INSTANCE_PROFILE_NAME}

Page 43: AWS CLIでAssumeRole

(補足5)期限付き認証でMangement Consoleログインも可能

Assumed RoleとFederated User用にURLを作成して、AWS Management Consoleにログインすることも可能

(参考)http://docs.aws.amazon.com/ja_jp/STS/latest/UsingSTS/STSMgmtConsole-manualURL.html

(参考)http://www.infilic.co.jp/tech/?p=597

Page 44: AWS CLIでAssumeRole

まとめ

期限付き認証を利用は十分注意して設定する

IAMロールの動作理解を深める為に勉強しておくと良いと思われる

Cognitoを使っていくことが望ましい(要検証)