クラウド IAM の3大プロバイダー — 設計哲学の違いを読む

パブリッククラウドが標準インフラとなった今、アクセス制御の実装は必然的にクラウド IAM との連携を前提とします。 AWS・Azure・GCP の3大プロバイダーは、いずれも「最小権限の原則」と「ポリシーベース認可」を掲げていますが、 設計哲学は大きく異なります。その違いを理解せずに設計すると、複雑なマルチクラウド環境でポリシーの整合性が崩れます。

一言で表すなら AWS は「柔軟性重視」、Azure は「構造重視」、GCP は「精度重視」です。 この設計哲学の違いは、ポリシー記述の単位・スコープ階層・コンプライアンス機能の分離度に明確に現れています。

AWS IAM — ポリシー JSON 1ファイルで完結する柔軟な設計

IAMポリシーの基本構造

AWS IAM の特徴は、権限(Action)とリソース(Resource)を 1 つの JSON ドキュメントに同時定義できる点です。 Effect・Action・Resource の3フィールドが権限記述の核です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowS3ReadOnlyForTaggedBucket",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-data-bucket",
        "arn:aws:s3:::my-data-bucket/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": "ap-northeast-1",
          "s3:ResourceTag/Environment": "production"
        }
      }
    }
  ]
}

Condition ブロックが AWS IAM の ABAC 的拡張の核心です。aws:RequestedRegion でリクエスト元リージョンを絞り込んだり、s3:ResourceTag でリソースのタグに応じた制御が可能になります。 タグベースのポリシーを活用することで、ロール爆発を防ぎながら属性駆動の認可を実現できます。

多層評価の順序と Permission Boundary

AWS IAM の評価モデルは複数のポリシー種別が重なる多層構造を持ちます。 評価順序は固定されており、いずれかの段階で明示的な Deny があれば即座に拒否となります。

  1. SCP(Service Control Policy): AWS Organizations レベルで組織全体に適用。最優先で評価され、SCP で拒否されれば他のポリシーは無意味
  2. Permission Boundary: IAM エンティティに設定できる最大権限の上限。開発者が自身より強い権限をサービスに付与することを防ぐ
  3. Identity Policy: ユーザー/ロールにアタッチされた通常のポリシー
  4. Resource-based Policy: S3 バケットポリシー・KMS キーポリシー等のリソース側に記述するポリシー

Azure RBAC — 管理グループからリソースまでの明確な階層構造

スコープ階層とロール割り当て

Azure RBAC の設計哲学は「構造重視」です。 権限は (ロール定義)× (スコープ)× (プリンシパル) の3要素の組み合わせで決まります。 スコープは4階層の継承ツリーで構成されます。

  1. 管理グループ(Management Group)— 複数サブスクリプションをまとめる組織単位
  2. サブスクリプション — 課金・リソース管理の単位
  3. リソースグループ — 同一ライフサイクルのリソースをまとめるコンテナ
  4. リソース — VM・ストレージアカウント等の個別リソース

上位スコープで付与したロールは下位スコープに継承されます。 たとえば管理グループレベルで「Reader」を付与すると、傘下のすべてのサブスクリプション・リソースグループ・リソースを閲覧できます。

組み込みロール4種と Azure Policy との分離

Azure は 300 以上の組み込みロールを持ちますが、基本となるのは次の4種類です。

  • Owner: すべての操作権限 + ロール割り当て権限。他者へ権限を委任できる唯一のロール
  • Contributor: リソースの作成・変更・削除が可能。ただしロール割り当ては不可
  • Reader: すべてのリソースの読み取り専用アクセス
  • User Access Administrator: Azure リソースへのユーザーアクセス管理に特化

AWS と対比した際に特徴的なのは、Azure Policy(コンプライアンス強制)とRBAC(権限制御)の役割を明確に分離している点です。 「特定のリージョン以外にリソースをデプロイさせない」という制御は Azure Policy が担い、 RBAC は「誰が何をできるか」のみを管理します。 また ID 管理には Microsoft Entra ID(旧 Azure AD)が統合されており、 条件付きアクセスポリシーによる多要素認証や Privileged Identity Management(PIM)との連携が強みです。

GCP IAM — Workload Identity と IAM Conditions による精度重視

