0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IAM・STS・CognitoについてDVA対策としてまとめてみる

0
Posted at

Trust Policy

誰がそのRoleを引き受けられるかを定義します。

例えばLambda Execution Roleなら、

Lambda
 ↓
sts:AssumeRole
 ↓
IAM Role

となるため、RoleのTrust PolicyではLambda Serviceを信頼します。

Principal
→ lambda.amazonaws.com

Action
→ sts:AssumeRole

重要なのは、RoleへPermissions Policyを追加しただけでは不十分という点です。

Permissions Policy
→ DynamoDBへのAccessをAllow

しかし

Trust Policy
→ LambdaをTrustしていない

結果
→ LambdaはRoleを利用できない

Lambda Execution Roleなら、

Trust Policy
→ lambda.amazonaws.com

Permissions Policy
→ Lambda実行中に必要なAWS Permission

の両方を考えます。

Permissions Policy

Roleを引き受けたあと、そのRoleで何ができるかを定義します。

Lambda
 ↓
Execution Role
 ↓
Permissions Policy
 ↓
DynamoDB PutItem

覚え方は、

Trust Policy
→ 誰がRoleを使える?

Permissions Policy
→ Roleを使ったら何ができる?

です。

AWS STS / AssumeRole

AWS Security Token Service(STS)は、一時的なSecurity Credentialsを発行します。

User / Application
 ↓
sts:AssumeRole
 ↓
IAM Role
 ↓
Temporary Credentials
 ↓
AWS Resource

取得する一時認証情報には、

AccessKeyId
SecretAccessKey
SessionToken

などが含まれます。

Cross-Account AssumeRole

Cross-Account AssumeRoleでは基本的に、

Account A
呼び出し側Principal
 ↓
Identity-based Policy
sts:AssumeRoleをAllow
 ↓
STS
 ↓
Account B
Role Trust Policy
Account A側PrincipalをTrust
 ↓
IAM Role

と考えます。

つまり、

呼び出し側
→ sts:AssumeRoleを実行できる

+

引き受けられる側Role
→ 呼び出し側PrincipalをTrustする

の両方を確認します。

External ID

第三者企業などへCross-Account Roleを委任する場合に登場するのがExternal IDです。

自社AWS Account
 ↓
監視サービス会社へ
Cross-Account Roleを提供

Lambda Execution Role

Lambdaが他のAWS Serviceへアクセスするときに利用するRoleです。

Lambda
 ↓
Execution Role
 ├→ DynamoDB
 ├→ S3
 ├→ SQS
 └→ CloudWatch Logs

例えばLambdaからDynamoDBへ書き込むなら、

Action
→ dynamodb:PutItem

Resource
→ 対象Table

などをExecution Roleへ許可します。

EC2 IAM Role / Instance Profile

EC2からAWS Serviceへアクセスする場合も、Access KeyをEC2へ保存するのではなくIAM Roleを利用します。

EC2
 ↓
Instance Profile
 ↓
IAM Role
 ↓
S3

EC2ではIAM RoleをInstance Profileを通してInstanceへ関連付けます。

AWS SDKなどはEC2のInstance Metadata Service(IMDS) から一時Credentialsを取得できます。

Application
 ↓
AWS SDK
 ↓
IMDS
 ↓
Temporary Credentials
 ↓
AWS API

IMDSではIMDSv2の利用が推奨されます。

iam:PassRole

例えばDeveloperがLambda Functionを作成するとき、

Developer
 ↓
Lambda Function作成
 ↓
Execution Roleを指定

します。

DeveloperがそのRoleをLambdaへ渡すには、

iam:PassRole

が必要です。

PassRoleで渡せるRoleを制限する

例えば、

Action
→ iam:PassRole

Resource
→ *

としてしまうと、強力なRoleをServiceへ渡せる可能性があります。

そのため、

Resource
→ 渡してよいRole ARN

のように対象Roleを限定することが重要です。

さらに、

iam:PassedToService

Condition Keyを利用して、Roleを渡せるServiceを制限できます。

Permissions Boundary

Permissions Boundaryは、IAM UserやRoleが持てるPermissionの最大範囲を制限します。

Identity Policy
→ S3 + DynamoDBをAllow

Permissions Boundary
→ S3のみAllow

なら、

実際に利用できる範囲
→ S3

です。

Explicit Deny

IAMのPermission評価は大まかに、

Default
→ Deny

Allowが存在
→ 許可候補

Explicit Denyが存在
→ Deny

と考えます。

つまり、

