Skip to content

Cisco ASAv 9.16 / REST API 7.16 に curl / REST API でアクセスする

以前に Cisco ASAv に REST API でアクセスするには というメモを書きました。 現在は ASA 側で仕様が変更されたのか、User-AgentASDM という文字列を指定しないと REST API が実行出来ないようです。 その為、内容自体はほぼ変わりませんが、若干内容をアップデートしたメモを残しておきます。 ASA のバージョンは 9.16(2) を、REST API エージェントのバージョンは 7.16.1.75 を利用しました。

REST API エージェントのコピー

Secure Firewall ASA Virtual は仮想版 ASA 関連のページですが、ここから REST API エージェントをダウンロードしておきます。 これを Web サーバなどへアップロードし、それを ASA へ保存しておきます。

1
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」エラーになってしまいます。

1
2
3
4
$ 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 と指定することで解消します。

1
2
3
4
$ 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))

実際の実行例は以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ./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
}