Cortex Cloud の REST API を使用してみた

今回は Prisma Cloud ではなく、Cortex Cloud の API を使用してみようと思います。
Cortex Cloud は2025年度第3四半期後半に一般提供される予定のサービスです。
本記事では、Cortex Cloud のデモ環境でAPIを実行したときの手順を解説します。なお、デモ環境のためコンソール画面のスクリーンショットをお見せできないことをご了承ください。

本記事は2025年6月時点の記事になりますので、リリース後変更されている可能性があります。

API URLについて

Cortex Cloudでは、以下フォーマットのURLに対して、リクエストすることでREST APIを使用できます。

https://api-{fqdn}/public_api/v1/{name of api}/{name of call}/ 

URLのFQDN部分は契約しているお客様ごとに異なり、以下手順でURLを取得できます。
「Settings」>「Configurations」>「API keys」に移動します。
右上の「Copy API URL」が取得できるのでこれをコピーしておきます。

参考(公式ドキュメント)

Prisma CloudのAPI URLはリージョンごとにわかれていましたが、Cortex CloudのAPI URLは契約しているお客様事に異なっていて、そこはPrisma Cloudとの違いだなと思いました。

APIキーの発行

APIのキーの発行を行います。
APIキー発行手順(公式ドキュメント)

  1. Settings > Configurations > Integrations > API Keysに移動します
  2. 右上の「New Key」を押下します
  3. セキュリティレベル項目を選択します。
    今回は「Standard」を選択しました。
  4. Roleを選択します。
    今回は「Instance Administrator」を選択しました。
  5. Commentは任意の文字を入れてください。
  6. Enable Expiration DateはいつまでにこのAPI keyが使用できなくなるかの期限を設定できます。
  7. 各設定が完了したら「Generate」を押下して、その時のAPI Key IDをコピーしておきます。

作成が完了するとAPI Keyの一覧に追加されていると思います。
API keysテーブルの作成した行の「ID」列の値もコピーしておきます。

セキュリティレベルは2種類あり、StandardとAdvancedがあります。

セキュリティレベル 説明
Standard APIキーをそのまま使用できます。
Curlのリクエストに適しています。
Advanced nonceとタイムスタンプを使用してハッシュ化する必要があります。
独自のスクリプトに適しており、リプレイ攻撃を防ぐことが目的です。

Prisma Cloudと違い、セキュリティレベルの設定があるところが、Cortex CloudとPrisma Cloudの違いかなと思いました。
また、Prisma Cloudでは一時的なAPIキーを発行して、そのAPIキーでREST APIを利用していましたが、APIキーを発行するREST APIが消えてそのままリクエストできるように変更されていました。

実際にAPIを使用してみた

取得したAPI URLと、APIキーを利用して、実際にAPIを利用してみます。
今回は接続しているプロバイダー(インスタンス)情報を取得するAPIとPythonのrequestsライブラリを使用して実際にプログラムを作成し、インスタンス情報を取得します。

事前に必要な値

現在コピーしているのが以下3つです。
・API URL
・API key ID
・APIkeyテーブルの「ID」列の値

コードの作成

api_key_idの変数にはAPIkeyテーブルの「ID」列の値を入れます。
api_keyの変数にはAPI key IDを入力します。
※API key関連は*でマスクしています。
urlには「https://api-{fqdn}」を先ほどコピーしたAPI URLに置き換えます。

api_key_id = "*"
api_key = "***************************"
url = "https://api-{fqdn}/public_api/v1/cloud_onboarding/get_instances"

ペイロードを作成します。
今回はGCPのインスタンス情報を取得するのでFilterのSEARCH_VALUEをGCPに変更しています。

