この記事では、 ロールベースのアクセス制御 (RBAC) 監視ロールを適用してアクセスを許可または制限する方法について説明し、Azure Monitor 関連リソースのセキュリティに関する考慮事項について説明します。
組み込みの監視の役割
Azure ロールベースのアクセス制御 (Azure RBAC) には、ユーザー、グループ、サービス プリンシパル、マネージド ID に割り当てることができる監視用の組み込みロールが用意されています。 最も一般的なロールは、読み取りアクセス許可と書き込みアクセス許可の 監視閲覧者 と 監視共同作成者 です。 ロールを割り当てるときに、ロールの割り当てのスコープを指定できます。 ロールは、サブスクリプション、リソース グループ、またはリソース レベルで割り当てることができます。 スコープが広いほど、ロールの割り当てが適用されるリソースが多くなります。 ユーザーがアクセスする必要があるリソースのみにアクセスを制限するには、適切なスコープでロールを割り当てるようにしてください。
監視ロールの詳細については、「 RBAC 監視ロール」を参照してください。
監視リーダー
監視閲覧者の役割が割り当てられている場合は、サブスクリプション内の監視データすべてを表示できますが、リソースを変更したり、監視リソースに関連する設定を編集したりすることはできません。 この役割は、次の作業を行う必要がある、サポート エンジニア、運用エンジニアなどの組織内のユーザーに適しています。
- Azure portal に監視ダッシュボードを表示する。
- Azure アラートで定義されている アラート ルールを表示します。
- Azure Monitor REST API、PowerShell コマンドレット、またはクロスプラットフォーム CLI を使用して、Azure Monitor メトリックのクエリを実行します。
- ポータル、Azure Monitor REST API、PowerShell コマンドレット、またはクロスプラットフォーム CLI を使用して、アクティビティ ログにクエリを実行する。
- リソースの 診断設定 を表示します。
- サブスクリプションの ログ プロファイル を表示します。
- 自動スケールの設定を表示する。
- アラート アクティビティと設定を表示する。
- ワークスペースの使用状況データなど、Log Analytics ワークスペースのデータを検索する。
- Log Analytics ワークスペーステーブルスキーマを取得する。
- Log Analytics ワークスペースにログクエリを取得および実行する。
- Application Insights データにアクセスします。
注
この役割では、イベント ハブにストリーミングされたログ データ、またはストレージ アカウントに保存されたログ データへの読み取りアクセス権は付与されません。 これらのリソースへのアクセスを構成する方法については、この記事で後述する「 データの監視に関するセキュリティに関する考慮事項 」セクションを参照してください。
モニタリング貢献者
監視共同作業者ロールが割り当てられている場合、サブスクリプション内の監視データすべてを表示できます。 また、監視設定を作成または変更することもできますが、他のリソースを変更することはできません。
このロールは、監視閲覧者ロールのスーパーセットです。 これは、前述のアクセス許可に加えて、以下を実行する必要がある組織の監視チームまたはマネージド サービス プロバイダーのメンバーに適しています。
- ポータルで監視ダッシュボードを表示し、独自のプライベート監視ダッシュボードを作成する。
- リソースの 診断設定 を作成および編集します。 1
- Azure アラートを使用してアラート ルールのアクティビティと設定 を設定します。
- Log Analytics ワークスペースの共有キーを一覧表示する。
- Log Analytics ワークスペースに保存する検索を作成、削除、および実行する。
- Log Analytics のワークスペースのストレージ構成を作成および削除する。
- Application Insights の Web テストとコンポーネントを作成する。
1 診断設定を作成または編集するには、ターゲット リソース (ストレージ アカウントまたはイベント ハブ名前空間) に対する ListKeys アクセス許可も個別に付与する必要があります。
注
この役割では、イベント ハブにストリーミングされたログ データ、またはストレージ アカウントに保存されたログ データへの読み取りアクセス権は付与されません。 これらのリソースへのアクセスを構成する方法については、この記事で後述する「 データの監視に関するセキュリティに関する考慮事項 」セクションを参照してください。
アクセス許可と Azure カスタム ロールの監視
組み込みロールがチームのニーズを満たしていない場合は、詳細なアクセス許可を持つ Azure カスタム ロールを作成できます。
たとえば、次の PowerShell スクリプトを使うと、詳細なアクセス許可を使って、アクティビティ ログ閲覧者の Azure カスタム ロールを作成できます。
$role = Get-AzRoleDefinition "Reader"
$role.Id = $null
$role.Name = "Activity Log Reader"
$role.Description = "Can view activity logs."
$role.Actions.Clear()
$role.Actions.Add("Microsoft.Insights/eventtypes/*")
$role.AssignableScopes.Clear()
$role.AssignableScopes.Add("/subscriptions/mySubscription")
New-AzRoleDefinition -Role $role
注
リソースのアラート、診断設定、およびメトリックにアクセスするユーザーには、そのリソースの種類とスコープへの読み取りアクセスが必要です。 ストレージ アカウントにデータを送信する、またはイベント ハブにストリーミングする診断設定を作成する には、ターゲット リソースにおける ListKeys アクセス許可も必要です。
ロールを割り当てる
注
Azure Az PowerShell モジュールを使用して Azure と対話することをお勧めします。 開始するには、 Azure PowerShell のインストールに関するページを参照してください。 Az PowerShell モジュールに移行する方法については、「 Azure PowerShell を AzureRM から Az に移行する」を参照してください。
ロールを割り当てるには、「 Azure PowerShell を使用して Azure ロールを割り当てる」を参照してください。
たとえば、次の PowerShell スクリプトを使って、指定したユーザーにロールを割り当てます。
<RoleId>
を、割り当てる RBAC 監視ロール ID に置き換えます。
<SubscriptionID>
、<ResourceGroupName>
、および <UserPrincipalName>
を実際の環境の適切な値に置き換えます。
# Define variables
$SubscriptionId = "<SubscriptionID>"
$ResourceGroupName = "<ResourceGroupName>"
$UserPrincipalName = "<UserPrincipalName>" # The UPN of the user to whom you want to assign the role
$RoleId = "<RoleId>" # The ID of the role
# Get the user object
$User = Get-AzADUser -UserPrincipalName $UserPrincipalName
# Define the scope (e.g., subscription or resource group level)
$Scope = "/subscriptions/$SubscriptionId/resourceGroups/$ResourceGroupName"
# Assign the role
New-AzRoleAssignment -ObjectId $User.Id -RoleDefinitionId $RoleId -Scope $Scope
Azure portal を使用して Azure ロールを割り当てることもできます。
重要
- 指定したスコープ内でロールを割り当てるために必要なアクセス許可を持っていることを確認します。 サブスクリプションまたはリソース グループの "所有者" 権限が必要です。
- リソース自体ではなく、リソースが属するリソース グループまたはサブスクリプションでアクセスを割り当てます。
ロール メンバーシップを特定する PowerShell クエリ
特定のロールに属するユーザーの一覧を生成すると便利です。 以下のサンプル クエリを必要に応じて調整し、そのような一覧の生成に役立ててください。
管理者ロール + 共同作成者ロールについてサブスクリプション全体にクエリを実行する
(Get-AzRoleAssignment -IncludeClassicAdministrators | Where-Object {$_.RoleDefinitionName -in @('ServiceAdministrator', 'CoAdministrator', 'Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "
所有者と共同作成者について特定の Application Insights リソースのコンテキスト内でクエリを実行する
$resourceGroup = "ResourceGroupName"
$resourceName = "AppInsightsName"
$resourceType = "microsoft.insights/components"
(Get-AzRoleAssignment -ResourceGroup $resourceGroup -ResourceType $resourceType -ResourceName $resourceName | Where-Object {$_.RoleDefinitionName -in @('Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "
所有者と共同作成者について特定の Application Insights リソースのコンテキスト内でクエリを実行する
$resourceGroup = "ResourceGroupName"
(Get-AzRoleAssignment -ResourceGroup $resourceGroup | Where-Object {$_.RoleDefinitionName -in @('Owner', 'Contributor') } | Select -ExpandProperty SignInName | Sort-Object -Unique) -Join ", "
データ監視のセキュリティに関する考慮事項
Azure Monitor のデータ は、ストレージ アカウントで送信することも、イベント ハブにストリーミングすることもできます。どちらも汎用 Azure リソースです。 汎用のリソースであるため、それらの作成、削除、アクセスは管理者用に予約された特権操作です。 このデータには IP アドレスやユーザー名などの機密情報が含まれている可能性があるため、誤用を防ぐために、監視関連のリソースに次のプラクティスを使用します:
- 1 つの専用ストレージ アカウントを使用して、データを監視します。 監視データを複数のストレージ アカウントに分割する必要がある場合、ストレージ アカウントは監視データにのみ使用する必要があります。 監視とその他の種類のデータ用のストレージ アカウントを共有すると、監視データのみにアクセスする必要がある組織に、誤って他のデータへのアクセス権を付与する可能性があります。 たとえば、セキュリティ情報とイベント管理に対応する Microsoft 以外の組織は、監視データへのアクセスのみを必要とします。
- 前述の箇所で説明した同じ理由で、すべての診断設定にわたって 1 つの専用のサービス バスまたはイベント ハブ名前空間を使用します。
- 監視関連のストレージ アカウントまたはイベント ハブを別のリソース グループに保持して、そのストレージ アカウントとイベント ハブへのアクセスを制限します。 監視ロールのスコープを使用して、そのリソース グループのみにアクセスを制限します。
- ユーザーによるアクセス対象が監視データだけの場合、ListKeys アクセス許可は、サブスクリプション スコープでストレージ アカウントまたはイベント ハブに付与しないでください。 代わりに、このアクセス許可は、リソースまたはリソース グループ スコープ (専用監視リソース グループの場合) でユーザーに付与します。
監視関連のストレージ アカウントに対するアクセスの制限
ユーザーまたはアプリケーションがストレージ アカウント内の監視データにアクセスする必要がある場合は、BLOB ストレージへのサービス レベルの読み取り専用アクセス権を持つ監視データを含むストレージ アカウントに Shared Access Signature (SAS) を生成 します。 PowerShell では、アカウント SAS は次のコードのようになります。
$context = New-AzStorageContext -ConnectionString "[connection string for your monitoring Storage Account]"
$token = New-AzStorageAccountSASToken -ResourceType Service -Service Blob -Permission "rl" -Context $context
その後、ストレージ アカウントからの読み取りが必要なエンティティにトークンを割り当てることができます。 エンティティは、そのストレージ アカウント内のすべての BLOB を一覧表示し、読み取ることができます。
また、このアクセス許可を Azure RBAC で制御する必要がある場合は、そのエンティティに、特定のストレージ アカウントの Microsoft.Storage/storageAccounts/listkeys/action
のアクセス許可を付与します。 このアクセス許可は、診断設定またはログ プロファイルを、ストレージ アカウントにデータを送信するために診断設定を設定しなければならないユーザーに必要です。 たとえば、1 つのストレージ アカウントからの読み取りのみが必要なユーザーまたはアプリケーションに対しては、次の Azure カスタム ロールを作成できます。
$role = Get-AzRoleDefinition "Reader"
$role.Id = $null
$role.Name = "Monitoring Storage Account Reader"
$role.Description = "Can get the storage account keys for a monitoring storage account."
$role.Actions.Clear()
$role.Actions.Add("Microsoft.Storage/storageAccounts/listkeys/action")
$role.Actions.Add("Microsoft.Storage/storageAccounts/Read")
$role.AssignableScopes.Clear()
$role.AssignableScopes.Add("/subscriptions/mySubscription/resourceGroups/myResourceGroup/providers/Microsoft.Storage/storageAccounts/myMonitoringStorageAccount")
New-AzRoleDefinition -Role $role
警告
ListKeys アクセス許可により、ユーザーがプライマリ ストレージ アカウントとセカンダリ ストレージ アカウントのキーの一覧を表示できます。 これらのキーは、そのストレージ アカウントのすべての署名済みサービス (BLOB、キュー、テーブル、ファイル) にわたる、すべての署名済みアクセス許可 (読み取り、書き込み、BLOB の作成、BLOB の削除など) を、ユーザーに付与します。 可能な場合は、アカウント SAS を使用することをお勧めします。
監視関連のイベント ハブに対するアクセスの制限
同様のパターンの後にイベント ハブを続けることができますが、最初は、リッスン用の専用の承認規則を作成する必要があります。 監視関連のイベント ハブのリッスンのみが必要なアプリケーションについて、アクセス権を付与する必要がある場合は、以下の手順を実行します。
ポータルで、リッスン要求のみの監視データをストリーミングするために、作成されたイベント ハブで共有アクセス ポリシーを作成します。 たとえば、これを "monitoringReadOnly" と呼ぶとします。可能な場合は、そのキーをコンシューマーに直接提供し、次の手順をスキップします。
コンシューマーがオンデマンドでキーを取得する必要がある場合は、そのイベント ハブの ListKeys アクションをユーザーに付与します。 この手順は、診断設定またはログ プロファイルを、イベント ハブにストリーミングされるように設定しなければならないユーザーにも必要です。 たとえば、Azure RBAC ルールを作成する場合があります。
$role = Get-AzRoleDefinition "Reader" $role.Id = $null $role.Name = "Monitoring Event Hub Listener" $role.Description = "Can get the key to listen to an event hub streaming monitoring data." $role.Actions.Clear() $role.Actions.Add("Microsoft.EventHub/namespaces/authorizationrules/listkeys/action") $role.Actions.Add("Microsoft.EventHub/namespaces/Read") $role.AssignableScopes.Clear() $role.AssignableScopes.Add("/subscriptions/mySubscription/resourceGroups/myResourceGroup/providers/Microsoft.ServiceBus/namespaces/mySBNameSpace") New-AzRoleDefinition -Role $role