Zscaler Internet Access の Internal API（仮称）を触ってみる（紹介編）

# 1. はじめに

みなさん、こんにちわ。ゼットスケーラーの大谷です。カスタマーサクセスマネージャを担当しています。

この記事は[Zscaler Advent Calendar 2024](https://qiita.com/advent-calendar/2024/zscaler)向けの記事です。

https://qiita.com/advent-calendar/2024/zscaler

この記事では Zscaler Intenet Access（ZIA）の Intenal API（仮称）について書いています。

# 2. Zscaler の公開 API について

Zscaler Internet Access（以下 ZIA）を始めとして、Zscaler では各サービスにおいて公開 API を提供しています。

**Zscaler の主なサービスの API**

- [ZIA API](https://help.zscaler.com/zia/getting-started-zia-api)
- [ZPA API](https://help.zscaler.com/zpa/understanding-zpa-api)
- [ZDX API](https://help.zscaler.com/zdx/understanding-zdx-api)

# 3. Internal API（仮称）とは？

Internal API（仮称）とは簡単にいうとブラウザによる ZIA Admin Portal へのアクセスの動きをプログラムで擬似的に操作することができるインターフェースです。

これがなぜ可能かを説明するために、ブラウザでの ZIA Admin Portal へのアクセスとレスポンスがどのようになっているか見てみましょう。

例としてテナントに関する基本的な情報を提供するCompany Profileにアクセスしてみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622818/2279feab-650d-dbe3-8e83-cb7002a188ff.png" width=50%>

Company Profile へのアクセス URL は *https*://admin.cloud name.net/zsapi/v1/orgInformationです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622818/b48925bd-fd5e-6378-9519-f17161c2e1d3.png)

そのレスポンスを見てみましょう。ZIA Admin Portal へのアクセスが一定の形式（JSON）で返ってきていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622818/eb1c80df-085e-a632-ca50-11e4be4d3983.png)

この仕組みを利用して、プログラムから Admin Portal へ擬似的にアクセスして、そのレスポンスを受け取ってからまた別の処理に、というような自動化が可能です。ブラウザでアクセスするよりも軽量に、かつ公開 API ではサポートされていない機能についても操作することが可能です。

# 5. 注意

- Zscaler では一部の社内向けのツールでこの機能を利用していますが、社外向けには公式にサポートしていません。
- 実際に「Internal API」という名称も存在しません。この場で便宜的に付けた仮称です。
- APIリファレンスも存在しませんので、どのように動くのかという情報はありません。現状の動くままに利用する必要があります。
- 将来的に突然利用できなくなることがあります。
- 大量にアクセスしようとすると Zscaler のセキュリティ対策によってアクセスが制限されることがあります。

# 4. 実際にやってみる

実際にやってみましょう。先ほどの Company Profile を Python で取得します。まずはログイン認証が必要なのですが、ここでは省略します。次回以降で説明します。


```python
import requests
import time
import json

# リクエストで送信するヘッダー（ブラウザでのアクセスと同じものを適当に設定）
headers = {
    'Accept': '*/*',
    'Accept-Language': 'ja',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Content-Type': 'application/json;charset=UTF-8',
    'Origin': 'https://admin.zscalerthree.net',
    'Pragma': 'no-cache',
    'Referer': 'https://admin.zscalerthree.net/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Chromium";v="128", "Not;A=Brand";v="24", "Google Chrome";v="128"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"'
}

（このあとに Admin Portal へのログイン認証が必要なのですが、ここでは省略します。）

# Company Profile の URL
company_profile_url = "https://admin.zscalerthree.net/zsapi/v1/orgInformation"

# Company Profile にアクセス
company_profile_response = requests.get(company_profile_url, headers=headers, cookies=cookies)

# レスポンスを出力
print(company_profile_response.text)
```

スクリプトを実行するとブラウザでアクセスしてきたものと同じものが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622818/4327bc3f-0642-1e24-d514-3df207c8cbdb.png" width=50%>

# 5. 最後に

次回は（時間があれば）もう少し詳しく書きたいと思います。