はじめに
Ignite 2024 にあわせて、Network Security Perimeter というサービスがパブリックプレビューになりました。複数の PaaS をグルーピングしてグループ内の PaaS 間の通信のみを許可したり、グループ内の PaaS に対して特定の IP アドレスからのアクセスのみを許可できたりします。
Public Preview: Network Security Perimeter
Network Security Perimeter が対応するサービスには Log Analytics Workspaces が含まれています。ということは、Network Security Perimeter を使えば Log Analytics に対して念願の送信元 IP アドレス制限を実現できるということです。実際に試しました。
Network Security Perimeter の設定
Network Security Perimeter を利用するためには、プロファイルを作成する必要があります。このプロファイルで「どの PaaS をグルーピング化するか」「このグループからどのような送信アクセスを許可するか」「このグループに対してどのような受信アクセスを許可するか」を設定します。
今回はアクセス制限したい Log Analytics Workspaces だけを対象とするプロファイルを作成して、受信アクセスの設定に特定のグローバル IP アドレスを追加しました。
Network Security Perimeter で保護されている Log Analytics Workspaces は、これらのグローバル IP アドレス以外からのクエリとインジェストを拒否するはずです。実際に試します。
クエリの動作確認
Network Security Perimeter で保護した Log Analytics Workspaces に対してログを取得するクエリを実行します。
プロファイルの受信アクセスで許可しているグローバル IP アドレスからクエリを実行すると、通常通りに結果が返ってきます。
> curl ifconfig.me
217.178.28.82
> $query = "Heartbeat | count"
> $result = Invoke-AzOperationalInsightsQuery -WorkspaceId "xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx" -Query $query
> $result.count
1
> $result.Results
Count
-----
758
一方で、プロファイルの受信アクセスで許可していないグローバル IP アドレスからクエリを実行すると、 Forbidden となりクエリが失敗します。
> (curl ifconfig.me).content
36.2.xxx.xxx
> $query = "Heartbeat | count"
> $result = Invoke-AzOperationalInsightsQuery -WorkspaceId "xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx" -Query $query
Invoke-AzOperationalInsightsQuery : Operation returned an invalid status code 'Forbidden'
At line:1 char:11
+ $result = Invoke-AzOperationalInsightsQuery -WorkspaceId "f13a060b-81 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [Invoke-AzOperationalInsightsQuery], ErrorResponseException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.OperationalInsights.Query.InvokeOperationalInsightsQuery
デバック付きでやり取りを見てみると、Network Security Perimeter によって拒否されたことを示す応答が返ってきています。これはいい感じ。
> $result = Invoke-AzOperationalInsightsQuery -WorkspaceId "xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx" -Query $query -Debug
(中略)
DEBUG: ============================ HTTP REQUEST ============================
HTTP Method:
POST
Absolute Uri:
https://api.loganalytics.io/v1/workspaces/xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx/query
Headers:
x-ms-client-request-id : 0d0645e9-d9e5-4c6b-84ad-e9645624c3e5
Body:
{
"query": "Heartbeat | count"
}
DEBUG: ============================ HTTP RESPONSE ============================
Status Code:
Forbidden
Headers:
Connection : keep-alive
X-Content-Type-Options : nosniff
Access-Control-Allow-Origin : *
Access-Control-Expose-Headers : Retry-After,Age,WWW-Authenticate,x-resource-identities,x-ms-status-location
Vary : Accept-Encoding
Strict-Transport-Security : max-age=15724800; includeSubDomains
Date : Tue, 26 Nov 2024 13:46:13 GMT
Via : 1.1 draft-oms-6c46b6c444-zfp5r
Body:
{
"error": {
"message": "The provided credentials have insufficient access to perform the requested operation",
"code": "InsufficientAccessError",
"correlationId": "73eac064-3aae-46fa-a1eb-3f225e0ae57d",
"innererror": {
"code": "NspValidationFailedError",
"message": "Access to workspace 'la-log' from '36.2.xxx.xxx' is denied due to failed Network Security Perimeter
validation. (workspace resource ID:
/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-nsp-eval/providers/microsoft.operationalinsights/
workspaces/la-log)."
}
}
}
当然 Azure ポータルから該当の Log Analytics Workspaces のログを見ようとすると、デバックで確認したのと同じメッセージが出力されてログの検索画面が表示されません。いい感じ。
インジェストの動作確認
次に、Network Security Perimeter で保護された Log Analytics に対して Azure Monitor Agent でログを送ってみます。
結果は次の通りです。なぜか Network Security Perimeter の受信アクセスで許可していないグローバル IP アドレスを持つサーバからの Heartbeat を受信しています。これは想定外です。パブリックプレビューだからでしょうか…
> $query = "Heartbeat | where TimeGenerated > ago(24h) | summarize by Computer,ComputerIP"
> $result = Invoke-AzOperationalInsightsQuery -WorkspaceId "f13a060b-8157-4db3-8347-bbdaa1d6a621" -Query $query
> $result.Results
Computer ComputerIP
-------- ----------
nsp01 20.190.60.242
ns02 52.250.62.178
まとめ
Network Security Perimeter を利用して Log Analytics Workspaces の送信元 IP アドレス制限を試しました。クエリは期待通りに動作しましたが、インジェストが想定外でした。
仮にクエリのみ対応だとしても、クエリに対して送信元 IP アドレス制限がかけられるなら利用価値は十分にあります。現在の仕組みでクエリに対して送信元 IP アドレスをかけることはできませんし、パブリックなクエリを全拒否する Azure Monitor Private Linkscope は ネットワークと DNS の考慮事項が多く気軽ではありません。GA になったら改めて動作確認しようと思います。
Note
- 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
- 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
- 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。