こんにちは! m.uriuです。
今回はOCIの「脆弱性スキャン」の結果を、「OCIコンソール」と「OCI CLI」の2種類の方法で出力する手順について紹介したいと思います。
OCI CLIでの出力は少しややこしかったので、そのあたりをわかりやすく説明できればと思います。
目次
OCI脆弱性スキャンサービスとは?
今回の記事で使用するOCI脆弱性スキャンサービスについて解説します。
不要な方は「脆弱性スキャンの設定」まで飛ばしてください。
脆弱性スキャンとは?
Oracle Cloud Infrastructure Vulnerability Scanning Serviceは、ホストおよびコンテナ・イメージに潜在的な脆弱性がないかを定期的にチェックすることで、セキュリティ状態を改善するのに役立ちます。このサービスにより、開発者、運用、およびセキュリティ管理者は、誤って構成されたリソースや脆弱なリソースを包括的に可視化し、改善情報など、これらの脆弱性に関するメトリックと詳細を含むレポートを生成します。
脆弱性スキャンを使用すると、特定のインスタンスやコンテナをスキャンし、「脆弱性」「オープン・ポート」「CISベンチマーク」という項目でスキャン結果を表示できます。
次にこの各項目について説明します。
脆弱性
この項目では、検知した脆弱性に該当するCVE-ID(CVE識別番号)を表示します。
スキャン結果からCVE-IDをクリックすることで、NISTの詳細ページへ移動します。CVE-IDについてはこちらを参照ください。
オープン・ポート
この項目では、スキャンしたインスタンスやコンテナのオープン・ポートを検出し表示します。
意図的ではないオープン・ポートは、そのリソースへの潜在的な攻撃手段となり悪用される可能性がありますので、運用しているサービスによっては対策が必要です。
CISベンチマーク
この項目では、CISベンチマークの結果を表示します。
CISベンチマークの各項目の検証結果を合格/失格で表示します。CISベンチマークについてはこちらを参照ください。
OCIコンソールでスキャン結果の出力
まずOCIコンソールで脆弱性スキャンの結果を出力するまでの手順を紹介します。
検証環境
今回の検証で使用した環境は以下の通りです。
・スキャン対象サーバ
イメージ: Oracle-Linux-8.7-2023.04.25-0
シェイプ: VM.Standard.E4.Flex OCPU数: 1 メモリー(GB): 1
・OCI CLI用サーバ
イメージ: Oracle-Linux-8.7-2023.04.25-0
シェイプ: VM.Standard.E4.Flex OCPU数: 1 メモリー(GB): 1
IAMポリシーの設定
脆弱性スキャンを有効化するためのIAMポリシーを作成します。事前にスキャンサービスを操作するグループを作成しておきます。
下記のポリシーを、スキャンするコンパートメントに作成します。
Allow group <グループ名> to manage vss-family in compartment <コンパートメント名>
エージェントの有効化
今回、脆弱性スキャンはOracle Cloudエージェントで有効化します。
脆弱性スキャンの有効化はインスタンス作成時か、インスタンス作成後でも可能です。
インスタンス作成時
コンピュート・インスタンスの作成画面で一番下の拡張オプションからOracle Cloudエージェントタブを表示し、脆弱性スキャンのチェックボックスを入れてインスタンスを作成します。
インスタンス作成後
インスタンスの詳細画面からOracle Cloudエージェントタブを表示し、脆弱性スキャンを有効化します。(適用には数分かかります。)
スキャン・レシピの作成
スキャンのスケジュール等の制御を行う「スキャン・レシピ」を作成します。
OCIコンソールのメニューから「アイデンティティとセキュリティ」>「スキャン」>「スキャン・レシピ」から「作成」を選択し、レシピを作成します。
スキャン・レシピ作成画面から、スキャンの設定を行うことができます。
パブリックIPポートのスキャンやCISベンチマーク・プロファイルで、それぞれのスキャン対象や結果を設できます。
ファイルスキャンを有効化する場合、「特定のフォルダ内のファイルのスキャン」内を記入します。
スケジュールはスキャンの頻度を毎日か毎週〇曜日で設定できます。
スキャン・ターゲットの設定
先ほど作成したスキャン・レシピを使用し、「ターゲット」でスキャンするインスタンスを指定します。
「スキャン」>「ターゲット」から作成を選択し、ターゲットを設定します。
「コンパートメントに作成」は、ターゲットとスキャン結果を出すコンパートメントを指定できます。
「<コンパートメント名>のスキャン・レシピ」で先ほど作成したスキャン・レシピを指定します。
「ターゲット・コンパートメント」でスキャンしたいインスタンスがあるコンパートメントを指定し、「ターゲット」でインスタンスを指定します。
上は選択したコンパートメントやそのサブコンパートメントの脆弱性スキャンが可能な全てのインスタンスが自動で選択され、下は個別にインスタンスを指定します。
スキャン結果の出力
スキャン・ターゲットを作成すると(スケジュールを毎日か作成した日の曜日に指定していた場合)スキャンを自動で開始します。
スキャンが成功すると、短ければ15分ほどでスキャン結果を「スキャン」>「スキャン・レポート」に表示します。
スキャン結果は以下のようになっており、左のリソースから「オープン・ポート」「脆弱性」「CISベンチマーク」の詳細を表示できます。
オープン・ポート
脆弱性
CISベンチマーク
これらの結果が表示されれば、脆弱性スキャンは成功です。
OCI CLIでスキャン結果の出力
続いて、OCIコンソールで表示されたスキャン結果をOCI CLIのコマンドを使用しjson形式で出力する方法を紹介します。
OCI CLIはOCIのリソースをコマンドラインで操作するツールです。サーバにOCI CLIをインストールして使用します。OCI CLIの詳細や導入方法は、こちらの公式ドキュメントを参照ください。
オープン・ポートのスキャン結果を出力する
まずオープン・ポートのスキャン結果と詳細をjson形式で出力します。
下記のコマンドでオープン・ポートのスキャン結果のリストを表示できます。コンパートメント内で複数のインスタンスのスキャン結果があった場合、全て表示できます。
oci vulnerability-scanning host scan result port list -c <コンパートメントのocid> --is-latest-only true
補足:「--is-latest-only」オプションは最新のスキャン結果を表示するオプションです。数日間の複数のスキャン結果が保存されている場合、「true」の引数で最新のものを、「false」(もしくはオプション無し)で保存されている全てのリストを表示します。
上記のコマンドの出力例は以下の通りです。
# oci vulnerability-scanning host scan result port list -c <コンパートメントのocid> --is-latest-only true
{
"data": {
"items": [
{
"compartment-id": "<コンパートメントのocid>",
"display-name": null,
"highest-problem-severity": "NONE",
"id": "ocid1.vssportscanresult.oc1..aaaaaaaa2v6td3236fjwtnstk6pht6olvp6xipzqx5u3yqvja7dp6ym5zmjq",
"instance-id": "<インスタンスのocid>",
"lifecycle-state": "ACTIVE",
"open-port-count": 8,
"time-finished": "2023-05-18T08:33:22+00:00",
"time-started": "2023-05-18T08:33:14+00:00"
}
]
}
}
続いてこのスキャン結果の詳細を下記コマンドで出力します。
上記のスキャン結果で表示された「"id"」の値を<スキャンID>として使用します。
oci vulnerability-scanning host scan result port get --host-port-scan-result-id <スキャンID>
上記のコマンドの出力例は以下の通りです。
# oci vulnerability-scanning host scan result port get --host-port-scan-result-id ocid1.vssportscanresult.oc1..aaaaaaaa2v6td3236fjwtnstk6pht6olvp6xipzqx5u3yqvja7dp6ym5zmjq
{
"data": {
"compartment-id": "<コンパートメントのocid>",
"display-name": null,
"highest-problem-severity": "NONE",
"id": "ocid1.vssportscanresult.oc1..aaaaaaaa2v6td3236fjwtnstk6pht6olvp6xipzqx5u3yqvja7dp6ym5zmjq",
"instance-id": "<インスタンスのocid>",
"lifecycle-state": "ACTIVE",
"open-port-count": 8,
"open-ports": [
{
"ip-address": "192.168.*.*",
"port": 111,
"protocol": "tcp",
"service": "sunrpc",
"severity": "NONE",
"vnic-id": "<VNICのocid>"
},
{
"ip-address": "192.168.*.*",
"port": 22,
"protocol": "tcp",
"service": "ssh",
"severity": "NONE",
"vnic-id": "<VNICのocid>"
},
{
"ip-address": "192.168.*.*",
"port": 68,
"protocol": "udp",
"service": "bootpc",
"severity": "NONE",
"vnic-id": "<VNICのocid>"
},
{
"ip-address": "192.168.*.*",
"port": 111,
"protocol": "udp",
"service": "sunrpc",
"severity": "NONE",
"vnic-id": "<VNICのocid>"
},
{
"ip-address": "138.*.*.*",
"port": 111,
"protocol": "tcp",
"service": "sunrpc",
"severity": "NONE",
"vnic-id": "<VNICのocid>"
},
{
"ip-address": "138.*.*.*",
"port": 22,
"protocol": "tcp",
"service": "ssh",
"severity": "NONE",
"vnic-id": "<VNICのocid>"
},
{
"ip-address": "138.*.*.*",
"port": 68,
"protocol": "udp",
"service": "bootpc",
"severity": "NONE",
"vnic-id": "<VNICのocid>"
},
{
"ip-address": "138.*.*.*",
"port": 111,
"protocol": "udp",
"service": "sunrpc",
"severity": "NONE",
"vnic-id": "<VNICのocid>"
}
],
"time-finished": "2023-05-18T08:33:22+00:00",
"time-started": "2023-05-18T08:33:14+00:00"
},
"etag": "20105f37b5d4d96fc688856867b980e311ccba67b072ec75daf60bcfb240f572--gzip"
}
先ほどOCIコンソールで確認したオープンポートのスキャン結果の詳細が表示できました。「"port"」で検出したポートを、「"protocol”」でプロトコルを、「"service"」で使用しているサービスを表示します。
脆弱性のスキャン結果を出力する
次に脆弱性のスキャン結果と詳細を出力します。
下記のコマンドで脆弱性のスキャン結果のリストが表示できます。こちらは「--is-latest-only」オプションが使えないので注意。
sudo yum oci vulnerability-scanning host vulnerability list -c <コンパートメントのocid>
上記のコマンドの出力例は以下の通りです。
# oci vulnerability-scanning host vulnerability list -c <コンパートメントのocid>
{
"data": {
"items": [
{
"compartment-id": "<コンパートメントのocid>",
"cve-reference": "CVE-2023-28617",
"host-count": 3,
"id": "ocid1.vsshostvulnerability.oc1..aaaaaaaaajlc4azgmql4sepcu5rlgljqkzqn6u5f756v4cxoztmtguyjnaja",
"lifecycle-state": null,
"name": "CVE-2023-28617",
"severity": "HIGH",
"state": "OPEN",
"time-first-detected": "2023-05-11T04:45:28+00:00",
"time-last-detected": "2023-05-18T08:33:35+00:00",
"vulnerability-type": null
}
]
}
}
続いてこのスキャン結果の詳細を下記コマンドで出力します。
上記のスキャン結果で表示された「"id"」の値を<スキャンID>として使用します。
oci vulnerability-scanning host vulnerability get --host-vulnerability-id <スキャンID>
上記のコマンドの出力例は以下の通りです。
# oci vulnerability-scanning host vulnerability get --host-vulnerability-id ocid1.vsshostvulnerability.oc1..aaaaaaaaajlc4azgmql4sepcu5rlgljqkzqn6u5f756v4cxoztmtguyjnaja
{
"data": {
"authentication": "agent",
"compartment-id": "<コンパートメントのocid>",
"cve-details": {
"cve-reference": "CVE-2023-28617",
"cvss3": "HIGH",
"description": "org-babel-execute:latex in ob-latex.el in Org Mode through 9.6.1 for GNU Emacs allows attackers to execute arbitrary commands via a file name or directory name that contains shell metacharacters.",
"exploitable": null,
"impact": null,
"patchable": null,
"reference-url": null,
"related-cve-reference": null,
"solution": null,
"threat": null,
"time-published": "2023-03-19T03:15:00+00:00",
"time-updated": "2023-05-10T01:15:00+00:00",
"title": "CVE-2023-28617"
},
"cve-reference": null,
"host-count": 3,
"id": "ocid1.vsshostvulnerability.oc1..aaaaaaaaajlc4azgmql4sepcu5rlgljqkzqn6u5f756v4cxoztmtguyjnaja",
"lifecycle-state": null,
"name": "CVE-2023-28617",
"severity": "HIGH",
"state": "OPEN",
"time-first-detected": "2023-05-11T04:45:28+00:00",
"time-last-detected": "2023-05-18T08:33:35+00:00",
"vulnerability-type": null
},
"etag": "5f533a13878c45b56254d81c3beb36d442fdbd5fbf9fd6fc91d43e8397922f58--gzip"
}
先ほどOCIコンソールで確認した脆弱性のスキャン結果の詳細が表示できました。「"cve-reference"」で検出したCVE-IDを、「"description"」はそのCVE-IDの説明を表示します。
CISベンチマークのスキャン結果を出力する
最後にCISベンチマークのスキャン結果と詳細を出力します。
下記のコマンドでCISベンチマークのスキャン結果のリストが表示できます。コンパートメント内で複数のインスタンスのスキャン結果があった場合、全て表示できます。
oci vulnerability-scanning host scan result cis-benchmark list -c <コンパートメントのocid> --is-latest-only true
上記のコマンドの出力例は以下の通りです。
# oci vulnerability-scanning host scan result cis-benchmark list -c <コンパートメントのocid> --is-latest-only true
{
"data": {
"items": [
{
"cis-benchmark-scan-issues-count": 10,
"compartment-id": "<コンパートメントのocid>",
"display-name": "2023-05-18",
"id": "ocid1.vsscisscanresult.oc1..aaaaaaaar2nmkk5x23aqg7lhdzhl2fjx25as5jizmeao6pcb5ceyyhlmg3qa",
"instance-id": "<インスタンスのocid>",
"lifecycle-state": "ACTIVE",
"time-finished": "2023-05-18T08:33:21+00:00",
"time-started": "2023-05-18T08:33:21+00:00"
}
]
}
}
続いてこのスキャン結果の詳細を下記コマンドで出力します。
上記のスキャン結果で表示された「"id"」の値を<スキャンID>として使用します。
# oci vulnerability-scanning host scan result cis-benchmark get --host-cis-benchmark-scan-result-id ocid1.vsscisscanresult.oc1..aaaaaaaar2nmkk5x23aqg7lhdzhl2fjx25as5jizmeao6pcb5ceyyhlmg3qa
{
"data": {
"cis-benchmark-scan-issues-count": 10,
"cis-benchmark-scan-result-scores": [
{
"benchmark-identifier": "5.2.9",
"description": "Ensure SSH HostbasedAuthentication is disabled",
"score": "PASS"
},
{
"benchmark-identifier": "5.2.19",
"description": "Ensure SSH warning banner is configured",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.14",
"description": "Ensure only strong MAC algorithms are used",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.15",
"description": "Ensure only strong Key Exchange algorithms are used",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.16",
"description": "Ensure SSH Idle Timeout Interval is configured",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.17",
"description": "Ensure SSH LoginGraceTime is set to one minute or less",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.21",
"description": "Ensure SSH AllowTcpForwarding is disabled",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.10",
"description": "Ensure SSH root login is disabled",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.22",
"description": "Ensure SSH MaxStartups is configured",
"score": "PASS"
},
{
"benchmark-identifier": "5.2.11",
"description": "Ensure SSH PermitEmptyPasswords is disabled",
"score": "PASS"
},
{
"benchmark-identifier": "5.2.23",
"description": "Ensure SSH MaxSessions is set to 4 or less",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.12",
"description": "Ensure SSH PermitUserEnvironment is disabled",
"score": "PASS"
},
{
"benchmark-identifier": "5.2.13",
"description": "Ensure only strong Ciphers are used",
"score": "PASS"
},
{
"benchmark-identifier": "5.2.20",
"description": "Ensure SSH PAM is enabled",
"score": "PASS"
},
{
"benchmark-identifier": "5.2.6",
"description": "Ensure SSH X11 forwarding is disabled",
"score": "FAIL"
},
{
"benchmark-identifier": "5.2.5",
"description": "Ensure SSH LogLevel is appropriate",
"score": "PASS"
},
{
"benchmark-identifier": "5.2.8",
"description": "Ensure SSH IgnoreRhosts is enabled",
"score": "PASS"
},
{
"benchmark-identifier": "5.2.7",
"description": "Ensure SSH MaxAuthTries is set to 4 or less",
"score": "FAIL"
}
],
"compartment-id": "<コンパートメントのocid>",
"display-name": "VSS_test_server",
"id": "ocid1.vsscisscanresult.oc1..aaaaaaaar2nmkk5x23aqg7lhdzhl2fjx25as5jizmeao6pcb5ceyyhlmg3qa",
"instance-id": "<インスタンスのocid>",
"lifecycle-state": "ACTIVE",
"time-finished": "2023-05-18T08:33:21+00:00",
"time-started": "2023-05-18T08:33:21+00:00"
},
"etag": "4568e3aa86969a2d55160f87ed15dff1763044dced75ac31d1015d2c32225a3e--gzip"
}
先ほどOCIコンソールで確認したCISベンチマークのスキャン結果の詳細が表示できました。「"benchmark-identifier"」でCISベンチマークのIDを、「"score"」でそのCISベンチマークの結果の成否を、「"description"」でそのCISベンチマークの説明を表示します。
まとめ
いかがだったでしょうか。
脆弱性スキャンの結果の表示について、グラフィカルで見やすいOCIコンソールでの表示と、json形式で出力できるOCI CLIのコマンドでの出力の2種類の方法を紹介させていただきました。
後者の表示方法は、jqコマンドを用意すればjsonからcsvに変換し、レポート等の資料作成もしやすいかと思います。
どちらも用途によって様々な活用ができるかと思いますので、この記事を参考に試してみてください。
補足:OCI CLIの脆弱性スキャンに関する他コマンドについてについては、こちらの公式ドキュメントを参照ください。