1
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?

AWSのABACでタグベース権限制御を実装する - 従来のRBACを超えた柔軟なアクセス管理

Posted at

概要

AWS IAMにおけるABAC(Attribute-Based Access Control)を活用したタグベース権限制御の実装方法を解説します。従来のRBACでは困難だった複雑な権限管理要件を、リソースタグとプリンシパルタグを組み合わせることで柔軟に実現する方法を、具体的なコード例とともに紹介します。

目次

  1. ABACとは - 従来のRBACとの違い
  2. AWSにおけるABACの実装方法
  3. 実践的な設定例
  4. ベストプラクティスと注意点
  5. 料金への影響と運用コスト
  6. 終わりに
  7. 参考文献・参考サイト

ABACとは - 従来のRBACとの違い

ABACの本質:IAM Conditionの効果的活用

ABACは実質的にIAMポリシーのCondition要素をタグと組み合わせて使う手法です。新しい仕組みではなく、既存のIAM機能の効果的な活用パターンと理解すると分かりやすいでしょう。

// 従来のRBACアプローチ
{
    "Effect": "Allow",
    "Action": "ec2:*",
    "Resource": "*"
}
//  「このロールなら全部OK」静的な権限付与

// ABACアプローチ
{
    "Effect": "Allow", 
    "Action": "ec2:*",
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "aws:PrincipalTag/Department": "${aws:ResourceTag/Department}"
        }
    }
}
//  「タグが一致する場合のみOK」動的な権限付与

RBACの課題

従来のRBAC(Role-Based Access Control)では、事前に定義されたロールに基づいてアクセス制御を行います。しかし、組織の成長や複雑な業務要件に対応するには限界があります。

項目 RBAC ABAC
制御基準 事前定義されたロール 動的な属性情報
柔軟性 限定的 高い
管理複雑さ ロール数の増加で複雑化 タグ戦略で整理可能
スケーラビリティ 組織拡大で課題 属性追加で対応可能

ABACの特徴

ABAC(Attribute-Based Access Control)は、ユーザー、リソース、環境の属性情報を組み合わせて動的にアクセス制御を行う仕組みです。AWSでは、この属性情報をタグとして実装し、IAMポリシーのCondition要素で制御します。

実際のところ、多くの組織では公式に「ABAC」と呼ばずとも、IAMポリシーでタグベースの条件制御を行っており、これも広義のABACと言えます。重要なのは用語ではなく、タグを活用した柔軟な権限制御の実現です。

image.png

AWSにおけるABACの実装方法

AWSでは従来からIAMポリシーのCondition要素を使用したタグベース制御が可能でしたが、2024年11月にS3バケットレベルでABACを明示的に有効化できる新機能がリリースされました。

S3バケットでのABAC有効化(2024年11月新機能)

S3 汎用バケットでABACを使用するには、バケットごとに明示的にABACを有効化する必要があります。これにより、タグベースのアクセス制御がS3レベルで評価されるようになります。

コンソールでの有効化

S3コンソールでバケットを選択し、「Properties」タブから「Attribute-based access control (ABAC)」を有効化します。

CLIでの有効化

# PutBucketAbac APIを使用してABACを有効化
aws s3api put-bucket-abac \
    --bucket my-demo-development-bucket \
    --abac-status Status=Enabled \
    --region ap-northeast-1

CloudFormationでの設定

Resources:
  MyDevelopmentBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: my-demo-development-bucket
      AbacStatus:
        Status: Enabled
      Tags:
        - Key: Environment
          Value: Development
        - Key: Department
          Value: Engineering

重要な注意点: S3バケットでABACを有効化すると、従来のPutBucketTagging APIがブロックされます。タグ管理には標準のTagResource APIを使用する必要があります。既存のタグ付けワークフローを確認し、必要に応じて更新してください。

IAMポリシーでの条件設定

IAMポリシーのCondition要素でタグベースの制御を定義します。S3でABACを有効化したバケットに対して、以下のようなポリシーが機能します。

S3 ABACを使用したポリシー例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/environment": "development"
                }
            }
        }
    ]
}

このポリシーは、environment:developmentタグが付いたABAC有効化済みS3バケットに対してのみアクセスを許可します。

主要な条件キー

条件キー 用途
aws:PrincipalTag プリンシパル(ユーザー/ロール)のタグ参照 aws:PrincipalTag/Department
aws:RequestedRegion リクエストされたリージョン ap-northeast-1
aws:ResourceTag リソースのタグ参照 aws:ResourceTag/Environment
aws:TagKeys タグのキー名 Department, Project

