はじめに
本記事では OCI Cloud Guard についてまとめていきます。
概要
OCI Cloud Guard は、クラウド全体の脆弱性を監視・是正する サービスです。
CSPM を実現するサービスです。
具体的な機能としては以下の通りです。
- デプロイしている OCI サービス設定内容に関するセキュリティリスク診断
- IAM ユーザーの アクティビティに関するセキュリティリスク診断
- AWS で言うと、AWS Security Hub CSPM + Amazon GuardDuty みたいなサービスという印象です
OCI Cloud Guard を構成するコンポーネントをそれぞれ見ていきましょう。
Target (ターゲット)
OCI Cloud Guard にて チェックする対象のこと です。
具体的には コンパートメントを指定 します。
ポイントは以下のとおりです。
- 指定したコンパートメントの 子コンパートメントもチェック対象 になる
- IAM ポリシーを検査する には ルートコンパートメントを指定する必要がある
Detector (ディテクタ)
ディテクタ・レシピを基にターゲットで指定したコンパートメントのリソース及びアクティビティを監視及び問題点を検出 します。
ディテクタ・レシピとは検出ルールの集合です。
ディテクタ・レシピの種類は以下 5 種類あります。
| レシピ名 | 概要 |
|---|---|
| OCI Configuration Detector Recipe | ・各OCIサービス設定を監視するルール |
| OCI Activity Detector Recipe | ・リソース操作を監視するルール |
| OCI Threat Detector Recipe | ・IAMユーザーの不正操作を監視するルール |
| OCI Instance Security Detector Recipe | ・コンピュートでの不審な振る舞いを監視するルール |
| OCI Container Security Config Recipe | ・OKE環境にて実行されるポリシー違反したコンテナを監視するルール |
上記オラクルマネージドディテクタ・レシピがデフォルトで提供されています。
カスタムディテクタ・レシピを作成することも可能で、その場合はオラクルマネージドディテクタ・レシピをクローンして作成します。
- オラクルマネージドディテクタ・レシピに定義されているルールの無効及びリスクレベルの変更はできません。ただし、ルール毎に
Conditional groupという設定項目が有り、特定のリソースを対象・除外することは可能です - そのためオラクルマネージドでも監視対象リソースのフィルタリングは可能ですが、そういった対応が必要な場合は基本的にカスタムディテクタ・レシピを作成して対応しましょう
- ディテクタ・レシピの変更に関するベストプラクティスは以下ドキュメントを参照してみてください
Responder (レスポンダ)
ディテクタが問題を検出した際に レスポンダレシピを基に OCI Cloud Guard がアクションを実行 します。
レスポンダの種類は以下 2 種類です。
| タイプ | 概要 |
|---|---|
| Notification | ・ディテクタで問題を検出した際のイベントを OCI Events にプッシュする |
| Remediation | ・ディテクタで検出した問題を修正する |
レスポンダ・レシピとは上記タイプのアクションルールの集合です。
デフォルトでは オラクルマネージドの OCI Responder Recipe が提供されています。
カスタムレスポンダ・レシピを作成することも可能で、その場合はオラクルマネージドレスポンダ・レシピをクローンして作成します。
ディテクタ・レシピと同様に、レスポンダ・レシピもターゲットにアタッチする必要があります。
- オラクルマネージドレスポンダ・レシピに定義されているルールの無効化はできません
使用方法(デモ)
検証構成
検証構成図は以下の通りです。
なお、以下リソースは作成済みで進めていきます。
- 子コンパートメント
- 可視性がパブリックのバケット
検証では、OCI Cloud Guard を有効化し、実際に検出されるかを確かめていきます。
- 環境コードは以下 GitHub にあげてますので、よかったら覗いてみてください
OCI Cloud Guard 有効化
OCI コンソール左上のハンバーガーマークをクリックし、Identity & Security → Cloud Guard をクリックします。

最初は、Cloud Guard 自身が各サービスを検査するのに必要な IAM ポリシーの作成を促されますので「Create policy」をクリックします。

作成に成功すると「Next」ボタンが有効になるのでクリックします。

