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を使っていくことが望ましい(要検証)

AWS CLIでAssumeRole