Azure リソース権限の完全ガイド: 効果的なアクセス制御の設計と実装
はじめに
クラウド環境のセキュリティにおいて、適切なアクセス制御は最も重要な要素の一つです。特にAzureのような大規模クラウドプラットフォームでは、数百種類ものリソースタイプが存在し、それぞれに対して細かな権限設定が必要となります。
この記事では、Azure環境におけるリソース権限の仕組みを体系的に解説し、実務で役立つ知識を提供します。リソースタイプごとの権限モデル、効果的な管理方法、そして実際のシナリオに基づいたベストプラクティスまで、包括的に取り上げていきます。
1. Azure権限モデルの基本
1.1 階層的なスコープの仕組み
Azure環境における権限管理は、次のような階層構造を基盤としています:
テナント(EntraID)
↓
管理グループ
↓
サブスクリプション
↓
リソースグループ
↓
リソース
この階層構造は大規模組織のガバナンスを容易にする設計であり、上位レベルで設定された権限は下位レベルに継承されます。例えば、管理グループレベルで「閲覧者」権限を持つユーザーは、その配下のすべてのサブスクリプション、リソースグループ、リソースも閲覧できます。
権限付与の仕組みは、以下の3つの要素で構成されています:
- セキュリティプリンシパル(誰が): ユーザー、グループ、サービスプリンシパル、マネージドID
- ロール定義(何ができるか): 許可されるアクションの集合
- スコープ(どこで): 権限が適用される範囲
この3つの要素を組み合わせて「ロール割り当て」が作成されます。
1.2 リソースプロバイダーとアクション
Azureのリソースは「リソースプロバイダー」によって提供されます。各リソースプロバイダーは、そのリソースに対して実行可能な「アクション」のセットを定義しています。
権限のアクションは次のような形式で表されます:
{リソースプロバイダー}/{リソースタイプ}/{アクション}
例:
-
Microsoft.Compute/virtualMachines/start/action
- 仮想マシンの起動 -
Microsoft.Storage/storageAccounts/blobServices/containers/read
- Blobコンテナの読み取り
2. ロールベースアクセス制御(RBAC)の実装
2.1 主要な組み込みロール
Azureには100種類以上の組み込みロールが用意されていますが、最も一般的に使用されるのは以下の4つです:
ロール | 権限の範囲 | 典型的なユースケース |
---|---|---|
所有者(Owner) | すべての権限(アクセス権の委任含む) | サブスクリプション管理者、クラウドアーキテクト |
共同作成者(Contributor) | アクセス管理以外のすべての操作 | 開発者、運用エンジニア |
閲覧者(Reader) | 読み取り専用アクセス | 分析チーム、監査担当者 |
ユーザーアクセス管理者 | アクセス権限の管理のみ | セキュリティチーム、アクセス管理者 |
これらの汎用ロールに加えて、各リソースタイプに特化した専用のロールも多数存在します:
- 仮想マシン共同作成者: 仮想マシンの管理(作成・構成・削除など)
- ネットワーク共同作成者: ネットワークリソースの管理
- ストレージアカウントキー操作者: ストレージアカウントキーの取得・再生成
- SQLサーバー共同作成者: SQLサーバーとデータベースの管理
- Key Vault共同作成者: Key Vaultリソースの管理
- バックアップ操作者: バックアップの管理と復元
2.2 ロール割り当てのレベル
ロールは様々なレベルで割り当てることができます:
- 管理グループレベル: 複数サブスクリプションに適用
- サブスクリプションレベル: サブスクリプション全体に適用
- リソースグループレベル: 特定のリソースグループ内のすべてのリソースに適用
- リソースレベル: 特定のリソースのみに適用
適切なレベルでロールを割り当てることで、最小特権の原則を実現しつつ、管理の手間を軽減できます。
3. リソースタイプ別の権限モデル
3.1 コントロールプレーンとデータプレーン
Azure環境の権限は大きく2つのプレーン(層)に分かれています:
-
コントロールプレーン: リソースの作成、設定変更、削除などの管理操作
- Azure RBACで制御
- 組み込みロール(所有者、共同作成者、閲覧者など)
- リソース階層に従って継承
-
データプレーン: リソース内部のデータへのアクセス
- リソース固有のアクセス制御メカニズム
- 専用のデータアクセスロール
- コントロールプレーンとは独立して管理
この区別は非常に重要です。例えば、ストレージアカウントを作成・管理できる権限を持っていても、その中のデータにアクセスする権限は別途必要です。これは「職務分離」のセキュリティ原則を実現するためです。
3.2 主要リソースの権限マッピング
以下にAzureの主要リソースタイプと、関連する権限の具体例を示します。
コンピュートリソース
リソースタイプ | 主要なロール | アクセスできる操作 |
---|---|---|
仮想マシン | 仮想マシン閲覧者 | VMの情報表示 |
仮想マシン共同作成者 | VM作成・構成・削除・起動・停止 | |
仮想マシン管理者ログイン | VM内へのRDP/SSH管理者アクセス | |
App Service | App Service共同作成者 | Webアプリの作成・構成・削除 |
Webプラン共同作成者 | App Service Planの管理 | |
AKS (Kubernetes) | AKS共同作成者 | クラスターの作成・管理 |
Kubernetes クラスター管理者 | Kubernetesリソースへの完全アクセス | |
Kubernetes クラスターユーザー | 特定の名前空間へのアクセス |
データストレージ
リソースタイプ | 主要なロール | アクセスできる操作 |
---|---|---|
ストレージアカウント | ストレージアカウント共同作成者 | アカウント作成・構成・削除 |
ストレージアカウントキー操作者 | アクセスキーの取得と再生成 | |
ストレージBlobデータ所有者 | BLOBデータの完全アクセス | |
ストレージBlobデータ共同作成者 | BLOBデータの読み書き | |
ストレージBlobデータ閲覧者 | BLOBデータの読み取りのみ | |
ストレージキューデータ共同作成者 | キューメッセージの送受信 | |
ストレージテーブルデータ共同作成者 | テーブルデータの読み書き | |
ストレージファイルデータ共同作成者 | ファイル共有データの読み書き |
データベース
リソースタイプ | 主要なロール | アクセスできる操作 |
---|---|---|
SQL Database | SQL サーバー共同作成者 | SQLサーバーとデータベースの管理 |
SQL セキュリティ管理者 | セキュリティ関連設定のみ | |
SQL DB共同作成者 | データベース構成の管理 | |
(データベース内ロール: db_owner) | DB内の完全なデータアクセス | |
(データベース内ロール: db_datareader) | DB内のデータ読み取りのみ | |
Cosmos DB | Cosmos DB アカウント閲覧者 | アカウント設定の表示 |
Cosmos DB オペレーター | アカウントの管理(キー除く) | |
Cosmos DB 共同作成者 | アカウントの完全な管理 | |
(データアクセスキー) | データの読み書き権限 |
3.3 リソース固有のデータアクセス権限
いくつかの重要なリソースタイプについて、データアクセス権限の特徴を詳しく見ていきましょう。
ストレージアカウント
ストレージアカウントは、コントロールプレーンとデータプレーンの分離が最も明確なリソースの一つです:
管理操作(コントロールプレーン)
|-- 所有者: すべての操作可能(アクセス管理含む)
|-- 共同作成者: アカウントの作成・設定・削除可能
|-- 閲覧者: 設定の表示のみ
データアクセス(データプレーン)
|-- ストレージBlobデータ所有者: すべてのデータ操作
|-- ストレージBlobデータ共同作成者: データの読み書き
|-- ストレージBlobデータ閲覧者: データの読み取りのみ
注意点として、コントロールプレーンのロールがあってもデータプレーンへのアクセスは自動的に付与されません。例外として、所有者・共同作成者・閲覧者ロールを持つユーザーでも、ストレージアカウントのアクセスキーがあればデータにアクセスできます。
Key Vault
Key Vaultも同様に、管理操作とデータアクセスが明確に分離されています:
管理操作(コントロールプレーン)
|-- Key Vault 共同作成者: リソースの作成・設定・削除
|-- Key Vault 閲覧者: 設定の表示のみ
データアクセス(データプレーン)
|-- Key Vault 管理者: キー・シークレット・証明書の管理
|-- Key Vault シークレットユーザー: シークレット読み取りのみ
|-- Key Vault 証明書責任者: 証明書管理のみ
|-- Key Vault 暗号化ユーザー: 暗号化/復号操作のみ
これにより、Key Vaultの管理者でも、その中に保存されている機密情報にアクセスできないという、セキュリティ上重要な分離が実現されています。
SQL Database
SQL Databaseはさらに複雑な権限モデルを持っています:
管理操作(コントロールプレーン - Azure RBAC)
|-- SQL Server 共同作成者: サーバー/データベースの管理
|-- SQL セキュリティ管理者: セキュリティ設定管理
データアクセス(データベースレベルの権限)
|-- SQL認証: ユーザー名/パスワード
|-- Azure AD認証: Microsoft Entra IDを使用した認証
|-- データベースロール: db_owner, db_datareader, db_datawriter等
4. 実務のための権限設計パターン
実際の業務でよく遭遇するシナリオと、それに対する権限設計のベストプラクティスを紹介します。
4.1 アプリケーション開発チーム向け
開発チームが特定のアプリケーションのリソースを管理する必要がある場合:
- 環境ごとに専用のリソースグループを作成(dev, test, prod)
- dev/testリソースグループには「共同作成者」ロールを付与
- prodリソースグループには「閲覧者」ロールのみ付与
- 機密データを含むリソースには、限定的なデータアクセスロールを個別に付与
- CI/CDパイプライン用のサービスプリンシパルにはデプロイに必要な最小限の権限を付与
4.2 インフラ運用チーム向け
クラウドインフラ全体を管理するチームの場合:
- 大部分のリソースに対して「共同作成者」ロールを付与
- 特定の重要リソースに対しては、カスタムロールで権限を制限
- リソース作成権限と運用権限を分離することを検討
- 本番環境変更には承認プロセスを導入(Azure Policy + PIM)
- 監査ログの定期的なレビューを実施
4.3 自動化・CI/CDパイプライン向け
デプロイ自動化のためのサービスプリンシパルには:
- 目的ごとに別々のサービスプリンシパルを作成
- デプロイ先のリソースグループに対してのみ「共同作成者」ロールを付与
- キーボールトなどの機密情報へは最小限のアクセス権限のみ付与
- 短期間有効なクレデンシャルと自動ローテーションを設定
- IP制限などの条件付きアクセスを適用
5. 権限継承と上書きのメカニズム
Azureの権限システムにおける継承と上書きの仕組みを理解することは重要です:
-
継承のルール:
- 上位レベル(管理グループ)での割り当ては下位レベル(サブスクリプション、リソースグループ、リソース)に継承される
- 下位レベルでの割り当ては上位レベルでの割り当てに影響しない
-
拒否の優先順位:
- 拒否設定は常に許可設定より優先される
- 例:管理グループで「共同作成者」が割り当てられていても、サブスクリプションで特定の操作が拒否されている場合、その操作は実行できない
-
スコープ指定の重要性:
- より限定されたスコープで権限を割り当てることで、最小特権の原則を実現できる
- 組織の階層構造に合わせたスコープ設計が効果的
例えば、次のような継承シナリオが考えられます:
管理グループ(閲覧者)
↓ [継承]
サブスクリプションA(共同作成者を追加)
↓ [継承]
リソースグループX(ユーザーAは閲覧者+共同作成者の権限を持つ)
↓ [継承]
リソースR(特定のアクションを拒否)
→ ユーザーAはリソースRに対してそのアクションを実行できない
6. ベストプラクティスとセキュリティ強化のポイント
6.1 最小特権の原則を徹底する
- 必要最小限の権限のみを付与する
- 広範な権限(所有者、共同作成者)の使用を最小限に抑える
- カスタムロールを活用して権限を細かく調整する
- 特に機密データを含むリソースへのアクセスは厳格に管理する
6.2 権限の分離を意識する
- リソース管理とデータアクセスの権限を分離する
- 環境(開発、テスト、本番)ごとに権限レベルを変える
- クリティカルな操作には複数人による承認を導入する
- 管理者権限とユーザー権限を明確に分ける
6.3 権限管理の自動化と定期的なレビュー
- 権限付与のプロセスを自動化し一貫性を確保する
- 特権アクセスにはPIM(Privileged Identity Management)を使用する
- 定期的に権限割り当てを監査し、不要な権限を削除する
- アクセスレビューを定期的に実施する
6.4 一時的な権限の活用
- 常時アクセスではなく、必要なときだけ権限を付与する(Just-In-Time)
- 緊急アクセス用のブレークグラス手順を確立する
- 自動的に期限切れになる権限を設定する
- 権限昇格には承認プロセスを組み込む
7. 実際の事例から学ぶトラブルシューティング
7.1 「アクセス拒否」エラーの解決法
権限に関する問題で最も一般的なのは「アクセス拒否」エラーです。これを解決するための系統的なアプローチ:
- スコープの確認: 正しいリソース/リソースグループ/サブスクリプションへのアクセスかチェック
- 権限の確認: ユーザーに割り当てられたロールをチェック(直接またはグループを通じて)
- 必要なアクションの特定: 実行しようとしている操作に必要な具体的なアクションを特定
- 継承の確認: 上位レベルでの「拒否」設定がないかチェック
- データアクセスとコントロールプレーンの区別: データアクセス権限が別途必要かチェック
7.2 よくある権限問題と解決策
問題 | 原因 | 解決策 |
---|---|---|
ストレージアカウントの管理はできるがデータが見れない | データプレーン権限がない | ストレージBlobデータ閲覧者/共同作成者ロールを追加 |
特定のリソースだけアクセスできない | カスタムロールまたはリソースレベルでの制限 | リソース固有の権限設定を確認 |
サブスクリプションは見えるがリソースが作成できない | 「閲覧者」権限のみ持っている | 「共同作成者」ロールの追加が必要 |
ロールは割り当てられているのにアクセスできない | 条件付きアクセスポリシーによる制限 | IPアドレス、デバイス状態などの条件をチェック |
キーボールトのシークレットが取得できない | データプレーン権限がない | 「Key Vaultシークレットユーザー」ロールを追加 |
まとめ
Azureリソースの権限管理は、セキュリティと利便性のバランスを取りながら、適切なアクセス制御を実現するための重要な要素です。階層的なスコープモデル、コントロールプレーンとデータプレーンの分離、リソース固有の権限モデルを理解することで、より安全で効率的なクラウド環境を構築できます。
この記事で紹介したベストプラクティスを適用し、「最小特権の原則」に基づいた権限設計を心がけることで、セキュリティリスクを最小限に抑えながら、ビジネス要件に応じた柔軟なアクセス制御を実現しましょう。
Discussion