payload = {
    "request_data" : {
        "filter_data" : {
        "sort" : [ {
            "FIELD" : "STATUS",
            "ORDER" : "DESC"
        } ],
        "paging" : {
            "from" : 0,
            "to" : 50
        },
        "filter" : {
            "AND" : [ {
            "SEARCH_FIELD" : "CLOUD_PROVIDER",
            "SEARCH_TYPE" : "EQ",
            "SEARCH_VALUE" : "GCP"
            } ]
        }
        }
    }

ヘッダーは以下の様に作成しました。
x-xdr-auth-idには先ほど作成したAPIkeyテーブルの「ID」列の値を格納した変数を入力します。
Authorizationには先ほど作成したAPI key IDを格納した変数を入力します。

headers = {
    'Content-Type': "application/json",
    "x-xdr-auth-id": str(api_key_id),
    "Authorization": api_key
}

最後にリクエストし、返ってきた値を標準出力します。

response = requests.post(url, json=payload, headers=headers)

print(response.text)

コードの全体像

コードの全体像は以下の通りです。

import requests

api_key_id = "5"
api_key = "*************************************"
url = "https://api-<company>.paloaltonetworks.com/public_api/v1/cloud_onboarding/get_instances"
payload = {
    "request_data" : {
        "filter_data" : {
        "sort" : [ {
            "FIELD" : "STATUS",
            "ORDER" : "DESC"
        } ],
        "paging" : {
            "from" : 0,
            "to" : 50
        },
        "filter" : {
            "AND" : [ {
            "SEARCH_FIELD" : "CLOUD_PROVIDER",
            "SEARCH_TYPE" : "EQ",
            "SEARCH_VALUE" : "GCP"
            } ]
        }
        }
    }
}

headers = {
    'Content-Type': "application/json",
    "x-xdr-auth-id": str(api_key_id),
    "Authorization": api_key
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)

実行結果

返ってきた値は以下です。
GCPインスタンス情報が確認できます。
載せられない情報は*でマスクしています。

{
    "reply": {
        "DATA": [
            {
                "instance_id": "**********************",
                "cloud_provider": "GCP",
                "instance_name": "**********************",
                "account_name": "**********************",
                "accounts": 1,
                "scope": "ACCOUNT",
                "scan_mode": "MANAGED",
                "creation_time": 1748334058291,
                "custom_resources_tags": "[{\"key\": \"managed_by\", \"value\": \"paloaltonetworks\"}]",
                "provisioning_method": "TF",
                "additional_capabilities": "{\"xsiam_analytics\": true, \"registry_scanning\": true, \"serverless_scanning\": true, \"registry_scanning_options\": {\"type\": \"ALL\"}, \"data_security_posture_management\": false}",
                "is_pending_changes": 0,
                "status": "WARNING",
                "outpost_id": "**********************"
            },
            {
                "instance_id": "**********************",
                "cloud_provider": "GCP",
                "instance_name": "",
                "account_name": null,
                "accounts": null,
                "scope": "ACCOUNT",
                "scan_mode": "MANAGED",
                "creation_time": 1748333605143,
                "custom_resources_tags": "[{\"key\": \"managed_by\", \"value\": \"paloaltonetworks\"}]",
                "provisioning_method": null,
                "additional_capabilities": "{\"xsiam_analytics\": true, \"registry_scanning\": true, \"serverless_scanning\": true, \"registry_scanning_options\": {\"type\": \"ALL\"}, \"data_security_posture_management\": false}",
                "is_pending_changes": null,
                "status": "PENDING",
                "outpost_id": "**********************"
            }
        ],
        "FILTER_COUNT": 2,
        "TOTAL_COUNT": 13
    }
}

さいごに

実際に触ってみるとPrisma CloudとAPIキーの発行や使用方法が少し変わっていました。

APIの数が多くないので、一般提供時にはもっと数が増えていそうです。
2025年度第3四半期後半に一般提供される予定ということで、楽しみです。

当社では、複数クラウド環境の設定状況を自動でチェックし、設定ミスやコンプライアンス違反、異常行動などのリスクを診断するCSPMソリューションを販売しております。

マルチクラウド設定診断サービス with CSPM| SCSK株式会社

ご興味のある方は是非、お気軽にお問い合わせください。

タイトルとURLをコピーしました