IAM Conditions と文脈依存制御

GCP IAM の設計哲学は「精度重視」です。IAM Conditions により、時間帯・リソース名前空間・リクエスト経路などの属性を条件として きめ細かな権限制御が可能です。

# IAM Conditions の例: 平日9〜18時のみアクセス許可
resource "google_project_iam_member" "time_limited" {
  project = var.project_id
  role    = "roles/storage.objectViewer"
  member  = "serviceAccount:sa@project.iam.gserviceaccount.com"

  condition {
    title       = "business-hours-only"
    description = "平日業務時間帯のみ有効"
    expression  = <<-EOT
      request.time.getDayOfWeek("Asia/Tokyo") >= 1 &&
      request.time.getDayOfWeek("Asia/Tokyo") <= 5 &&
      request.time.getHours("Asia/Tokyo") >= 9  &&
      request.time.getHours("Asia/Tokyo") < 18
    EOT
  }
}

Workload Identity Federation — 静的キー不要化

GCP の大きな差別化要因が Workload Identity Federation です。 従来のサービスアカウントキー(JSON ファイル)は漏洩リスクが高く、ローテーションも煩雑でした。 Workload Identity Federation を使うと、GitHub Actions・AWS EC2・オンプレ Kubernetes などの 外部 IdP が発行するトークンを直接 GCP サービスアカウントにマッピングでき、長期間有効な静的キーが不要になります。

2022 年に追加された IAM Deny PolicyPolicy Analyzer も注目機能です。 Deny Policy は「Allow ポリシーが何を許可していても、この操作だけは常に拒否する」という明示的拒否ルールを記述でき、 Policy Analyzer はシミュレーションで権限の実効範囲を事前確認できます。

3大クラウド IAM の設計比較

比較軸AWS IAMAzure RBACGCP IAM
設計哲学柔軟性重視構造重視精度重視
ポリシー単位JSON ドキュメント(Action+Resource 同時定義)ロール定義 × スコープ × プリンシパルロール + IAM Conditions(CEL式)
スコープ階層Account → リソース(明示的 ARN)管理グループ → サブスクリプション → リソースグループ → リソースOrganization → Folder → Project → リソース
静的キー不要化IMDSv2 / IRSA / EKS Pod Identityマネージド IDWorkload Identity Federation
明示的拒否Deny ステートメント(Statement.Effect)ロールに含まれない = 暗黙拒否IAM Deny Policy(2022年〜)
コンプライアンス強制SCP(Organizations)Azure Policy(RBAC と分離)Organization Policy Constraints
権限分析ツールIAM Access AnalyzerAzure Advisor / PIMPolicy Analyzer / Policy Simulator
ID 管理AWS IAM Identity CenterMicrosoft Entra ID(条件付きアクセス)Cloud Identity / Google Workspace

マイクロサービスのアクセス制御アーキテクチャ

北南・東西トラフィックの区別

マイクロサービス環境のアクセス制御を設計する際、まずトラフィックの方向を区別することが重要です。北南トラフィック(North-South)とは外部クライアント(ブラウザ・モバイルアプリ・サードパーティ)から システムへの流入トラフィックです。API ゲートウェイで処理します。東西トラフィック(East-West)とはマイクロサービス間の内部通信です。 サービスメッシュで処理します。

この2種類のトラフィックは性質が異なるため、認可の粒度と実装手段も異なります。 北南は「このユーザー(人間)がこのエンドポイントを呼べるか」という粗粒度の認可が中心ですが、 東西は「このサービスアカウントが別のサービスの内部 API を呼べるか」というワークロード間認証・認可が中心です。

graph TB
  Client([クライアント])
  GW[API Gateway]
  Mesh[サービスメッシュ: Istio]
  SvcA[サービスA]
  SvcB[サービスB]
  SvcC[サービスC]
  Client -->|HTTPS + JWT| GW
  GW -->|粗粒度認可 ロールベース| GW
  GW -->|JWT伝播| Mesh
  Mesh -->|mTLS + AuthorizationPolicy| SvcA
  Mesh -->|mTLS + AuthorizationPolicy| SvcB
  SvcA -->|東西 mTLS| SvcB
  SvcA -->|東西 mTLS| SvcC
  SvcA -->|細粒度認可 リソースレベル| SvcA
  style GW fill:#f97316,stroke:#ea580c,color:#fff
  style Mesh fill:#8b5cf6,stroke:#6d28d9,color:#fff
  style SvcA fill:#3b82f6,stroke:#1d4ed8,color:#fff
  style SvcB fill:#3b82f6,stroke:#1d4ed8,color:#fff
  style SvcC fill:#3b82f6,stroke:#1d4ed8,color:#fff
