🛡️

Defender for Cloud で KQL ベースのカスタム推奨事項を作成する

2024/03/26に公開

はじめに

Defender for Cloud で自社 Azure 運用ルールなどに基づいてカスタムの推奨事項を作成する場合、従来は Azure ポリシーを使用していました。先日のアップデートで KQL ベースで推奨事項を作成できるようになりました。(AWS,GCP 向けは従来から KQL ベース) ちなみに Azure ポリシーベースのほうはさっそくレガシが付いてしまっています。(リタイアの予定はないようですが)
今回はこちらを試していきます。

設定

Defender for Cloud の[環境設定] からサブスクリプションを選択し、[セキュリティ ポリシー] > [+ 作成] > [カスタムの推奨事項] をクリックします。


タイトルなど以下のように基本情報を入力します。


クエリを設定してきます。[クエリエディターを開く] をクリックするとクエリ入力画面が表示されます。


画面のガイドの通り、いろいろサンプルがあり、これらを活用することが可能です。まず、記述ルールを明確に理解するため、[How To] をクリックします。


以下が記述ルールとなっています。

  • テーブル名 "RawEntityMetadata "でクエリを開始します
  • クエリの最初の行で環境とリソースの種類を記述します: | Where Environment == 'AWS' and Identifiers.Type == 'ec2.instance'
  • クエリには、健全または不健全な状態を定義する "iff" ステートメントを含める必要があります。このテンプレートを使用し、"condition" のみを編集します: | extend HealthStatus = iff(condition, 'UNHEALTHY','HEALTHY')
  • 最後の行は、元のカラムをすべて返します: | Project Id, Name, Environment, Identifiers, AdditionalData, Record, HealthStatus

フィルタを設定するため、RawEntityMetadata テーブルの中身を見ていきます。Name, Environment, Identifiers, AddtionalData, Record, LastUpdate が含まれています。

カラム名 内容
Name リソース名
Environment AWS, Azure など
Identifiers リソースタイプとリソース ID
AdditionalData サブスクリプション ID や最終スキャン時間、リージョンなど
Record Azure Resource Graph で確認できるリソース パラメータ

少し特殊なのは実際のリソースだけではなく、 "microsoft.resources/deployments" も含まれています。やろうと思えばリアルタイムではないですが、推奨されないデプロイが実行された場合にも検出できそうです。(実際は Azure アクティビティログでやればいいと思いますが)

またタイプにリソースグループは表示されますが、環境設定で管理グループを指定してもサブスクリプションは表示されないように見えるので、現状ではサブスクリプションに紐づくパラメータ (タグなど) はチェックできない模様です。同様に "microsoft.security" は含まれないため、Defender プランの設定チェック ("microsoft.security/pricings" や "microsoft.security/settings") はできないと思われます。

ここから実際にサンプルのクエリを設定していきます。今回は VM で CpuAlert というタグが設定されていることをチェックします。Environment と Identifiers.Type については、左側のカテゴリの欄をクリックすると、該当のフィルタが追加されるので、そちらを活用できます。以下のようにクエリを検証し、意図した HealthStatus であることを確認します。


元の設定画面に戻り、クエリをコピペして [次へ] をクリック、[作成] をクリックします。


作成後は [推奨事項] タブでカスタムの種類でフィルターすると確認、編集できます。なお、KQL ベースの場合はソースが [Defender for Cloud]、Azure ポリシーベースの場合は [Azure Policy] になります。


次にカスタム標準を作成して、カスタムの推奨事項を追加していきます。同じく [環境設定] からサブスクリプションを選択して [セキュリティ ポリシー] > [+ 作成] > [カスタム標準] をクリックします。


名前などを入力して [次へ] をクリックし、推奨事項を選択します。種類:カスタムでフィルタすると、先ほど作成した KQL ベースのカスタム推奨事項が利用できます。また、Azure ポリシーベースと KQL ベースの混在も可能です。


ちなみに、Azure ポリシーベースの推奨事項を含む場合は Azure ポリシーでイニシアティブが作成される (Azure ポリシーの推奨事項のみ含まれる) のですが、KQL ベースのみの場合はイニシアティブは作成されない仕様のようです。

確認

[推奨事項] > [すべての推奨事項] から 推奨事項の種類: カスタム にフィルタすることで、確認することができます。


作成したカスタム標準の結果は [規制コンプライアンス] から該当の標準名のタブから確認できます。が、KQL ベースのカスタム推奨事項が表示されず、混在させた Azure ポリシーベースの推奨事項だけ表示されます。(不具合?)


適用除外を作成することもできます。が、これも設定済みの内容をどこから確認するか分かりません。


AWS などと同じだとすると、セキュリティ ポリシーのページから確認できたのですが、操作項目がありません。(推奨事項リストの [...] をクリックしても何も表示されない)


ちなみに AWS のほうも新しいエクスペリエンスでは項目がなく、ポータルからメンテナンスできなくなりました。

[新しいエクスペリエンス] ※ [...] はクリックできない


[従来のエクスペリエンス]


気になること

  • 規制コンプライアンスのページからカスタム標準を確認しても KQL ベースのカスタム推奨事項が表示されない
  • 新しいエクスペリエンスになってから、従来できていたこと (Azure ポリシーベースのカスタム推奨事項の追加、AWS の適用除外の管理) ができなくなっている
  • Azure ポリシーベースのときにはあった推奨事項をカテゴリ分けするためのコントロール設定 (Azure ポリシーのイニシアティブでいうグループ) がない
  • 最近追加された組み込みの推奨事項は KQL ベースになっているようだが、強制や拒否 (Azure ポリシーの DeployIfNotExist や Deny) はどう実現するのか? (結局 Azure ポリシーを別に作成しなければいけないのか)
Microsoft (有志)

Discussion