はじめに
今回は「Prisma Cloud の API を呼び出してみた」の第二弾です。
1回目はこちらで、APIでアラート件数を取得する方法を記載しています。
Prisma Cloudのアクセスキーについて解説後、最後に使用した日付が1か月前以上のアクセスキー一覧を取得するツールをPythonを使用して作成します。
アクセスキーの解説後、実際に作成したアクセスキーを使用して、最後に使用した日付が1ヵ月以上前のアクセスキー一覧を出力するツールをPythonで作成します。
このツールを使用することで1か月以上前のアクセスキー一覧がすぐに確認できるので、Prisma Cloudコンソールに行く手間などを省くことができます。
アクセスキーとは
Prisma Cloud APIにアクセスするための認証情報で、サードパーティとの結合にも使用できます。
アクセスキーIDとシークレットキーのペアで構成され、有効期限を設定可能です。
特定のロールに関連付けすることもできます。
また、アクセスキーに関連付けられたロールが削除されるとアクセスキーも削除されます。
アクセスキーの確認方法
- Prisma Cloud コンソールにアクセスします。
- 右上「Settings」>左ペイン「Access Control」>「Access Keys」に遷移します。
- 遷移後、各アクセスキーの権限情報が確認できます。
アクセスキー作成方法
- Prisma Cloud コンソールにアクセスします。
- 「Settings」>「Access Control」>「Access Keys」に遷移します。
- 以下画像に遷移します(アクセスキーの確認方法と同様)
- 右上の「Add」>「Access Key」から作成することができます。
※アクセスキーはログインに使用したロールに基づいて「Role」と「Permission Group」が紐づけられ作成されます。
参考: アクセスキーの作成と管理
今回は有効期限ありで作成します。ラベル 入力フィールド Name 任意の名前 Enable Expiration ONにすると有効期限を設定することができます - 「Save」を押下後、アクセスキーを作成することができます。
SecretAccessKeyは以下画像の画面でしかダウンロード、値のコピーを行うことができないので、今ダウンロードなどを行います。
ダウンロード後、「Done」を押下します。
- 「アクセスキー作成方法」と同じ手順で画面を遷移し、作成した名前と同じアクセスキーがあることを確認します
Prisma Cloud APIを使用してアクセスキー一覧を取得するツールの作成
次は先ほど発行したアクセスキーとPrisma Cloud APIを使用して、アクセスキー一覧を取得できるツールを作成していきます。
1ヵ月使用していないアクセスキーの名前と最後にアクセスキーを使用したUnix時間を出力できるようにします。
ライブラリのインポート
今回使用するライブラリ群をインポートします。
import requests import json import time from time import sleep from datetime import datetime, timezone, timedelta
Prisma Cloud APIに必要なトークンの発行
Prisma CloudのAPIに必要なトークンを発行する関数を作成します。
ここで発行したアクセスキーとシークレットキーを使用します。
変数名usernameがアクセスキーで、変数名passwordがシークレットキーになっています。
def get_token(): # 発行したアクセスキーを書く username = "12345" password = "12345" # https://pan.dev/prisma-cloud/api/cspm/app-login/ url = "https://api.anz.prismacloud.io/login" # リクエストパラメータ(username,password)の編集 payload = '{\"username\":\"' + username + \ '\",\"password\":\"' + password + '\"}' headers = { "Accept": "application/json; charset=UTF-8", "Content-Type": "application/json; charset=UTF-8" } wasResponseError = False # APIリクエスト実行 while True: # https://prisma.pan.dev/api/cloud/cspm/login#operation/app-login response = requests.request("POST", url, data=payload, headers=headers) # リクエスト実行結果の判定 if response.status_code == 200: token = json.loads(response.text)['token'] wasResponseError = False break else: print(f"You couldn't be authenticated [status_code:{response.status_code}]") # APIのベストプラクティス if wasResponseError: exit() else: sleep(32) wasResponseError = True return token
Prisma Cloud APIを使用してアクセスキー一覧を取得
発行したトークンを使用してアクセスキー一覧を取得する関数を作成します。
こちらの関数はPrisma Cloud の発行されているアクセスキー一覧を取得する関数になります。
def get_accesskeys(token): url = "https://api.anz.prismacloud.io/access_keys" payload = {} headers = { "Content-Type": "application/json; charset=UTF-8", "x-redlock-auth": token } wasResponseError = False # APIリクエスト実行 while True: response = requests.request("GET", url, headers=headers, data=payload) if response.status_code == 200: access_key_data = json.loads(response.text) wasResponseError = False break else: print(f"Bad Request[status_code:{response.status_code}]") if wasResponseError: exit() else: sleep(32) wasResponseError = True return access_key_data
1ヵ月前のUnix時間を算出する処理の作成
1か月前のUnix時間を算出する必要があるので1ヵ月以上前のUnix時間を算出する関数を作成します。
def get_one_month_ago_unix_time(): # 現在の日付を取得 current_time = datetime.now() # 1か月前の日時を取得 one_month_ago = current_time - timedelta(days=30) # 1か月前のDatetimeオブジェクトをUnix時間に変換 one_month_ago_unix_time = int(time.mktime(one_month_ago.timetuple())) * 1000 return one_month_ago_unix_time
Unix時間を日本時間に変換する処理の作成
Unix時間を日本時間に変換する関数を作成します。
def convert_unix_millis_to_jst(unix_millis): # ミリ秒を秒に変換 unix_seconds = unix_millis / 1000.0 # Unix時間をUTCのdatetimeオブジェクトに変換 utc_time = datetime.fromtimestamp(unix_seconds, tz=timezone.utc) # 日本標準時(JST、UTC+9)に変換 jst_time = utc_time.astimezone(timezone(timedelta(hours=9))) return jst_time
アクセスキー一覧を出力する処理の作成
アクセスキー一覧を出力する関数を作成します。
def print_list_accesskeys(access_key_data, one_month_ago_unix_time, jst_time): print("=== 長期間使用されていないアクセスキー一覧 ===") for data in access_key_data: # 最後に使用した時間が1ヵ月以上前だった場合 if data['lastUsedTime'] < one_month_ago_unix_time: print(f"AccessKey Name: {data['name']}, Last Used: {jst_time.strftime('%Y-%m-%d')}")
main関数の作成とエントリーポイントの作成
最後に1~6までに作成した関数を使用したmain関数とエントリーポイントを作成します。
def main(): # トークンを取得 token = get_token() # アクセスキー一覧を取得する(JSON形式) access_key_data = get_accesskeys(token) #1ヵ月前のUnixTime時間を取得 one_month_ago_unix_time = get_one_month_ago_unix_time() # UnixTime時間から日本時間に変換 jst_time = convert_unix_millis_to_jst(one_month_ago_unix_time) # アクセスキー一覧を出力する print_list_accesskeys(access_key_data, one_month_ago_unix_time, jst_time) if __name__ == "__main__": main()
プログラム実行結果
プログラムを実行すると以下の様に出力されます。
※name-accesskeysは実際にはPrisma Cloudコンソールのアクセスキー欄と同じ名前が出力されています。
=== 長期間使用されていないアクセスキー一覧 ===
AccessKey Name: name-accesskeys, Last Used: 2025-03-24
AccessKey Name: name-accesskeys, Last Used: 2025-03-24
AccessKey Name: name-accesskeys, Last Used: 2025-03-24
AccessKey Name: name-accesskeys, Last Used: 2025-03-24
AccessKey Name: name-accesskeys, Last Used: 2025-03-24
AccessKey Name: name-accesskeys, Last Used: 2025-03-24
プログラムの全体像
import requests import json import time from time import sleep from datetime import datetime, timezone, timedelta # PrismaCloudのAPIに必要なトークンを発行する def get_token(): # 発行したアクセスキーを書く(ハードコードは良くないためconfigファイル等に格納するのがベスト) username = "891a8cef-82df-434d-8b2a-e2f4145aa4b4" password = "ZJMp9W8xabxNZrwcC330kG3rTPg=" url = "https://api.anz.prismacloud.io/login" # リクエストパラメータ(username,password)の編集 payload = '{\"username\":\"' + username + \ '\",\"password\":\"' + password + '\"}' headers = { "Accept": "application/json; charset=UTF-8", "Content-Type": "application/json; charset=UTF-8" } wasResponseError = False # リクエスト実行(POST / login APIを使用してJWTをを取得) while True: # https://prisma.pan.dev/api/cloud/cspm/login#operation/app-login response = requests.request("POST", url, data=payload, headers=headers) # リクエスト実行結果の判定 if response.status_code == 200: token = json.loads(response.text)['token'] wasResponseError = False break else: print(f"You couldn't be authenticated [status_code:{response.status_code}]") # APIのベストプラクティス if wasResponseError: exit() else: sleep(32) wasResponseError = True return token # アクセスキー一覧を返すAPIを叩く def get_accesskeys(token): url = "https://api.anz.prismacloud.io/access_keys" payload = {} headers = { "Content-Type": "application/json; charset=UTF-8", "x-redlock-auth": token } wasResponseError = False while True: response = requests.request("GET", url, headers=headers, data=payload) if response.status_code == 200: access_key_data = json.loads(response.text) wasResponseError = False break else: print(f"Bad Request[status_code:{response.status_code}]") if wasResponseError: exit() else: sleep(32) wasResponseError = True return access_key_data # 一カ月前のUnix時間を返す def get_one_month_ago_unix_time(): # 現在の日付を取得 current_time = datetime.now() # 1か月前の日時を取得 one_month_ago = current_time - timedelta(days=30) # 1か月前のDatetimeオブジェクトをUnix時間に変換 one_month_ago_unix_time = int(time.mktime(one_month_ago.timetuple())) * 1000 return one_month_ago_unix_time # unixミリ秒を日本時間に変換 def convert_unix_millis_to_jst(unix_millis): # ミリ秒を秒に変換 unix_seconds = unix_millis / 1000.0 # Unix時間をUTCのdatetimeオブジェクトに変換 utc_time = datetime.fromtimestamp(unix_seconds, tz=timezone.utc) # 日本標準時(JST、UTC+9)に変換 jst_time = utc_time.astimezone(timezone(timedelta(hours=9))) return jst_time def print_list_accesskeys(access_key_data, one_month_ago_unix_time, jst_time): print("=== 長期間使用されていないアクセスキー一覧 ===") for data in access_key_data: # 最後に使用した時間が1ヵ月以上前だった場合 if data['lastUsedTime'] < one_month_ago_unix_time: print(f"AccessKey Name: {data['name']}, Last Used: {jst_time.strftime('%Y-%m-%d')}") def main(): # トークンを取得 token = get_token() # アクセスキー一覧を取得する(JSON形式) access_key_data = get_accesskeys(token) #1ヵ月前のUnixTime時間を取得 one_month_ago_unix_time = get_one_month_ago_unix_time() # UnixTime時間から日本時間に変換 jst_time = convert_unix_millis_to_jst(one_month_ago_unix_time) # アクセスキー一覧を出力する print_list_accesskeys(access_key_data, one_month_ago_unix_time, jst_time) if __name__ == "__main__": main()
さいごに
今回はアクセスキーの解説とアクセスキー一覧を出すAPIで簡単なツールを作成してみました。
当社では、複数クラウド環境の設定状況を自動でチェックし、設定ミスやコンプライアンス違反、異常行動などのリスクを診断するCSPMソリューションを販売しております。
マルチクラウド設定診断サービス with CSPM| SCSK株式会社
ご興味のある方は是非、お気軽にお問い合わせください。