マイクロサービスのアクセス制御アーキテクチャ: 北南(API Gateway)と東西(Istio)の二層構造。JWT は北南での発行後、東西全体に伝播する

集中型 vs 分散型 vs ハイブリッド

マイクロサービスの認可方式には主に3つのアプローチがあります。

  • 集中型(Centralized): 専用の認可サービス(例: OPA サーバー・Open Policy Agent)が すべての認可判定を処理。ポリシーの一元管理と一貫性が強みですが、単一障害点になりやすく、 レイテンシが増加します。
  • 分散型(Distributed): 各サービスが自身でポリシーを保持・評価。 依存なく独立して動作できますが、ポリシーの更新伝播が困難でドリフト(乖離)が発生しやすい欠点があります。
  • ハイブリッド(推奨): ポリシーは中央で管理・配信し(OPA Bundle Server 等)、 評価は各サービスのサイドカーでローカルに行う。一元管理と低レイテンシを両立できるため プロダクション環境での推奨アーキテクチャです。

Istio AuthorizationPolicy — サービスメッシュでの Zero Trust 実現

デフォルト拒否ポリシー — Zero Trust の基本

Istio を使ったサービスメッシュでのアクセス制御は、まずすべてを拒否するポリシーを作成することから始めます。 これが Zero Trust の基本原則「明示的に許可されたもの以外はすべて拒否」を実現する第一歩です。

# デフォルト拒否ポリシー(production 名前空間全体)
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-all
  namespace: production
spec:
  {}
  # spec が空 = すべてのリクエストを拒否
  # action フィールドを省略すると ALLOW として機能するが
  # rules が空の場合は誰も許可されない → 実質 deny-all

明示的許可ポリシーの記述

デフォルト拒否の上に、必要な通信のみを許可するポリシーを追加します。 ServiceAccount(ワークロード ID)と JWT クレームの両方で条件を指定できます。

# 注文サービスへのアクセスを制御するポリシー
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: order-service-policy
  namespace: production
spec:
  selector:
    matchLabels:
      app: order-service
  action: ALLOW
  rules:
    # API Gateway からの呼び出しを許可(サービスアカウントで識別)
    - from:
        - source:
            principals:
              - "cluster.local/ns/production/sa/api-gateway"
      to:
        - operation:
            methods: ["GET", "POST"]
            paths: ["/api/v1/orders*"]
    # 在庫サービスからの在庫確認コールバックを許可
    - from:
        - source:
            principals:
              - "cluster.local/ns/production/sa/inventory-service"
      to:
        - operation:
            methods: ["GET"]
            paths: ["/internal/stock-check*"]
      when:
        # JWT クレームで追加制御: 内部サービス呼び出しのみ
        - key: request.auth.claims[caller-type]
          values: ["internal-service"]

JWT 二段階認可パターン

JWT クレームによる権限伝播

JWT(JSON Web Token)は、認証後に発行されるアクセストークンとしてマイクロサービス全体に権限情報を伝播する役割を担います。 ペイロードにロール・権限・スコープをクレームとして埋め込むことで、 各サービスがトークンをローカル検証するだけで認可判定ができます。

// JWT ペイロードの例(デコード後)
{
  "sub": "user_a1b2c3",
  "iss": "https://auth.example.com",
  "aud": "https://api.example.com",
  "iat": 1750000000,
  "exp": 1750003600,   // 有効期間: 1時間
  "roles": ["order:read", "order:write"],
  "permissions": ["order:create", "order:view", "product:view"],
  "org_id": "org_xyz",
  "tier": "premium"     // ビジネスルール属性(ABACへの拡張)
}

二段階認可の実装フロー

