ユーザー、グループ、ロールを IAM アイデンティティと呼びます。
IAM アイデンティティ (ユーザー、グループ、またはロール) に埋め込まれたポリシーです。つまり、ポリシーは本質的にアイデンティティの一部です。
※ ARN を持つポリシーを スタンドアロンポリシー と呼びます。
ref. https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_managed-vs-inline.html
<img width="939" alt="IAM_Management_Console" src="https://user-images.githubusercontent.com/1384665/175669257-e2fff1c6-36c2-44d0-b31a-1e6c65a12581.png)
信頼関係(信頼ポリシー)はロールを利用できる対象を表します。
AssumeRolePolicyDocument The trust policy that is associated with this role. Trust policies define which entities can assume the role. You can associate only one trust policy with a role. For an example of a policy that can be used to assume a role, see Template Examples. For more information about the elements that you can use in an IAM policy, see IAM Policy Elements Reference in the IAM User Guide.
STS で一時的に発行した認証情報を使ってロールの引き受け手にリソースの操作権限を付与する仕組みです。
IAMロールは、AWSのサービスやアプリケーションに対して、一時的なAWSリソースの操作権限を与える仕組みです。
この操作権限はAWS Security Token System(AWS STS)を利用し、一時的認証情報(Temporary Security Credential)を発行するこにより実現しています。
一時的認証情報の実態は、有効期限が短いアクセスキーとシークレットキー、セッショントークンです。
AWSサービスやアプリケーションは、受け取った一時的認証情報を使いS3やKMSといった対象のAWSリソースを利用します。-- 要点整理から攻略する AWS認定セキュリティ・専門知識
AWS IAM のロールを引受ける(AssumeRole)仕組みを整理します。
IAM ロールには 2 種類のポリシーが存在します。
| ポリシー | 役割 |
|---|---|
| アクセス権限ポリシー | どのリソースに対して何ができるか IAM Action List |
| 信頼ポリシー( AssumeRolePolicyDocument ) | 誰がそのロールを引き受けられるか |
Action:何ができるか(例:s3:GetObject)Resource:どのリソースに対して許可するか(例:arn:aws:s3:::my-bucket)CloudFormation では AssumeRolePolicyDocument に Principal(引受を許可するエンティティ)を記載します。
AWS サービス( codepipeline.amazonaws.com 等)と IAM ユーザー / ロールで必要な設定が異なります。
AWS が管理するサービスは sts:AssumeRole を呼び出す能力を AWS が内部的に持っているため、ロール側の信頼ポリシー1つで完結します。
※ STS:AWS Security Token Service 。
IAM ユーザーは自動的に AssumeRole の権限を持たないため、プリンシパル側にも明示的なポリシーが必要です。
| プリンシパルの種類 | ロール側の信頼ポリシー | プリンシパル側のポリシー |
|---|---|---|
| AWS サービス(CodePipeline 等) | 必要 | 不要 |
| IAM ユーザー | 必要 | 必要 |
| IAM ロール(クロスアカウント等) | 必要 | 必要 |
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::98765432109:foo"
},
"Action": "sts:AssumeRole"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::12345678901:role/OrganizationAccountAccessRole"
}
]
}
IAM ユーザー( foo )に上記インラインポリシーを付与することで、OrganizationAccountAccessRole( AdministratorAccess )を引き受けて S3 を操作できるようになります。
MyBucketRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: MySampleBucketRole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service:
- "codepipeline.amazonaws.com" # AWS サービスを信頼
Action:
- "sts:AssumeRole"
Policies:
- PolicyName: "CodePipelineS3AccessPolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Action:
- s3:ListAllMyBuckets
Resource: "arn:aws:s3:::*"
- Action:
- s3:GetObject
- s3:PutObject
- s3:DeleteObject
Resource: "arn:aws:s3:::my-sample-bucket-unique-name"
この設定では codepipeline.amazonaws.com のみを信頼しています。
codepipeline.amazonaws.com は前述のように AWS 管理サービスなので sts:AssumeRole を呼び出す能力を AWS が内部的に持っているため、ロール側の信頼ポリシー1つで完結します。
また IAM ユーザーがアクセスキーで直接 my-sample-bucket-unique-name を直接操作することはできません。
信頼関係(信頼ポリシー)についてクロスアカウントロール(ユーザーからのみスイッチできるIAMロール)を例に説明する。
AWSの薄い本 IAMのマニアックな話 p39
クロスアカウントロールのスイッチ元の制限は Condition(条件) ではなく Principal(信頼関係) を利用する。
アカウントAAAAAAAAAAAのfooロールからアカウントBBBBBBBBBBBのbarロールにスイッチロールする例。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::BBBBBBBBBBB:role/bar"
],
"Effect": "Allow"
}
]
}
信頼関係の例(JSON)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:iam::AAAAAAAAAAA:role/foo"
},
"Action": "sts:AssumeRole",
}
]
}
アクセス権限AdministratorAccessの例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
ECSアプリケーションの信頼関係の例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"ecs-tasks.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
上記の信頼関係をCloudFormationdeで定義すると以下のようになります。 参考に許可も設定しています(anagedPolicyArns)。
AppRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service:
- "ecs-tasks.amazonaws.com"
Action:
- "sts:AssumeRole"
Path: "/"
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSQSFullAccess
- arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements_principal.html
バウンダリーは、IAMユーザーまたはIAMロールに対するアクセス制限として動作します。 付与した権限とBoundaryで許可した権限と重なる部分のみ有効な権限として動作します。
AWS Security Token Service (AWS STS) を使用して、AWS リソースへのアクセスをコントロールできる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供することができます。一時的セキュリティ認証情報の機能は、IAM ユーザーが使用できる長期的なアクセスキー認証情報とほとんど同じですが、次の相違点があります。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html
ECSコンテナ内のアプリケーションがSQSにアクセスする場合を考える。
TaskRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service:
- "ecs-tasks.amazonaws.com"
Action:
- "sts:AssumeRole"
Path: "/"
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSQSFullAccess
- arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
CloudFormationのAWS::IAM:RoleはJSONポリシーを使って記載される。
principal:主要な、認証の対象、当事者assume:引き受けるsts:AWS Security Token Service (AWS STS)