Allow
+
Explicit Deny

↓

Deny

です。

Resource-based Policy

Resource側へ直接設定するPolicyがあります。

例えば、

API Gateway
 ↓
Lambda Resource-based Policy
 ↓
Lambda

という関係があります。

一方、

Lambda
 ↓
DynamoDB

でLambda自身がDynamoDBへアクセスするPermissionはExecution Role側です。

Cognito User PoolのToken

User Poolでは代表的に、

ID Token
Access Token
Refresh Token

を扱います。

ID Token

User情報・属性を含みます。

ID Token
→ User情報
→ email / usernameなどのClaim

Access Token

APIなどへのAuthorizationに利用します。

Access Token
→ API Access
→ Scope

Refresh Token

新しいID Token / Access Tokenを取得するために利用します。

Refresh Token
 ↓
新しいTokenを取得

ID Token / Access Tokenには有効期限があり、Refresh Tokenはより長期間のSession維持に利用します。

API Gateway + Cognito

Web ApplicationからAPI Gatewayへアクセスする場合、

User
 ↓
Cognito User Pool
 ↓
JWT
 ↓
API Gateway
 ↓
Lambda

という構成を作れます。

API Gatewayでは、

REST API
→ Cognito User Pool Authorizer

HTTP API
→ JWT Authorizer

という形で利用できます。

Cognito Identity Pool

Identity PoolはUserへAWSの一時認証情報を提供するために利用します。

User
 ↓
Identity Pool
 ↓
Temporary AWS Credentials
 ↓
IAM Role
 ↓
S3 / DynamoDB

ここがUser Poolとの最大の違いです。

User Pool
→ Userを認証してTokenを発行

Identity Pool
→ AWS Temporary Credentialsを取得

です。

Identity Pool自体はUser Directoryではありません。

Authenticated / Guest

Identity Poolでは、

Authenticated Identity
→ 認証済みUser用Role

Unauthenticated Identity
→ Guest User用Role

のようにRoleを分けることができます。

例えば、

Login済みUser
→ Upload可能

Guest User
→ Read Only

といった制御ができます。

外部Identity Provider

Identity PoolではUser Poolだけでなく、外部Identity Providerと連携する構成もあります。

例えば、

Cognito User Pool
Google
Facebook
SAML
OIDC

などです。

Identity PoolはこれらのIdentityをAWSのTemporary Credentialsへ橋渡しします。

User Pool + Identity Pool

両方を組み合わせることもできます。

User
 ↓
Cognito User Pool
 ↓
Sign In
 ↓
JWT
 ↓
Cognito Identity Pool
 ↓
IAM Role
 ↓
Temporary AWS Credentials
 ↓
S3

例えば、

UserをLogin
 ↓
認証済みUserへ一時AWS Credentials
 ↓
ClientからS3へ直接Upload

という構成を作れます。

Identity Poolで利用するIAM Roleでは、Trust Policyも重要です。

概念的には、

Principal
→ cognito-identity.amazonaws.com

を信頼し、Identity Pool IDなどをConditionで制限します。

cognito-identity.amazonaws.com:aud
→ 対象Identity Poolを制限

といった形です。

User Pool vs Identity Pool

機能 User Pool Identity Pool
主目的 User認証 AWS Credentials取得
Sign Up / Sign In ○ ×(主目的ではない)
User Directory ○ ×
ID Token / Access Token JWTを発行 発行元ではない
API認証・認可用Token ○ 主目的ではない
IAM Roleとの連携 主目的ではない ○
Temporary AWS Credentials × ○
Guest Access 主目的ではない ○
S3へ直接Access JWTだけでは不可 ○(IAM Role経由)

Presigned URL

Client
 ↓
Application Server
 ↓
Presigned URL発行
 ↓
Client
 ↓
S3

一時的な特定操作を許可するのに向いています。

Identity Pool

User
 ↓
Cognito
 ↓
Temporary AWS Credentials
 ↓
IAM Role
 ↓
S3

AWS Credentialsを取得して、許可されたAWS APIを利用します。

特定Objectへ一時Access
→ Presigned URL

Userへ一時AWS Credentials
→ Cognito Identity Pool

と区別します。

CognitoとSTS

Identity PoolからAWS Resourceへアクセスする場合、一時CredentialsとIAM Roleが関係します。

概念的には、

User
 ↓
Identity Provider
 ↓
Identity Pool
 ↓
STS
 ↓
Temporary Credentials
 ↓
IAM Role
 ↓
AWS Resource

となります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?