業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【Hakkyの社内Wiki】Strapi
クラウドとオンプレの違いAIシステム導入時におすすめのクラウドシステムスクレイピングのためのプロキシサーバのAPI
AI

執筆者:Handbook編集部

AWSのIAMとは?わかりにくいAssumeRoleについて詳しく解説

IAMの概要

AWS IAMは、クラウド上でのアクセス制御とセキュリティ管理を一元的に行うためのサービスです。これにより、組織は誰がAWSリソースにアクセスできるかを管理することができます。

基本的な用語、概念について

IAMユーザー

IAMユーザーと似ているものとして、ルートユーザーがあげられます。AWSアカウントを作成すると自動で設定されるルートユーザーはすべての権限を持っています。

一方で、IAMユーザーは指定されたAWSリソースへのアクセス権のみを持ちます。 ルートユーザは無制限のアクセスがあるため、非常に便利ですが、意図しない誤操作や乗っ取られた際のセキュリティーリスクの原因となってしまう可能性があります。そのため、IAMユーザーを作成し、最小限の権限を付与することが推奨されています。また、IAMユーザは多要素認証(MFA)を設定することができるため、不正アクセスのリスクが軽減されます。

例えば、開発者がEC2の作成を行いたい場合、EC2の作成権限のみを付与したIAMユーザーを作成し、開発者にそのIAMユーザーを利用して作業を行うように指示することで、セキュリティを強化することができます。

IAMグループ

複数のIAMユーザーをグループ化し、共通のアクセス権限を設定できます。これにより、管理が簡素化されます。

IAMポリシー

JSON形式のポリシードキュメントを使用して、誰がどのリソースに対してどのような操作を許可するか定義したものです。AWSが用意したポリシーのほかにも自分で一から作成することが可能です。

ロール

一時的なアクセス権を付与するためのエンティティです。ロールはIAMユーザー、AWSサービス、または外部のIDプロバイダーに割り当てることができます。 つまり、IAMロール単体では何も起きず、他のエンティティに割り当てることで機能します。

そして、IAMロールは三つのポリシーを設定することができそれぞれ以下のことを定義できます。

  • 信頼ポリシー

    • IAMロールを引き受ける(Assume)することのできるエンティティーを定義
  • アイデンティティベースポリシー

    • 実行できるアクションを定義
  • permission boundary

    • 実行できるアクションに境界を設定

AssumeRole

AssumeRoleは、その名の通りほかのエンティティーがIAM ロールを引き受けるためのアクションを表します。 具体的には、エンティティがAWS STS(AWS Security Token Service)にAssumeRoleを依頼すると、STSはポリシーに従って問題がないかを確認し、問題がなければユーザーに一時的なセキュリティ資格情報を返します。 資格情報は以下の三つから構成されています。

  • アクセスキーID
  • シークレットアクセスキー
  • セッショントークン この情報を使って以下のようにAWSリソースにアクセスすることができます。
dynamodb = boto3.client(
    "dynamodb",
    aws_secret_access_key=aws_secret_access_key,
    aws_access_key_id=aws_access_key_id,
    aws_session_token=aws_session_token,
    region_name="ap-northeast-1",
)

少しわかりにくいので、実際のTerrafomのコードを見てみましょう。

AssumeRoleの特徴として、AWS内部のリソースだけでなく、外部のリソースからもロールを引き受けることができるという特徴があります。 今回はGCPからAWSのDynamoDBにアクセスできるようなロールを引き受けたいと思います。

こちらに書いてあるように、AssumeRoleする方法は複数あり、今回はOIDCプロバイダーを使用した方法を紹介します。 OIDCでの認証の方法について今回は触れません。詳しくはこちらの記事をご参照ください。

#IAM ロール
resource "aws_iam_role" "test-tole" {
  name               = "${local.prefix}-test-tole"

  # AssumeRoleのポリシー
  assume_role_policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            # ロールを引き受けるエンティティを指定
            "Principal": {
              "Federated": "accounts.google.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                # google_service_account_idが想定したものと一致した場合許可
                "StringEquals": {
                    "accounts.google.com:aud": "${var.google_service_account_id}",
                    "accounts.google.com:oaud": "sts.amazonaws.com",
                    "accounts.google.com:sub": "${var.google_service_account_id}"
                }
            }
        }
    ]
}
EOF
}
# アイデンティティベースポリシーを定義(実行できるアクションを定義)
resource "aws_iam_policy" "teest" {
  name        = "${local.prefix}-test"
  description = "Allows read only access to DynamoDB tables"
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Effect = "Allow",
        Action = [
          "dynamodb:DescribeTable",
          "dynamodb:GetItem",
          "dynamodb:BatchGetItem",
          "dynamodb:Query",
          "dynamodb:Scan"
        ],
        # すべてのリソースに対して許可
        Resource = "*"
      }
    ]
  })
}
resource "aws_iam_role_policy_attachment" "integration" {
  role       = aws_iam_role.integration.name
  policy_arn = aws_iam_policy.integration.arn
}

まとめ

AWS IAMは、AWSリソースへのアクセス管理とセキュリティの中核となるサービスです。ユーザー管理、アクセス管理、セキュリティ機能を通じて、組織はAWS環境の安全性と効率性を確保することができます。IAMを適切に設定し、ベストプラクティスに従うことで、AWSリソースの保護と管理が強化されます。

参考

info
備考

Hakky ではエンジニアを募集中です!まずは話してみたいなどでも構いませんので、ぜひお気軽に採用ページからお問い合わせくださいませ。

2025年06月15日に最終更新
読み込み中...