[OCI]Cloud Guard でセキュリティを高めて99点にした

# はじめに
- OCIのCloud Guard(無償)を有効化すると、対象コンパートメント全リソースの設定内容や、アクティビティをスキャンして、所定のポリシーに違反しているかどうかを検出してくれます。
- 問題数の数に応じて、点数を出してくれるので、99点 を出すまでのお話です。（100点＝問題ゼロ）
- 本記事では主に「構成ディテクタ・レシピ」について中心に触れています。（ここを抑えれば100点は目指せる）
    - その他、「アクティビティ・レシピ」と「脅威ディテクタ・レシピ」の２つがありますが、前者は操作に対して気づきを与えるものなので、問題として検出されても、認識済みとしいうことですぐに「解決済み」としてマークしています。後者は利用者の使い方とは異なる概念です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/71db4b19-940a-1944-6223-eb2b7ac13d84.png)


# 対象の環境
- 今回は自身の検証用テナンシーで、以下のようなリソースを作っています。検証環境なので少ないですが、大体年間で1万くらいは利用しているでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/3e53e495-718f-3f71-890b-16b0b8ce5664.png)

- 大きく3つのVCNを使っており、複数テナンシーでのクロスリージョンでのSite to Site VPNや、リモートピアリング、IPv6なども利用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/5d2ed32c-19b1-5e47-c560-48e4da96c504.png)


# Cloud Guard 有効化直後
- 基本的にはパブリックなIPアドレスを持っているとポリシーに該当しまくりで問題がたくさん検出されるので自ずと点数は低くなります。以下は何も考えずに有効化した場合の点数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/ddcd7a46-12f7-2cf0-1369-7df499a30367.png)

# 検出される問題と、対処
- 構成ディテクタ・レシピは2023年12月現在 全50のレシピがあります。デフォルトではあまり機能しないものや、デフォルトでは厳しすぎるものがあるので全50のレシピに対する変更内容をお伝えします。
- また、時には対象リソース自体をディテクタ・レシピ対象外とするようにしています。

- [問題]は以下の様にデフォルトではたくさん出ます。クリティカルや重要度の高いものだけ対処すれば、80点近くにはなるかなと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/def16b9a-2c35-211f-359a-8b727b5670c7.png)

## 検出された問題を解決方法は４つ

- 今回は以下の★印箇所の対応を行い、99点にしました。

1. 問題を「解決済み」にする・・・主にアクティビティ・レシピの動作にしていて行う
1. 問題を「終了」にする・・・対象の問題名を永続的に？除外する場合に行う
1. レシピ自体をターゲットのコンパートメントから外す
1. レシピ内のルールを変更する・・・
    1. ルールにも依存するが、所定リソースのOCIや、所定タグが付いている場合は除外するように設定できる ★
    1. ルール自体を無効化 ★


# ★問題名の概要と99点にするための設定