プリンシパルタグの設定

プリンシパルタグは、IAMユーザーやロールに付与するタグです。これらのタグは条件文で参照され、動的なアクセス制御の基準となります。

IAMユーザーへのタグ付与

# AWS CLIでユーザーにタグを付与
aws iam tag-user \
    --user-name john.doe \
    --tags Key=Department,Value=Engineering \
           Key=Project,Value=WebApp \
           Key=AccessLevel,Value=Standard

IAMロールへのタグ付与

# ロールにタグを付与
aws iam tag-role \
    --role-name DeveloperRole \
    --tags Key=Department,Value=Engineering \
           Key=Environment,Value=Development \
           Key=CostCenter,Value=CC001

リソースタグの活用

リソースタグは、EC2インスタンス、S3バケット、RDSインスタンスなどのAWSリソースに付与するタグです。S3バケットの場合、ABAC有効化後は標準のTagResource APIを使用します。

S3バケットのタグ付け(ABAC有効化後)

# 標準のTagResource APIを使用(ABAC有効化後は必須)
aws s3api tag-resource \
    --resource-arn arn:aws:s3:::my-company-bucket \
    --tags Key=Department,Value=Engineering \
           Key=Environment,Value=Production \
           Key=DataClassification,Value=Internal

# 注意:ABAC有効化後はPutBucketTaggingは使用不可
# aws s3api put-bucket-tagging # これはエラーになります

EC2インスタンスのタグ付け

# EC2インスタンスにタグを追加
aws ec2 create-tags \
    --resources i-1234567890abcdef0 \
    --tags Key=Department,Value=Engineering \
           Key=Environment,Value=Production \
           Key=Project,Value=WebApp \
           Key=Owner,Value=john.doe

複合条件を使った高度な制御

実際の運用では、複数のタグを組み合わせた複雑な条件設定が必要になります。

複数タグによる制御例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalTag/Department": "${aws:ResourceTag/Department}",
                    "aws:ResourceTag/Environment": "Development"
                },
                "StringLike": {
                    "aws:PrincipalTag/AccessLevel": "*Admin*"
                }
            }
        }
    ]
}

時間ベースの制御

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "rds:*",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalTag/Department": "${aws:ResourceTag/Department}"
                },
                "DateGreaterThan": {
                    "aws:CurrentTime": "2024-01-01T00:00:00Z"
                },
                "IpAddress": {
                    "aws:SourceIp": "203.0.113.0/24"
                }
            }
        }
    ]
}

タグベースのリソース作成制御

新しいリソースを作成する際にも、タグベースの制御を適用できます。S3の新機能では、バケット作成時にタグ付けを強制することが可能になりました。

バケット作成時のタグ強制

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:CreateBucket",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/Environment": [
                        "Development",
                        "Staging",
                        "Production"
                    ],
                    "aws:RequestTag/Department": "*"
                },
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "Environment",
                        "Department",
                        "Project"
                    ]
                }
            }
        }
    ]
}

このポリシーにより、S3バケット作成時に必須タグの付与が強制され、組織全体で一貫したタグ戦略を実現できます。

EC2インスタンス作成時の必要なタグの強制

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestedRegion": "ap-northeast-1"
                },
                "ForAllValues:StringEquals": {
                    "aws:TagKeys": [
                        "Department",
                        "Environment",
                        "Project",
                        "Owner"
                    ]
                },
                "StringEquals": {
                    "ec2:CreateAction": "RunInstances"
                }
            }
        }
    ]
}

セッションタグの活用

セッションタグを使用することで、より動的なアクセス制御が可能になります。これは、AssumeRoleAPI呼び出し時に一時的に設定されるタグです。

セッションタグを使った一時的権限付与

# セッションタグ付きでロールを引き受け
aws sts assume-role \
    --role-arn arn:aws:iam::123456789012:role/TemporaryAccessRole \
    --role-session-name temp-session \
    --tags Key=TemporaryAccess,Value=true \
           Key=RequestID,Value=REQ-001 \
    --duration-seconds 3600

対応するIAMポリシー:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::sensitive-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalTag/TemporaryAccess": "true"
                },
                "NumericLessThan": {
                    "aws:TokenIssueTime": "3600"
                }
            }
        }
    ]
}

image.png

実践的な設定例

部署別リソースアクセス制御

企業では部署ごとにリソースを分離管理する必要があります。ABACを使った実装例を紹介します。