- 実際に作成されたポリシーは以下の通りです
- ルートコンパートメントに作成されます
allow service cloudguard to manage cloudevents-rules in tenancy where target.rule.type='managed'
allow service cloudguard to read vaults in tenancy
allow service cloudguard to read keys in tenancy
allow service cloudguard to read compartments in tenancy
allow service cloudguard to read tenancies in tenancy
allow service cloudguard to read audit-events in tenancy
allow service cloudguard to read compute-management-family in tenancy
allow service cloudguard to read instance-family in tenancy
allow service cloudguard to read virtual-network-family in tenancy
allow service cloudguard to read volume-family in tenancy
allow service cloudguard to read database-family in tenancy
allow service cloudguard to read object-family in tenancy
allow service cloudguard to read load-balancers in tenancy
allow service cloudguard to read users in tenancy
allow service cloudguard to read groups in tenancy
allow service cloudguard to read policies in tenancy
allow service cloudguard to read dynamic-groups in tenancy
allow service cloudguard to read authentication-policies in tenancy
allow service cloudguard to use network-security-groups in tenancy
allow service cloudguard to read data-safe-family in tenancy
allow service cloudguard to read autonomous-database-family in tenancy
allow service cloudguard to read log-groups in tenancy
Allow any-user to { WLP_BOM_READ } in tenancy where all { request.principal.id = target.agent.id, request.principal.type = 'workloadprotectionagent'}
Allow any-user to { WLP_CONFIG_READ } in tenancy where all { request.principal.id = target.agent.id, request.principal.type = 'workloadprotectionagent'}
Endorse any-user to { WLP_LOG_CREATE } in any-tenancy where all { request.principal.id = target.agent.id, request.principal.type = 'workloadprotectionagent' }
Endorse any-user to { WLP_METRICS_CREATE } in any-tenancy where all { request.principal.id = target.agent.id, request.principal.type = 'workloadprotectionagent' }
Endorse any-user to { WLP_ADHOC_QUERY_READ } in any-tenancy where all { request.principal.id = target.agent.id, request.principal.type = 'workloadprotectionagent' }
Endorse any-user to { WLP_ADHOC_RESULTS_CREATE } in any-tenancy where all { request.principal.id = target.agent.id, request.principal.type = 'workloadprotectionagent'}
続いて自動作成ウィザードが表示されます。
Select a region は、Cloud Guard の検出結果を保持するリージョンです。
リージョンの変更は一度 Cloud Guard を無効化する必要がある ため慎重に選択しましょう。
Compartments to monitor は、Cloud Guard で監視する対象のコンパートメントを選択 します。
ここで選択したコンパートメントを指定したターゲットが自動作成されます。
ターゲットの設定変更・削除は後からでも可能 なので、最初は All で問題ないと思います。
自動でターゲットを作成してほしくない場合は None を選択 しましょう。
recipe で指定したレシピは、自動作成されるターゲットにアタッチされます。
カスタムレシピを作成していなければオラクルマネージドのレシピから選択が可能です。
後からアタッチ・デタッチは可能です。

- ちなみにオラクルマネージドのレシピはルートコンパートメントに所属しています
上記の通り有効化すると、ルートコンパートメントに、ルートコンパートメントを対象とする、ルートコンパートメント名のターゲットが自動作成されます。

ターゲットの構成を見ると、ウィザードで指定したレシピがアタッチされているのも確認できます。

設定してから時間はかかりましたが(約30~40分くらい)、実際に検出結果がダッシュボードに表示されているのが確認できました。

通知受信までを設定
有効化するだけでは、上記の通り検出はされますが、通知や自動修正はされません。
また、オラクルマネージドレスポンダ・レシピではルール毎の有効無効が制御できないので、今回はカスタムレスポンダ・レシピを作成しターゲットにアタッチします。
加えて、こちら でも触れましたが、レスポンダ・レシピの Notification タイプルールはあくまでイベントを OCI Events にプッシュするだけ です。
そのため実際に通知を受信するにはイベントルールと通知を作成する必要があります。
OCI Notifications にてトピックとサブスクリプションを作成
まず始めに OCI Notifications にてトピックとサブスクリプションを作成します。
手順は割愛しますが、今回はルートコンパートメントに作成しました。
後述するイベントルールと異なるコンパートメントに作成しても問題ありません。


