#
ドキュメント

Document

自分のための備忘録です。

IAM(AWS Identity and Access Management)

Ref.

IAMリソース

  • ユーザー
    • ルートユーザー(アカウント毎に1つ発行)
    • IAMユーザー
  • グループ
  • ロール

ユーザー、グループ、ロールをIAM アイデンティティと呼びます。

IAMポリシー

  • AWS 管理ポリシー(AWS managed policies)
    • AWSビルトインのスタンドアロンポリシー
  • カスタマー管理ポリシー(Customer managed policies)
    • カスタムのスタンドアロンポリシー
  • インラインポリシー(Inline policies)
    • IAM アイデンティティ (ユーザー、グループ、またはロール) に埋め込まれたポリシーです。つまり、ポリシーは本質的にアイデンティティの一部です。

    • スタンドアロンポリシーではない

※ ARNを持つポリシーをスタンドアロンポリシーと呼びます。

ref. https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_managed-vs-inline.html

IAMロール

IAMロールは、AWSのサービスやアプリケーションに対して、一時的なAWSリソースの操作権限を与える仕組みです。
この操作権限はAWS Security Token System(AWS STS)を利用し、一時的認証情報(Temporary Security Credential)を発行するこにより実現しています。
一時的認証情報の実態は、有効期限が短いアクセスキーとシークレットキー、セッショントークンです。
AWSサービスやアプリケーションは、受け取った一時的認証情報を使いS3やKMSといった対象のAWSリソースを利用します。

-- 要点整理から攻略する AWS認定セキュリティ・専門知識

IAMロールの構成要素

  • 許可(アクセス権限ポリシー):どのリソースに対して何ができるか
    • Action:何ができるかを表す
      ref. IAM Action List
    • Resources:どのリソースに対してActionを許すかを表す
  • 信頼関係(信頼ポリシー):誰がそのロールを引き受けることができるか
    • 誰が引き受けることができるかをAssumeRolePolicyDocumentPricipalに記載する
  MyBucketRole:
    Type: "AWS::IAM::Role"
    Properties:
      RoleName: MySampleBucketRole
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "codepipeline.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: /
      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

my-sample-bucket-unique-nameのオブジェクトを操作するには、バケットを一覧表示するs3:ListAllMyBucketsアクションが必要

  • my-sample-bucket-unique-nameに読み書き権限を許可する
  • codepipeline.amazonaws.comサービスを信頼する(ロールを引き受けることができる)

許可

IAM_Management_Console

信頼関係

IAM_Management_Console

信頼関係の詳細

信頼関係(信頼ポリシー)はロールを利用できる対象を表す。

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.

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html#cfn-iam-role-assumerolepolicydocument

信頼関係(信頼ポリシー)についてクロスアカウントロール(ユーザーからのみスイッチできるIAMロール)を例に説明する。 AWSの薄い本 IAMのマニアックな話 p39

例1 クロスアカウントロールのスイッチ

クロスアカウントロールのスイッチ元の制限はCondition(条件)ではなくPrincipal(信頼関係)を利用する。

アカウントAAAAAAAAAAAのfooロールからアカウントBBBBBBBBBBBのbarロールにスイッチロールする例。

アカウントAAAAAAAAAAA側のfooロール
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::BBBBBBBBBBB:role/bar"
            ],
            "Effect": "Allow"
        }
    ]
}
アカウントBBBBBBBBBBBのbarロール

信頼関係の例(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-tasks.amazonaws.com)を設定

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で許可した権限と重なる部分のみ有効な権限として動作します。

STS AWS Security Token Service

AWS Security Token Service (AWS STS) を使用して、AWS リソースへのアクセスをコントロールできる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供することができます。一時的セキュリティ認証情報の機能は、IAM ユーザーが使用できる長期的なアクセスキー認証情報とほとんど同じですが、次の相違点があります。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html

ユースケース

ECSコンテナ内のアプリケーションがSQSにアクセスする場合を考える。

Bad

  • コンテナ内のアプリケーション用にユーザーを作成してSQSのアクセス件を付与
  • ↑のユーザーのキー、シークレットキーでSQSにアクセス

Good

  • ロールを使用してタスク(コンテナ)にタスクロールに付与
  • コンテナアプリSTSを使用して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

CloudFormationAWS::IAM:RoleはJSONポリシーを使って記載される。

備考

  • principal:主要な、認証の対象、当事者
  • assume:引き受ける
  • sts:AWS Security Token Service (AWS STS)
  • 認証(Authentication):本人確認
  • 認可(Authorization):リソースに対する使用権限付与

Ref.