本記事について
Azure ストレージアカウントは Blob, Files, Queue, Table の4種類のストレージからなります。その中でも SMB でマウント可能な Azure Files は簡易的なファイルサーバーやアプリケーションの共有ストレージとして良く利用されます。
その一方で、本稿でご紹介するリソースログ (診断ログ) は後から登場したこともあり、中々知られておらずウェブ上の情報も限られています。しかし、重要なファイルやデータをストレージアカウントに置く場合は、そのログ (ファイル・フォルダーの操作やアクセスの記録) を保持して検索可能にしておくことはとても重要です。
ですので、本記事では、ストレージアカウントの診断設定で Log Analytics ワークスペースに Azure Files のログを送り、実際にクエリを書いて分析するところまでを見ていきます。
Azure ストレージの診断設定
ストレージアカウントの診断設定から、Files を選択して、ログ送信の設定をします。
診断設定で取得したいログカテゴリーを選択し、送信先として事前に作成しておいた Log Analytics ワークスペースを選択します。
公式ドキュメントは下記になります。
なお、Azure Files のログのストレージアカウントへの取得については、マイクロソフトのサポートチームのブログがわかりやすく解説されています。
Log Analytics ワークスペースでの Azure Files のログ分析
Azure Files のログは、StorageFileLogs という名前のテーブルに格納されます。このテーブルのスキーマ情報は下記になります。
なので、たとえば下記のクエリで直近31日分のログを時間の降順で取得できます。
StorageFileLogs
| where TimeGenerated > ago(31d)
| sort by TimeGenerated desc
特に Azure Files は SMB で利用されることが多いかと思うので、Protocol == "SMB"
でフィルターをかけてみます。また、IPC$
へのアクセスのログを除外して表示するようにします。また、ログの列が多いので、project
句で絞ってみます。
StorageFileLogs
| where TimeGenerated > ago(31d)
| where Protocol == "SMB"
| where ObjectKey !contains "file.core.windows.net\\IPC$\\"
| sort by TimeGenerated desc
| project TimeGenerated, AccountName, Location, Protocol, OperationName, AuthenticationType, Uri, ObjectKey, SmbPrimarySID, Category, SmbCommandMinor, MetricResponseType, Type, _ResourceId
検索結果として、たとえばファイルを開いたイベントは下記のようにログでとらえられます。 (このレコードは SmbCommandMinor
が FileOpen
になっています。)
SMB アクセスのユーザーの分析 - SmbPrimarySID
さて、ここで分析の課題になるのが、SMB でのアクセスで Active Directory のユーザーの情報が SID (SmbPrimarySID) で表示されることです。SMB のストレージとして利用する場合、Active Directory で認証されたユーザーにアクセス許可を与えているケースが多いかと思いますが、どのユーザーがアクセスしてきたのかを、この SID では直感的につかむことが困難です。
Active Directory や Microsoft Entra Connect で AD と同期している Entra ID であればユーザーの SID の情報を持っているはずですが、都度そのディレクトリを見に行くのはなかなか大変かと思います。
Log Analytics でクエリをかける場合、SID 情報を含むユーザー一覧を別途カスタムログ (テキストログ) や Watchlist (要 Sentinel) として取りこむ、Blob Storage に参照用のファイルを置いて検索するなど、いくつか手法が考えられます。ですが、特にもし Microsoft Entra Connect を使っている場合は、Sentinel の UEBA 機能 を便利に活用することができます。
Sentinel UEBA の利用
利用する Log Analytics ワークスペースで Sentinel が有効になっている場合、そのワークスペースで UEBA 機能 を有効にすることで、Entra ID からユーザー情報が同期され、ワークスペースの IdentityInfo テーブル に格納されます。Entra Connect で ID 同期を行っている場合、Entra ID 側でも Active Directory のユーザー情報を保持しており、その中には Active Directory の SID も含まれます。
Log Analytics ワークスペースに格納された、UEBA が生成した IdentityInfo テーブル からアカウント一覧を取るには、例えば下記のようにします。(arg_max()関数の使い方については、「Azure Log Analytics と Kusto (KQL) 入門 3 - Join の使い方」にてご紹介していますので、ご興味ある方はご参照ください。)
IdentityInfo
| where TimeGenerated > ago(31d)
| where isnotempty(AccountUPN)
| summarize arg_max(TimeGenerated, *) by AccountUPN
そして、IdentityInfo テーブルでは、AccountSID 列が SID になっているので、StorageFileLogs テーブルの SmbPrimarySID とそれぞれ Key にして Join をかけます。こうすることで、検索で出たきたテーブルの中にアクセスしたユーザーの UPN が含まれるようになります。
サンプルのクエリは下記になります。
StorageFileLogs
| where TimeGenerated > ago(31d)
| where Protocol == "SMB"
| where ObjectKey !contains "file.core.windows.net\\IPC$\\"
| sort by TimeGenerated desc
| join kind=leftouter (
IdentityInfo
| where TimeGenerated > ago(31d)
| where isnotempty(AccountUPN)
| summarize arg_max(TimeGenerated, *) by AccountUPN
| project AccountUPN, AccountSID
) on $left.SmbPrimarySID == $right.AccountSID
| project TimeGenerated, AccountName, Location, Protocol, OperationName, AuthenticationType, Uri, ObjectKey, SmbPrimarySID, AccountUPN, Category, SmbCommandMinor, MetricResponseType, Type, _ResourceId
Blob Storage に参照用ファイルを配置
もし Sentinel を利用しない場合、各ユーザーのオンプレミス AD の SID を参照するために、そのリストを Blob Storage に置いておいて Log Analytics から参照するということが考えられます。
例えば、特定のストレージアカウントの Blob コンテナーに置いた userlist.csv というファイルに対してクエリをかけるには下記のような検索文を使うことができます。
<Blob Storage に配置する userlist.csv の例>
<その CSV ファイルの中身を Kusto クエリで扱う例>
externaldata(Id:string, DisplayName:string, UserPrincipalName:string, OnPremisesSecurityIdentifier:string)
[
@'<Blob Storage コンテナーの URL>/userlist.csv?'
h@'<SAS>'
]
with (format='csv', ignorefirstrecord = true)
なお、Kusto (KQL) で、@
はエスケープ、h文字列
は難読化用です。
そして、Sentinel UEBA の時と同じく、Join でクエリを生成することができます。
let UserList = externaldata(Id:string, DisplayName:string, UserPrincipalName:string, OnPremisesSecurityIdentifier:string)
[
@'<Blob Storage コンテナーの URL>/userlist.csv?'
h@'<SAS>'
]
with (format='csv', ignorefirstrecord = true)
| project UserPrincipalName, OnPremisesSecurityIdentifier;
StorageFileLogs
| where TimeGenerated > ago(31d)
| where Protocol == "SMB"
| where ObjectKey !contains "file.core.windows.net\\IPC$\\"
| sort by TimeGenerated desc
| join kind=leftouter (
UserList
) on $left.SmbPrimarySID == $right.OnPremisesSecurityIdentifier
| project TimeGenerated, AccountName, Location, Protocol, OperationName, AuthenticationType, Uri, ObjectKey, SmbPrimarySID, UserPrincipalName, Category, SmbCommandMinor, MetricResponseType, Type, _ResourceId
上記の userlist.csv という Entra ID 上のユーザーのリストは、Microsoft Graph PowerShell SDK の Beta 版を使って、取得することができます。
Connect-MgGraph -Scopes 'User.Read.All'
$userList = Get-MgBetaUser -All
$userList | Select-Object Id, DisplayName, UserPrincipalName, OnPremisesSecurityIdentifier | Export-Csv userlist.csv -NoTypeInformation
(補足) Kusto (KQL) 参考情報
先に Kusto (KQL) について記事にまとめていますので、もし KQL 自体の確認をされたい方はこちらをご覧ください。
最後に
本記事では Azure Files の診断設定と Log Analytics ワークスペースへのログ送信を確認し、またワークスペース上でのクエリのかけ方について見ていきました。本稿が、Azure Files のログ活用の一助になれば幸いです。
*本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。