LoginSignup
0

More than 1 year has passed since last update.

【AWS CloudFormation】ロール作成を通してポリシーとロールの関係を理解する

Last updated at Posted at 2021-09-09

CloudFormationでRoleを作成しようとしたところ、かなりハマってしまったので、ポリシーとロールの現状の理解をまとめておこうと思います。

■ ポリシーとは

ポリシーとは、だれがどんな操作をどのリソースに対して 行えるかを定義する仕組みです。
ポリシーの定義は主に下記の要素で構成されています。

  • Principal
    誰が に相当する項目。IAMユーザー(ロール)やAWSサービスを指定します。
  • Action
    どんな操作を に相当する項目。 s3:GetObjec のようにAWSサービスとその操作を : 区切りで指定します。
  • Resource
    どのリソースに対して に相当する項目。 arn:aws:s3:::DOC-EXAMPLE-BUCKET/* のように操作対象のリソースを指定します。
  • Effect
    操作を許可する( Allow )か、許可しない( Deny ) かを指定します。

例えば、S3の読み込み専用ポリシー( AmazonS3ReadOnlyAccess )の定義はこんな感じ

AmazonS3ReadOnlyAccess
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",  // *はワイルドカード
                "s3:List*"
            ],
            "Resource": "*"
        }
    ]
}

◎ ポリシータイプ

そんなポリシーにはいくつか種類があります。。。が、今回は必要な2に絞って理解していきます。

  1. アイデンティティベースのポリシー
  2. リソースベースのポリシー

◎ 1. アイデンティティベースのポリシー

IAM アイデンティティ (ユーザー、ユーザーのグループ、ロール)にアタッチするポリシーで、アタッチされたIAMアイデンティティが どのリソースに対して(Resource)どんな操作を(Action) 行えるのかを定義します。
誰が(Principal) はアタッチされたIAMアイデンティティであるため、 Principal のセクションは指定しません。
アイデンティティベースのポリシーには次のような分類があります。

  • AWS管理ポリシー
    AWSが用意している再利用可能なポリシー
  • カスタマー管理ポリシー
    ユーザー側で作成した再利用可能なポリシー
  • インラインポリシー
    各IAMアイデンティティに直接追加するポリシー

管理ポリシーとインラインポリシーの比較

例) S3のフルアクセスポリシー

AmazonS3FullAccess
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

◎ 2. リソースベースのポリシー

リソースベースのポリシーはAWSリソースにアタッチするポリシーで、リソースが 誰に(Principal)どんな操作を(Action) 許可するのかを定義します。
どのリソースに対して(Resource) はアタッチされたリソースであるため、 Resource セクションは指定しません。
リソースベースのポリシーにはS3のバケットポリシーやIAMロールの信頼ポリシーがあります。
今回理解しておかなければならないのは IAMロールの信頼ポリシー です。

# IAMロールの信頼ポリシー

IAMロールの信頼ポリシーとはIAMロールにアタッチするポリシーで、アタッチされたIAMロールが保有する権限をIAMアイデンティティやAWSサービスに移譲することができます。

例えば、このポリシーはIAMロールが保有する権限をAWS Lambdaに移譲できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                // "AWS": ["arn:aws:iam::AWS-account-ID:user/user-name-1"] のようにIAMアイデンティティを指定してもOK
                "Service": ["lambda.amazonaws.com"] 
            },
            "Action": "sts:AssumeRole",
        }
    ]
}

■ ロールとは

IAMロールはアイデンティティベースのポリシー(Policies)IAMロールの信頼ポリシー(AssumeRolePolicyDocument) から成り立っており、アイデンティティベースのポリシー の権限を IAMロールの信頼ポリシー で指定したIAMアイデンティティやAWSサービスに移譲することができます。

■ CloudFormationでロールを作成

ポリシーとロールを理解したところで、CloudFormationでロールを作成していきます。

◎ 設定項目

  • RoleName: 任意のロール名を指定します。
  • AssumeRolePolicyDocument
    IAMロールの信頼ポリシーを定義します。 IAMロールの権限を Principal に移譲するための信頼ポリシーを指定します。
    • Version: 2012-10-17 が現行
    • Statement: ポリシーを定義します。(配列形式)
      • Effect: 操作の許可( Allow )・不許可( Deny )を指定します。
      • Action: s3:GetObject のように、どのAWSサービスの何の操作を対象とするのかを配列形式で指定します。
      • Principal: ポリシーを適用するIAMアイデンティティ、AWSサービスなどを指定します。
        • IAMユーザー: "AWS": ["arn:aws:iam::AWS-account-ID:user/user-name-1"]
        • IAMロール: "AWS": "arn:aws:iam::AWS-account-ID:role/role-name"
        • AWSサービス: "Service": ["ecs.amazonaws.com"]
  • ManagedPolicyArns: 管理ポリシー(アイデンティティベースのポリシー)のARNを配列形式で指定します。
  • Policies: インラインポリシー(アイデンティティベースのポリシー)を配列形式で定義します。
    • PolicyName: ポリシー名を指定します。
    • PolicyDocument
      • Version: 2012-10-17 が現行
      • Statement: ポリシーを定義します。(配列形式)
        • Effect: 操作の許可( Allow )・不許可( Deny )を指定します。
        • Action: s3:GetObject のように、どのAWSサービスの何の操作を対象とするのかを配列形式で指定します。
        • Resource: 操作対象のリソースを指定します。

◎ テンプレート

管理ポリシーを利用するパターンと、インラインポリシーを利用するパターン、2種類の定義を作成します。

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  # 1. 管理ポリシーを利用してRoleを定義
  SampleRole01:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument: # IAMロールの信頼ポリシーの定義
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - sts:AssumeRole
            Principal:
              Service:
                - lambda.amazonaws.com # AWS Lambdaにロールを適用できるように設定
      ManagedPolicyArns: # 管理ポリシー(アイデンティティベースのポリシー)の指定
        - arn:aws:iam::aws:policy/TranslateFullAccess
      RoleName: sample-role-01

  # 2. インラインポリシーを利用してRoleを定義
  SampleRole02:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument: # IAMロールの信頼ポリシーの定義
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - sts:AssumeRole
            Principal:
              Service:
                - lambda.amazonaws.com # AWS Lambdaにロールを適用できるように設定
      Policies: # インラインポリシーを定義
        - PolicyName: hoge
          PolicyDocument: 
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - translate:*
                  - comprehend:DetectDominantLanguage
                  - cloudwatch:GetMetricStatistics
                  - cloudwatch:ListMetrics
                  - s3:ListAllMyBuckets
                  - s3:ListBucket
                  - s3:GetBucketLocation
                  - iam:ListRoles
                  - iam:GetRole
                Resource: '*'
      RoleName: sample-role-02

■ 参考記事

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