|	No	|	構成ディテクタ・レシピの検出する問題名	|	概要	|	デフォルトからレシピを変更した？	|	有効可否	|	変更した内容概要となぜこうしたのかの方針。	|
|	 -----	|	 -----	|	 -----	|	 -----	|	 -----	|	 -----	|
|	1	|	API key is too old	|	ユーザーに割り当てられているIAMの秘密/公開キー・ペアが古すぎる場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外。（自動化用のアカウント、WAFLogエクスポート用など）	|
|	2	|	Block Volume is encrypted with Oracle-managed key 	|	ブロック・ボリュームがOracle管理キーで暗号化されている場合にアラートを生成します。	|		|	 〇    	|	鍵管理を適切に行える自信はないので、オラクル管理にする	|
|	3	|	Block Volume is not attached               	|	関連付けられたインスタンスにブロック・ボリュームがアタッチされていない場合にアラートを生成します。	|		|	 〇    	|		|
|	4	|	Bucket is public         	|	バケットがパブリックの場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外	|
|	5	|	Data Safe is not enabled 	|	データ・セーフが有効になっていないデータベースが検出された場合にアラートを生成します。	|		|	 〇    	|		|
|	6	|	Database System has public IP address      	|	データベース・システムにパブリックIPアドレスが割り当てられている場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外	|
|	7	|	Database System is publicly accessible     	|	データベースにパブリックにアクセス可能な場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外	|
|	8	|	Database System version is not sanctioned	|	認可されていないバージョンでデータベース・システムが実行されている場合にアラートを生成します。	|		|	 〇    	|		|
|	9	|	Database is not backed up automatically    	|	データベースの自動バックアップが有効になっていない場合にアラートを生成します。	|		|	 〇    	|		|
|	10	|	Database is not registered in Data Safe    	|	データ・セーフに登録されていないデータベース・インスタンスが検出された場合にアラートを生成します。	|		|	 〇    	|		|
|	11	|	Database patch is not applied              	|	指定した日数内に使用可能なデータベース・パッチが適用されていない場合にアラートを生成します。	|	Y	|	 〇    	|	10日から90日に変更。4半期ごとにはパッチあてるように。デフォルト10日は短くない？	|
|	12	|	Database system patch is not applied       	|	使用可能なデータベース・システム・パッチが適用されていない場合にアラートを生成します。	|	Y	|	 〇    	|	10日から90日に変更。4半期ごとにはパッチあてるように。デフォルト10日は短くない？	|
|	13	|	Database version is not sanctioned	|	認可されていないバージョンでデータベースが実行されている場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外	|
|	14	|	IAM Auth token is too old	|	IAM認証トークンが指定した最大日数より古い場合にアラートを生成します。	|	Y	|	 〇    	|	所定日数以内に更新する	|
|	15	|	IAM Customer secret key is too old         	|	IAM顧客秘密キーが指定した最大日数より古い場合にアラートを生成します。	|		|	 〇    	|		|
|	16	|	IAM group has too few members	|	IAMグループのメンバー数が指定した最小数より少ない場合にアラートを生成します。	|	Y	|	 ×   	|	無効化。空のグループがあれば通知できるようにしたかったが「０」は設定できないので、無効化	|
|	17	|	IAM group has too many members             	|	IAMグループのメンバー数が指定した最大数より多い場合にアラートを生成します	|	Y	|	 〇    	|	1グループ100ユーザは無さそうなので、閾値を厳しくし「１０」にした	|
|	18	|	Instance has a public IP address           	|	コンピュート・インスタンスにパブリックIPアドレスが割り当てられている場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外	|
|	19	|	Instance is not running an Oracle public image                 	|	コンピュート・インスタンスがOracleパブリック・イメージから構築されていない場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外	|
|	20	|	Instance is publicly accessible	|	インスタンスにパブリックにアクセス可能な場合にアラートを生成します。	|	Y	|	 〇    	|	0.0.0.0/0の22及び3389が無くても、パブリックIPがあれば検知する。タグを付与したものは除外するようにする	|
|	21	|	Instance is running an Oracle public image 	|	実行中のコンピュート・インスタンスがOracleパブリック・イメージから構築されている場合にアラートを生成します。	|	Y	|	 ×   	|	デフォルト無効。	|
|	22	|	Instance is running without required Tags  	|	コンピュート・インスタンスが構成済の必須タグなしで実行されている場合にアラートを生成します。	|	Y	|	 〇    	|	Oracle-Tags.CreatedByはデフォルトでつくはずなので、もしタグがなかったらアラートするように変更した	|
|	23	|	Key has not been rotated	|	指定した期間内にKMSキーがローテーションされなかった場合にアラートを生成します	|		|	 〇    	|	Vaultのマスター鍵をGUIからローテーションするのみでOK	|
|	24	|	Load Balancer has public IP address        	|	ロード・バランサがパブリックIPアドレスで実行されている場合にアラートを生成します。	|		|	 〇    	|	所定Tagのリソースは除外	|
|	25	|	Load balancer SSL certificate expiring soon	|	ロード・バランサのSSL証明書が指定した期間内に期限切れになるように設定されている場合にアラートを生成します。	|		|	 〇    	|		|
|	26	|	Load balancer allows weak SSL communication	|	 Transport Layer Security (TLS) 1.2より前のバージョンを含むSSLポリシーの一部としてロード・バランサにプロトコルが構成されている場合にアラートを生成します。	|		|	 〇    	|		|
|	27	|	Load balancer allows weak cipher suite     	|	ロード・バランサでoci-wider-compatible-ssl-cipher-suite-v1の暗号スイートが構成されている場合にアラートを生成します。	|		|	 〇    	|		|
|	28	|	Load balancer has no back-end set          	|	ロード・バランサに関連付けられたバックエンド・セットがない場合にアラートを生成します。	|		|	 〇    	|		|
|	29	|	Load balancer has no inbound rules or listeners                	|	オープン・ソース(0.0.0.0/0)からのトラフィックを受け入れるイングレス・ルールがロード・バランサのセキュリティ・リストに含まれる場合にアラートを生成します。	|		|	 〇    	|	基本的にはNSGで行うので検知されないはず	|
|	30	|	NSG egress rule contains disallowed IP/port	|	ネットワーク・セキュリティ・グループ(NSG)のエグレス・ルールに、許可されない宛先IPアドレスおよびポート番号が含まれている場合にアラートを生成します。	|		|	 〇    	|	検知されたら対応する、なぜか２２は入っていない	|
|	31	|	NSG ingress rule contains disallowed IP/port 	|	ネットワーク・セキュリティ・グループのイングレス・ルールに、許可されない宛先IPアドレスおよびポート番号が含まれている場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外。検知されたら対応する、なぜか２２は入っていない	|
|	32	|	Object Storage bucket is encrypted with Oracle-managed key	|	オブジェクト・ストレージ・バケットがOracle管理キーで暗号化されている場合にアラートを生成します。	|	Y	|	 ×   	|	無効化。ドキュメントではデフォルト無効とあるが有効になっている。Oracle管理鍵でよいので無効化した。	|
|	33	|	Password is too old      	|	IAMパスワードが指定した最大日数より古い場合にアラートを生成します。	|		|	 〇    	|	90日以内にパスワードを更新する	|
|	34	|	Password policy does not meet complexity requirements	|	パスワード・ポリシーが複雑性要件を満たしていません。	|	Y	|	 〇    	|	文字長だけ、14文字から10文字に変更	|
|	35	|	Policy gives too many privileges	|	 IAMポリシーによって、管理者グループのメンバー以外のユーザーに管理者ロールのアクセス権が付与される場合にアラートを生成します。	|	Y	|	 ×   	|	無効化。ドキュメント的には管理権限を持っているポリシーに対して検知されるとあるが、「managed」があれば検知されてしまう。ほぼすべてのポリシーで引っかかるため、無効化。	|
|	36	|	Read Log access disabled for bucket	|	オブジェクト・ストレージ・バケットに対して読取りアクセス・ログが有効になっていない場合にアラートを生成します。	|		|	 ×   	|	デフォルト無効。	|
|	37	|	Resource is not tagged appropriately	|	指定したタグ付け要件に準拠するようにリソースがタグ付けされていない場合にアラートを生成します。	|	Y	|	 〇    	|	Oracle-Tags.CreatedByはデフォルトでつくはずなのでもしなかったらアラート	|
|	38	|	Scanned container image has vulnerabilities	|	Oracle Vulnerability Scanning Service (VSS)がコンテナをスキャンし、既知のサイバーセキュリティの脆弱性を識別した場合にアラートを生成します。	|		|	 〇    	|	ドキュメントではすべてのCVEが検出されます、とあるが、「HIGH」のみに指定されている。	|
|	39	|	Scanned host has open ports                	|	Oracle Vulnerability Scanning Service (VSS)がコンピュート・インスタンス(ホスト)をスキャンし、オープン・ポートを識別した場合にアラートを生成します。	|		|	 〇    	|		|
|	40	|	Scanned host has vulnerabilities           	|	Oracle Vulnerability Scanning Service (VSS)がコンピュート・インスタンス(ホスト)をスキャンし、既知のサイバーセキュリティの脆弱性を識別した場合にアラートを生成します。	|		|	 〇    	|	ドキュメントではすべてのCVEが検出されます、とあるが、「HIGH」のみに指定されている。	|
|	41	|	Tenancy admin privilege granted to group   	|	テナンシ管理者権限が必要以上のIAMグループに付与されている場合にアラートを生成します。	|	Y	|	 〇    	|	manage All-resourceのポイントつのみ検出される。ポリシーに複数行存在しても該当業のみピックアップして問題として検出してくれる。administratorsグループのみに設定した。	|
|	42	|	User does not have MFA enabled             	|	ーザーがマルチファクタ認証(MFA)を有効にしていない場合にアラートを生成します。	|		|	 〇    	|		|
|	43	|	User has API keys        	|	ユーザーがAPIキーを有効にしている場合にアラートを生成します。	|		|	 〇    	|	API有効化しているユーザを確認できるように、実際にはタグ付与せずにいた。	|
|	44	|	VCN Security list allows traffic to non-public port from all sources (0.0.0.0/0) 	|	VCNセキュリティ・リストで、オープン・ソース(0.0.0.0/0)からの非パブリック・ポートへの無制限のトラフィックが許可されている場合にアラートを生成します。	|	Y	|	 〇    	|	port443は0.0.0.0/0設定を許可するように変更した。	|
|	45	|	VCN Security list allows traffic to restricted port	|	VCNセキュリティ・リストで、セキュリティ・リストのイングレス・ルールの一部として特定の制限ポート(「入力設定」、「制限付きプロトコル: ポート・リスト」を参照)が許可されている場合にアラートを生成します。	|	Y	|	 〇    	|	セキュリティ・リストを確認し、特定CIDRからのみになっていた。問題ないはずなのでリソースに対してタグで除外した。	|
|	46	|	VCN has InternetGateway attached           	|	VCNがインターネット・ゲートウェイにアタッチされている場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外	|
|	47	|	VCN has Local Peering Gateway attached     	|	VCNがローカル・ピアリング・ゲートウェイにアタッチされている場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外	|
|	48	|	VCN has no inbound Security List	|	VCNにインバウンド・セキュリティ・リストがない場合にアラートを生成します。	|	Y	|	 〇    	|	所定Tagのリソースは除外。Default セキュリティ・リストを使わない場合、削除できず、空にしなければいけないので、Default セキュリティ・リストはタグを付与して除外とした。	|
|	49	|	VNIC without associated network security group                 	|	仮想ネットワーク・インタフェース・カード(VNIC)にNSGが関連付けられていない場合にアラートを生成します。	|		|	 〇    	|	推奨事項には入力設定で変更するとあるが、実際には変更できない	|
|	50	|	Write Log access disabled for bucket       	|	オブジェクト・ストレージ・バケットに対して書込みアクセス・ログが有効になっていない場合にアラートを生成します。	|		|	 ×   	|	デフォルト無効。	|

# なぜ100点にしないのか。
- 「User has API keys」問題だけ問題に残しています。APIキーを付与しているユーザのみを簡単に可視化できようにしています。
- APIキーを持っていると、IAMの認証（IPアドレスやMFA）では制御できないので、きちんとIAMポリシー＝認可で制御ができることを意識しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/bf3289db-bafc-fec9-ede9-8801812a9b35.png)



# 以上

## 参考情報
- ディテクタ・レシピの一覧と対処べスプラ
    - https://docs.oracle.com/en-us/iaas/cloud-guard/using/detect-recipes.htm#detect-recipes-reference
- Coud Guard チューニングのヒント
    - https://blogs.oracle.com/ateam/post/coud-guard-tuning-tips