OCI Events にてイベントルールを作成
続いて、OCI Cloud Guard がプッシュしたイベントを拾って通知をするためのイベントルールを作成します。
ここで 1つ注意点があります。
OCI Cloud Guard がプッシュするイベント (に限らずOCIリソースがプッシュするイベント) は、OCIリソースが所属するコンパートメントに閉じられます。
加えてイベントルールは、所属するコンパートメント及び子コンパートメントのイベントを拾います。
イベントは、このコンパートメントに作成したルールと、このコンパートメントおよび子コンパートメントのリソースから発行されたイベント・メッセージを比較します。
そのため、検出されたOCIリソースが存在するコンパートメントもしくは上位のコンパートメントにイベントルールを作成する必要がある ということです。
今回は全てのコンパートメントのイベントを拾いたいので、ルートコンパートメントにイベントルールを作成します。
OCI コンソール左上のハンバーガーマークをクリックし、 Identity & Security → Cloud Guard をクリックします。

各種項目を入力します。ポイントは、Event Type を Detected - Problem としている点です。
Actions に OCI Notifications のトピックを選択し Create Rule をクリックして完了です。

カスタムレスポンダ・レシピの作成 & ターゲットへのアタッチ
続いて OCI Cloud Guard からイベントをプッシュするための設定をしていきます。
Responder recipes にて Clone をクリックします。

Recipe にてクローン基になるオラクルマネージドレスポンダ・レシピを選択し Clone をクリックします。

クローン直後だと、クローン基と設定値は同じなので、修正していきます。
カスタムレスポンダ・レシピ内の Responder rules を選択し、Remediation タイプのルール全てにチェックを入れます。

その状態で Actions → Disable をクリックします。確認画面が出るので Disable をクリックし完了です。

続いてターゲットにアタッチしていきます。
アタッチするターゲットをクリックします。

Configuration タブ内の Responder recipes 欄の Add recipes をクリックします。

先程作成したカスタムレスポンダ・レシピを選択し Add recipes をクリックして完了です。

通知確認
実際にメールを受信し、パブリックなバケットに対する検出結果を確認できました。

レスポンダアクティビティとしてもイベントをプッシュしているのが確認できます。

自動修復を設定
続いて自動修復の設定を有効化していきます。
Remediation タイプのルールは、一部対象外ですが、設定することで自動修復をすることが可能です。
今回は、可視性がパブリックのバケットをプライベートに修復するルールを自動化します。
IAMポリシーにステートメント追加
こちら でも触れた通り、OCI Cloud Guard を有効化する際に IAM ポリシーを作成しました。
こちらの IAM ポリシーは読み取りの権限しか付与されていません。
そのため、修復を実施するための IAM ポリシーを付与します。
Make Bucket Private ルールの Edit をクリックします。

自動修復有効化
先程の画面上にて、Execute automatically にチェックを変更し、同意ボタンにもチェックを入れます。
実行時のイベントをプッシュしたいので Post Remediation Notification は有効のままにします。
自動修復を有効化する場合は条件グループの指定が必須のため、 今回は東京リージョンのリソースを対象とするように指定しています。
各項目入力後 Save をクリックして完了です。

ルール有効化
最後にルールを有効化します。
無効化した際の手順と同様に、Make Bucket Private ルールを選択し、Actions → Enable で有効化します。

動作確認
時間をおいて確認すると、バケットの可視性がプライベートに修正されていました。

レスポンダアクティビティとしても対応した際のイベントがプッシュされているのが確認できます。

おわりに
本記事では、クラウド全体の脆弱性を監視・是正するサービスである OCI Cloud Guard についてまとめました。
無償で利用可能なサービス ですので商用環境では必ず有効化しましょう。
🌟この記事が誰かの役に立てば幸いです!
また、ご質問やフィードバックもお待ちしています。
番外編
ディテクタ・レシピ & レスポンダ・レシピ の編集における注意点
それぞれ編集する場所が2つあり、場所によって編集可能な内容が異なります。
ディテクタ・レシピについて
1つ目の場所は ディテクタ・レシピメニューからの編集 です。

ここでは以下 4 つの項目が編集可能です。
- ステータス
- リスクレベル
- ラベル
- 条件グループ
2つ目の場所は ターゲットメニュー内のディテクタ・レシピからの編集 です。

ここでは以下 1 つの項目が編集可能です。
- 条件グループ
レスポンダ・レシピについて
1つ目の場所は レスポンダ・レシピメニューからの編集 です。

ここでは以下 1 つの項目が編集可能です。
- ステータス
2つ目の場所は ターゲットメニュー内のレスポンダ・レシピからの編集 です。

ここでは以下 4 つの項目が編集可能です。
- IAMポリシーステートメントの追加
- ルールトリガー
- イベントプッシュ
- 条件グループ













