1. はじめに
Azure Log Analytics / Microsoft Sentinel を運用している際に、ユーザー/グループに対して特定のテーブル、もしくは特定のフィールド条件に対してのみクエリー & 閲覧権限を与えたい要件が発生します。
最新の方式では、Glanular RBAC と呼ばれる「きめ細かいロールベースのアクセス制御」方式が推奨となっており、設定も Azure ポータルで GUI ベースで設定が出来るようになりました。本記事では、Glanular RBAC を用いて、Log Analytics ワークスペースに格納されるデータの権限を設定する例をご紹介します。
2. 構成イメージ - Glanular RBAC !
Glanular RBAC の権限設定は 2 段階になっています。
以下設定イメージをご紹介します。
この例では 4 つのカスタムロールを作成し、Log Analytics ワークスペースにクエリーできる権限を設定しています。
ロール例 | 与える権限 | 設計イメージ |
---|---|---|
CustomRole1 | テーブルレベルのアクセス | - AzureActivity と AWSCloudTrail テーブルのクエリーのみ可能 |
CustomRole2 | テーブル + フィールドレベルのアクセス | - AzureActivity テーブルへアクセス- フィールド Caller が admin で始まるもののみ表示 |
CustomRole3 | テーブルレベルのアクセス | - Perf のみ表示 |
CustomRole4 | テーブル + フィールドレベルのアクセス | - CommonSecurityLog のみ表示- フィールド DeviceVendor が Fortinet のみ表示 |
3. 設定例
3.1 カスタムロールの作成 (リソースグループ or サブスクリプション)
- はじめにサブスクリプション / リソースグループ側でベースとなるカスタムロールを作成します
- このカスタムロールではきめ細やかな制御の設定は行わず、リソースへのアクセス制限とクエリーを実行する権限のみ渡します
- Action :Microsoft.OperationalInsights/workspaces/read
- Action :Microsoft.OperationalInsights/workspaces/query/read
- DataAction :Microsoft.OperationalInsights/workspaces/tables/data/read
- この設定をリソースグループに割り当てることで最小権限化させます
- カスタムロールを複数作成する場合は複製します
{
"properties": {
"roleName": "CustomRole1",
"description": "Glanular RBAC Role サンプル",
"assignableScopes": [
"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/rg-mgmt-Sentinel-AE"
],
"permissions": [
{
"actions": [
"Microsoft.OperationalInsights/workspaces/read",
"Microsoft.OperationalInsights/workspaces/query/read"
],
"notActions": [],
"dataActions": [
"Microsoft.OperationalInsights/workspaces/tables/data/read"
],
"notDataActions": []
}
]
}
}
3.2 Glanular RBAC によるテーブル/フィールド条件設定
「きめ細やかな」権限を行います。3.1 で作成したカスタムロールに対して、Log Analytics の RBAC 設定を行います。
設定を進めると、「条件」タブより、条件を追加することが出来ます。
3.2.1 CustomRole1 の設定例(テーブルベース)
- テーブルベースの RBAC では、条件として以下のように式を作成しました
- 演算子に
ForAllOfAnyValues:StringEquals
を用いて、テーブル名にAzureActivity
とAWSCloudTrail
をクエリー出来るように設定しています
テーブル名属性については、以下の条件演算子を設定することが出来ます。
詳細は公式ドキュメントを参照して下さい。
演算子 | 説明 |
---|---|
StringEquals |
大文字と小文字が区別される照合。 値は文字列と正確に一致している必要があります。 |
StringNotEquals |
StringEquals の否定。 |
ForAllOfAnyValues:StringEquals |
左側のすべての値が右側の少なくとも 1 つの値との比較を満たす場合、式は true に評価されます。 |
ForAllOfAllValues:StringNotEquals |
左側のすべての値が右側の少なくとも 1 つの値との比較を満たす場合、式は false に評価されます。 |
3.2.2 CustomRole2 の設定例(フィールド値)
- フィールド値の RBAC では、3.2.1 のテーブル条件に加えて以下のようにフィールドで絞る式を作成しました
- 条件式にテーブル条件を設定し、
AND
条件で列の値Caller
がadmin
で始まる文字列(StringStartsWith
演算子) を加えています
リソース(列の値)の演算子は以下複雑な設定が演算子を用いることで実現できます。
詳細は公式ドキュメントを参照して下さい。
演算子 | 説明 |
---|---|
StringEquals / StringEqualsIgnoreCase
|
大文字と小文字を区別する (または大文字と小文字を区別しない) 一致。 値は文字列と正確に一致している必要があります。 |
StringNotEquals / StringNotEqualsIgnoreCase
|
StringEquals (または StringEqualsIgnoreCase) の否定。 |
StringLike / StringLikeIgnoreCase
|
大文字と小文字を区別する (または大文字と小文字を区別しない) 一致。 演算子の右辺 (RHS) が左辺 (LHS) に 1 つの項として含まれる |
StringNotLike / StringNotLikeIgnoreCase
|
StringLike (または StringLikeIgnoreCase) 演算子の否定 |
StringStartsWith / StringStartsWithIgnoreCase
|
大文字と小文字を区別する (または大文字と小文字を区別しない) 一致。 値は文字列で始まります。 |
StringNotStartsWith / StringNotStartsWithIgnoreCase
|
StringStartsWith (または StringStartsWithIgnoreCase) 演算子の否定。 |
ForAllOfAnyValues:StringEquals / ForAllOfAnyValues:StringEqualsIgnoreCase |
左側のすべての値が右側の少なくとも 1 つの値との比較を満たす場合、式は true と評価されます。 |
ForAllOfAllValues:StringNotEquals / ForAllOfAllValues:StringNotEqualsIgnoreCase
|
|
ForAnyOfAnyValues:StringLikeIgnoreCase |
3.2.3 設定反映
設定が完了したら、「レビューと割り当て画面」から条件設定を確認してロール割り当ての追加を行います。設定の反映までに約 15 分ほどかかります。
4. トラブルシューティング
本設定によってクエリーされたデータは、テーブル名 LAQueryLogs
にConditionalDataAccess
フィールドで記録が残るようになっています。
5.考慮事項
公式サイトに 2025.7.1 時点での考慮事項が記載されています。気になる点をピックアップしてみました。
-
2025.7.1
現在、本機能はプレビュー - 検索ジョブ / 概要ルールは
2025.7.1
時点では未サポート(対応検討中)。ただしデータエクスポートは不可 - Microsoft Sentinel 機能で他で複製されたデータ(インシデントやハンティングクエリーなど)は対象外
5. まとめ
Log Analytics / MicrosoftSentinel のテーブルベース / フィールドベースで Glanular RBAC を用いてユーザーに対してフィルター表示させることが簡単に設定出来るようになってきました。本記事がどなたかの参考になれば幸いです。
*本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
参考リンク