Cisco ASAv 9.16 / REST API 7.16 に curl / REST API でアクセスする
以前に Cisco ASAv に REST API でアクセスするには というメモを書きました。 現在は ASA 側で仕様が変更されたのか、User-Agent
に ASDM
という文字列を指定しないと REST API が実行出来ないようです。 その為、内容自体はほぼ変わりませんが、若干内容をアップデートしたメモを残しておきます。 ASA のバージョンは 9.16(2) を、REST API エージェントのバージョンは 7.16.1.75 を利用しました。
REST API エージェントのコピー
Secure Firewall ASA Virtual は仮想版 ASA 関連のページですが、ここから REST API エージェントをダウンロードしておきます。 これを Web サーバなどへアップロードし、それを ASA へ保存しておきます。
| copy http://10.0.0.1/cisco/asa/asa-restapi-7161-lfbff-k8.SPA disk0:
|
ASA の設定
ASA 側には以下のような設定を行っておきます。 この例では REST API でのアクセスを Management0/0 で受信する想定にしています (IP アドレスやルーティングなどの基本設定は完了している想定です)。
1
2
3
4
5
6
7
8
9
10
11
12
13 | interface Management0/0
management-only
nameif management
security-level 100
!
http server enable
http 0.0.0.0 0.0.0.0 management
aaa authentication http console LOCAL
!
rest-api image disk0:/asa-restapi-7161-lfbff-k8.SPA
rest-api agent
!
end
|
curl による REST API アクセス
curl から ASA の REST API へアクセスしてみます。 ですが、オプションが十分で無い場合は以下のように「400 Bad Request
」エラーになってしまいます。
| $ curl -k -s \
-X GET https://10.0.0.99:443/api/monitoring/device/components/version \
-H "Accept:application/json" -u "admin:password"
<H1>400 Bad Request</H1>
|
これは UserAgent (curl だと -A
オプション) を ASDM
と指定することで解消します。
| $ curl -A ASDM -k -s \
-X GET https://10.0.0.99:443/api/monitoring/device/components/version \
-H "Accept:application/json" -u "admin:password"
<H1>400 Bad Request</H1>
|
実際の実行例は以下の通りです。 python3 -m json.tool
を指定し、結果表示される JSON を整形しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | $ curl -A ASDM -k -s \
-X GET https://10.0.0.99:443/api/monitoring/device/components/version \
-H "Accept:application/json" -u "admin:password" \
| python3 -m json.tool
{
"kind": "object#Version",
"selfLink": "/api/monitoring/device/version",
"upTimeinSeconds": 4140,
"currentTimeinSeconds": 1655809214,
"asaVersion": "9.16(2)",
"totalFlashinMB": 8192,
"firewallMode": "Router",
"deviceType": "ASAv"
}
|
Python による REST API アクセス
Python で REST API アクセスするサンプルは以下の通りです。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | #!/usr/bin/env python3
import json
import requests
import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)
headers = {"Content-Type": "application/json", "User-Agent": "ASDM"}
request = requests.get(
"https://10.0.0.99/api/monitoring/device/components/version",
auth=("admin", "password"),
verify=False,
headers=headers,
)
response = json.loads(request.text)
print(json.dumps(response, indent=4, sort_keys=True))
|
実際の実行例は以下の通りです。
| # ./asa-rest-api-sample.py
{
"asaVersion": "9.16(2)",
"currentTimeinSeconds": 1655810322,
"deviceType": "ASAv",
"firewallMode": "Router",
"kind": "object#Version",
"selfLink": "/api/monitoring/device/version",
"totalFlashinMB": 8192,
"upTimeinSeconds": 5280
}
|