参考資料・時間
資料:
INE Network Security
勉強時間:
20260608 : 約2.5時間
20260609 : 約2時間
参考資料
学習内容
Catalyst Center(旧名:Cisco DNA Center)に対してAPIを用いて設定取得・変更を行う。
Catalyst CenterのAPIを利用するには、認証トークンの取得が必要となる。
設定取得を実施する場合、以下の流れになる。
⓵Catalyst Center から認証トークンを取得。(POST)
⓶取得したトークン情報をHTTPヘッダに付与してAPIを実行し情報の取得(GET)
設定変更・削除を行う場合、⓶で実行するHTTPメソッドがPOSTやPUT、DELETE等になる。
これらはPythonスクリプトを作成することで実施する。
Token取得
■ Catalyst Centerへのアクセス
プラットフォーム > 開発者用ツールキットから、
API一覧が閲覧可能。

https://sandboxdnac.cisco.com
Login with credentials [devnetuser/Cisco123!]
■ Catalyst CenterへのGUIログインページ
https://sandboxdnac.cisco.com/auth/login
POST https://sandboxdnac.cisco.com/dna/system/api/v1/auth/token
import requests
import base64
import json
# Token取得用のURI
URI = "https://sandboxdnac.cisco.com/dna/system/api/v1/auth/token"
# User/PWの指定
user = "devnetuser"
password = "Cisco123!"
token = ""
authorizationBase64 = ""
# Basic認証用にUser/PWのBase64エンコード
byte_string = (f"{user}:{password}").encode("ascii")
authorizationBase64 = base64.b64encode(byte_string).decode()
# ヘッダ情報の作成。"Basic"の後に半角スペース必須
headers = {
"content-type": "application/json",
"Authorization": "Basic " + authorizationBase64,
}
# headersのprint結果
# {
# 'content-type': 'application/json',
# 'Authorization': 'Basic ZGV2bmV0dXNlcjpDaXNjbzEyMyE='
# }
# Tokenのリクエスト。POSTで実行。
# 自己証明書を使用している場合は"verify=False"が必要(証明書を信頼していれば不要)
res = requests.request(
"POST",
URI,
headers=headers,
verify=False,
)
# res.txtはstr型なので、json.loadsでdict型に変換しTokenの値を取得
token = json.loads(res.text)["Token"]
# res.textのprint結果
# {
# "Token": "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY3RpdmVSRCI6IjliZjZiMjViMGM1ZTQwM2Q1MTc5ZmM5ZDQxZDViYWQ0ZjM4N2RjNDUiLCJhdWQiOiJDRE5BIiwiYXV0aFNvdXJjZSI6ImxlZ2FjeSIsImNsaWVudElkIjoiZGV2bmV0dXNlciIsImVtYWlsIjoianVhbkBjcm9zc2JyaWRnZS5jb20iLCJleHAiOjE3ODA5MzcwNTgsImZpcnN0TmFtZSI6ImRldm5ldHVzZXIiLCJpYXQiOjE3ODA5MzM0NTgsImlzcyI6ImRuYWMiLCJyZHMiOlsiOWJmNmIyNWIwYzVlNDAzZDUxNzlmYzlkNDFkNWJhZDRmMzg3ZGM0NSJdLCJyZXNvdXJjZUdyb3VwcyI6Ikg0c0lBQUFBQUFBQS80cXVWaW91U2c1S0xjNHZMVXBPOVV4UnNsTFNVdEpSS3Frc1NGV3lVaXJPTEVsVnFvMEZCQUFBLy8rY3ZYZktKUUFBQUE9PSIsInJvbGVzIjpbIk9CU0VSVkVSIl0sInNlc3Npb25JZCI6ImJlZjJiYzlhLWYxY2EtNTliNi04NjIxLTE5NDdiZDdjNzBiNyIsInN1YiI6IjY5Mzk5NTk5YmI1YTZiMDA1MDdhNzAxMCIsInRlbmFudElkIjoiNjdiOTM1YzU5MTU1ZjUwMDEzNTE1ZDFjIiwidGVuYW50TmFtZSI6IlROVDAiLCJ1c2VybmFtZSI6ImRldm5ldHVzZXIifQ.sfbvp4i_8eXCOC_AJrrwgcKSDEpOx0fX8zFlId2jzd1ej0-_kzVC8_cr3G5TTPiFXCWRWXpVieqYUmQIJCdaxA",
# "message": ""
# }
# 以下の方法でも取得可能
headers = {
"content-type": "application/json",
"Authorization": "Basic"
}
# authでuser, passwordを指定
res = requests.request(
"POST",
URI,
headers=headers,
auth = (user, password),
verify=False,
)
# ---------------------------------
# Headersを指定せず、request.postでPOSTを実施
res = requests.post(
url,
auth=(username, password),
verify=False
)
Catalyst Centerのノード情報取得
ノード取得ではトークン取得の場合とは異なるURIに対してAPIを実行する。
GET https://sandboxdnac.cisco.com/dna/intent/api/v1/nodes-config
# 前章の続き。tokenにトークンキーがある前提とする。
token = json.loads(res.text)["Token"]
# ノード情報取得用のURIを指定
nodeinfo_url = "https://sandboxdnac.cisco.com/dna/intent/api/v1/nodes-config"
# 認証トークンをHTTPヘッダーに設定
nodeinfo_headers = {"X-Auth-Token": token}
# リクエストを実行。Token取得時とは異なり、User/passwordは不要
nodeinfo_res = requests.request(
"GET",
nodeinfo_url,
headers=nodeinfo_headers,
verify=False,
)
#リクエストの実行結果
"""
{
"version": "2.0",
"response": {
"nodes": [
{
"ntp": {
"auth": false,
"keys": null,
"server_parms": null,
"servers": null
},
"network": [
{
"inet": {
"gateway": "10.10.20.254",
"host_ip": "10.10.20.85",
"host_secondary_ip": "",
"netmask": "255.255.255.0",
"routes": []
},
"inet6": {
"gateway": "",
"host_ip": "",
"host_secondary_ip": "",
"netmask": "",
"routes": null
},
"interface": "enterprise",
"intra_cluster_link": false,
"lacp_mode": false,
"lacp_supported": true,
"slave": [
"ens160"
]
},
{
"inet": {
"gateway": "",
"host_ip": "169.254.6.66",
"host_secondary_ip": "",
"netmask": "255.255.255.128",
"routes": []
},
"inet6": {
"gateway": "",
"host_ip": "",
"host_secondary_ip": "",
"netmask": "",
"routes": null
},
"interface": "cluster",
"intra_cluster_link": true,
"lacp_mode": false,
"lacp_supported": true,
"slave": [
"mks-icl"
]
}
],
"proxy": {
"http_proxy": "",
"https_proxy": "",
"https_proxy_clear_text_password": "",
"https_proxy_password": "",
"https_proxy_username": "",
"no_proxy": []
},
"platform": {
"product": "DN-SW-APL",
"provider": "VMware, Inc.",
"serial": "VMware-42 3f 1b cc 7f 4e e0 c1-2b 58 33 be 2b 9d 1e 90",
"uuid": "CC1B3F42-4E7F-C1E0-2B58-33BE2B9D1E90",
"vendor": "Cisco Systems Inc"
},
"id": "9b9cc1b6-2494-4a7e-98d1-248f49661628",
"name": "node-0"
}
]
}
}
"""
POSTMANでのAPI実行
Postmanにユーザ名載ってるせいで、うっかり本名晒しそうになった。ワハハ…
なんか人名みたいな文字列があったらこっそり教えてね。
Token取得
Catalyst Centerのプラットフォーム > 開発者用ツールキットから、Authentication APIを選択。
※記事冒頭の画像を参照。
URI↓をコピー
https://sandboxdnac.cisco.com/dna/system/api/v1/auth/token
1.Authorization欄で、「Auth Type」に Basicを選択。
username は「devnetuser」, Passwordは「Cisco123!」を入力
2.Headers欄で「Content-Type:Application/json」を入力。
3.[Send]を押下。
下画面にトークン情報が表示された。
このトークンをヘッダに格納してCatalyst Centerへリクエスト実行を行う。
認証Tokenを用いたリクエスト実行
以下を実行する。
Catalyst Centerの「Get Device list」参照
GET https://sandboxdnac.cisco.com/dna/intent/api/v1/network-device
1.認証Tokenをヘッダーに設定するため、前の手順で取得したTokenをコピー(""無し)
2.Headers欄に「x-auth-token:[トークン値]」を設定
3.[Send]を押下。
これにより、取得できた情報が下画面に表示される。


