aws cliでassumerole

Post on 11-Jan-2017

2.455 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

AWS CLIでAssumeRole

前置き

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

Temporary Security Credential

AccessKeyId

SecretAccessKey

AccessKeyId

SecretAccessKey

SessionToken

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

Temporary Security Credentialの種類

種別 説明 権限

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

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

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

MFA利用不可

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

MFA利用可

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

Temporary Security Credentialの取得

Security Token Service(STS)から取得

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

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

GetSessionToken

GetSessionTokenのイメージ

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

AccessKeyId SecretAccessKey

AccessKeyId SecretAccessKey SessionToken

GetSessionTokenのポイント

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

MFA保護のAPIも利用可能

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

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

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

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

環境変数で指定 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

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

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 } '

GetSessionTokenユースケース

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

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

GetFederationToken

GetFederationTokenのイメージ

STSにFederatedユーザ作成を要求

Federated User

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

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

GetFederationTokenのポイント

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

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

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

AWS CLIでGetFederationToken

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

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

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

(結果) { "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は実際にはもっと長い

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

GetFederationTokenの使い方

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

GetFederationTokenユースケース

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

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

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

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

AssumeRoleのポイント

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

クロスアカウント可能

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

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

IAMロールのポイント

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

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

Trusted Entityになれる人

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

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

AWSアカウント(root)は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

Pricipal設定の注意

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

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

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

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

Resourceで権限範囲を規定

Principalで権限範囲を規定

IAM

STS、S3 bucket等

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

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

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

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 } }

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を使ってみた

$ 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" }

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を使ってみた

$ 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" }

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}

任意のセッション名

(結果) { "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" } }

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

Assumed Roleの使い方

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

(補足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/

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

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

セキュリティに要注意

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

AssumeRoleのユースケース

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

(補足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}

(補足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

まとめ

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

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

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

top related