JWT を使った二段階認可では、API ゲートウェイとマイクロサービス内で異なる粒度の認可を行います。

  1. API Gateway(粗粒度認可): JWT の署名検証・有効期限チェック・ エンドポイント単位のロールチェックを行います。 「order:read ロールを持つユーザーだけが GET /orders を呼べる」という粗粒度のルールです。 認可サービスへの同期呼び出しなしにローカル検証できるため低レイテンシです。
  2. マイクロサービス内(細粒度認可): JWT クレームの org_idsub を使って 「このユーザーがこの特定の注文リソースを閲覧できるか」というリソースレベルの判定を行います。 ReBAC や ABAC と組み合わせることで「同一組織のリソースのみアクセス可」といったルールを実現します。

OSSツールによるポリシー統一

OPA サイドカーパターン

第5章で解説した OPA(Open Policy Agent)は、マイクロサービス環境での認可エンジンとしても広く使われます。 各サービスに OPA をサイドカーとして配置し、Rego ポリシーをローカルで評価することで 低レイテンシを維持しながら外部サービスへの依存を排除します。

# OPA をサイドカーとして Kubernetes Pod に配置する例
spec:
  containers:
    - name: order-service
      image: order-service:v1.2.0
      env:
        - name: OPA_URL
          value: "http://localhost:8181"  # ローカルサイドカーを参照

    - name: opa
      image: openpolicyagent/opa:latest
      args:
        - "run"
        - "--server"
        - "--addr=0.0.0.0:8181"
        - "--bundle"
        - "https://policy-bundle-server.internal/bundles/order-service"
      # バンドルサーバーからポリシーを定期取得(デフォルト60秒ごと)

OPA バンドルサーバーパターンでは、ポリシーの Rego ファイルを中央サーバーにまとめて配置し、 各 OPA サイドカーが定期的に最新ポリシーをダウンロードします。 ポリシー変更が即座に全サービスに伝播し、一元管理と分散評価を両立できます。 さらに OPA Conftest を CICD パイプラインに組み込むことで、 Terraform・Kubernetes マニフェスト・Dockerfile のポリシー違反をデプロイ前に検出できます。

Casbin 組み込みパターン

既存のアプリケーションにアクセス制御を後付けする場合、Casbin は有力な選択肢です。 Go・Java・Python・Node.js など多言語の SDK を提供しており、 ミドルウェアとして組み込むだけで RBAC・ABAC・ACL 等複数モデルを切り替えられます。

// Go での Casbin 組み込み例
package middleware

import (
    "github.com/casbin/casbin/v2"
    "net/http"
)

func AuthzMiddleware(e *casbin.Enforcer) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // JWT クレームから sub・ロールを取得(省略)
            user   := getUserFromContext(r.Context())
            path   := r.URL.Path
            method := r.Method

            // Casbin でポリシー評価
            ok, err := e.Enforce(user, path, method)
            if err != nil || !ok {
                http.Error(w, "Forbidden", http.StatusForbidden)
                return
            }
            next.ServeHTTP(w, r)
        })
    }
}

実装チェックリスト

クラウド + マイクロサービス環境でアクセス制御を設計・実装する際の確認項目をまとめます。

領域チェック項目ツール/手段
サービス間認証すべての東西通信に mTLS を強制(平文通信を禁止)Istio PeerAuthentication / Linkerd
ワークロードIDSPIFFE/SVID でサービスアカウントに証明書ベース ID を付与SPIRE / Istio Citadel
認可ポリシーデフォルト拒否を設定し、必要なルートのみ明示的に許可Istio AuthorizationPolicy
JWT 管理アクセストークン有効期間を 60 分以下に設定・Refresh Token 分離Keycloak / Auth0 / Cognito
監査ログすべての認可判定ログ(許可・拒否とも)を中央に収集CloudTrail / Azure Monitor / Cloud Audit Logs
CICD 統合ポリシー変更を PR レビュー必須化・テスト自動化OPA Conftest / Terraform Sentinel
過剰権限排除未使用 IAM 権限を定期的に検出・削除IAM Access Analyzer / GCP Policy Analyzer

理解度チェック

問題 0 / 40%
Q1

AWS IAM のポリシー評価において、最も優先度が高く最初に評価されるポリシー種別はどれですか?

キーボード: 1〜4 で選択、Enter で回答