部署別アクセスポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowDepartmentResourceAccess",
            "Effect": "Allow",
            "Action": [
                "ec2:*",
                "s3:*",
                "rds:*"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:PrincipalTag/Department": "${aws:ResourceTag/Department}"
                }
            }
        },
        {
            "Sid": "DenyOtherDepartmentAccess",
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "aws:PrincipalTag/Department": "${aws:ResourceTag/Department}"
                }
            }
        }
    ]
}

環境別アクセス制御

開発、ステージング、本番環境の分離は重要なセキュリティ要件です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Environment": "${aws:PrincipalTag/AllowedEnvironment}"
                }
            }
        }
    ]
}

image.png

ベストプラクティスと注意点

タグ戦略の重要性

ABACの成功は、一貫したタグ戦略にかかっています。以下の点を考慮してください:

  • 標準化されたタグキー名:組織全体で統一されたタグキー名を使用
  • 値の一貫性:タグ値の形式を統一(例:Environment = dev/staging/prod)
  • 必須タグの定義:すべてのリソースに必要なタグを明確に定義

セキュリティ上の考慮事項

  • タグの可視性:タグ情報は多くのユーザーに見える可能性があるため、機密情報は含めない
  • タグの改ざん防止:タグを変更する権限を適切に制限
  • 最小権限の原則:必要最小限のアクセス権限のみを付与

運用時の注意点

ABACの実装に関するAWS公式ドキュメント ( https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html ) では、『ABAC を使用すると、環境が成長しても、ポリシーがそれほど多くならない』と説明されています。

ただし、以下の点に注意が必要です:

  • デバッグの複雑さ:従来のRBACより権限トラブルシューティングが複雑
  • パフォーマンス影響:大量のタグ条件は評価処理に時間がかかる可能性
  • タグの整合性:リソース作成時のタグ付け忘れによるアクセス不能

S3バケットABAC固有の注意点:

S3バケットでABACを有効化する際は、AWS公式ブログ ( https://aws.amazon.com/blogs/aws/introducing-attribute-based-access-control-for-amazon-s3-general-purpose-buckets/ ) で説明されているように、既存のタグ設定を事前に確認することが推奨されます。ABAC有効化後はPutBucketTagging APIが使用できなくなるため、タグ管理ワークフローの更新が必要です。

AWS ConfigとCloudTrailを使用して、どのバケットでABACが有効になっているか、またPutBucketTagging APIの使用状況を監査できます。

料金への影響と運用コスト

ABACの実装自体に追加料金は発生しませんが、運用コストには以下の影響があります:

直接的なコスト

  • タグ付け作業:既存リソースへのタグ付けに必要な人的コスト
  • ポリシー管理:より複雑なポリシーの設計・管理コスト
  • S3 APIリクエスト:標準のS3 APIリクエスト料金が適用(ABAC自体の追加料金なし)

間接的なメリット

  • ロール数の削減:従来のRBACで必要だった多数のロール作成が不要
  • 権限管理の効率化:動的制御による管理工数の削減
  • セキュリティインシデント削減:より細かい制御によるリスク軽減
  • コスト配分の簡素化:ABACで使用するタグをコスト配分タグとしても活用可能(AWS Cost ExplorerやCost and Usage Reportsで自動集計)

終わりに

AWSのABACを活用したタグベース権限制御は、従来のRBACでは困難だった柔軟で細かいアクセス制御を実現します。2024年11月にリリースされたS3バケットレベルでのABAC機能により、大規模なS3環境でもタグベースの権限管理がより確実に行えるようになりました。

組織の成長に伴う複雑な権限要件に対応でき、セキュリティの向上と管理工数の削減を両立できます。特にS3の新機能では、バケット作成時のタグ強制やコスト配分タグとの統合など、実運用を意識した機能が提供されています。

実装時は、まず小規模な環境で基本的なタグ戦略を確立し、段階的に適用範囲を拡大することをお勧めします。S3バケットでABACを有効化する場合は、既存のタグ管理ワークフローへの影響を事前に評価してください。また、既存のRBACシステムと併用しながら、徐々にABACへ移行する hybrid approach も有効です。

次のステップとして、AWS Config Rules を使用したタグ付けポリシーの自動化や、AWS Organizations を活用した組織レベルでのタグ戦略の実装、S3 Access PointsでのABAC活用を検討してみてください。

参考文献・参考サイト

AWS公式ドキュメント

参考記事・技術情報

1
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
1
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?