Cisco ASA で CLI over HTTPS を使ってみる

# はじめに
この記事は、Cisco Systems Japan Advent Calendar 2021 1枚目 の 20日目として投稿しています。
相変わらず毎年密かに盛り上がっております。

2017年版: https://qiita.com/advent-calendar/2017/cisco
2018年版: https://qiita.com/advent-calendar/2018/cisco
2019年版: https://qiita.com/advent-calendar/2019/cisco
2020年度版1枚め:  https://qiita.com/advent-calendar/2020/cisco
2020年度版2枚め:  https://qiita.com/advent-calendar/2020/cisco2
2021年度版1枚め:  https://qiita.com/advent-calendar/2021/cisco  <-- この記事はこちら
2021年度版2枚め:  https://qiita.com/advent-calendar/2021/cisco2

# Cisco ASA での REST API 利用

Cisco Firepower 1000/2000/4000/9000 シリーズは、次世代 Firewall / IPS である Firewall Threat Defense (通称 FTD, 旧称 Firepower Threat Defense) のソフトウェアだけでなく、ベーシック　Firewall 兼 VPN 終端装置である Cisco ASA　のソフトウェアを動作させることもできます。
ASA ソフトウェアは、非常に長きに渡って市場で使われており、専用 GUI (無償の ASDM や有償 の CDO, CSM 等) だけでなく、Cisco IOS ライクな CLI での設定や管理が可能なことも人気の原因の1つです。
さらには、REST API もサポートされており、外部からプログラムやスクリプトを使って ASA の設定や管理を実施している例も非常に多くあります。

# ASA が動く新しいハードウェアモデルでの REST API 未サポート問題

ですが…その REST API が使える機種を以下の最新のコンパチビリティガイドで調べてみると、なんと、新しい Firepower 1000 & 2000 シリーズや、Firepower 4000　シリーズの 2世代目となった Firepower 4112/15/25/45 では未サポートとなっております。

https://www.cisco.com/c/en/us/td/docs/security/asa/compatibility/asamatrx.html#id_65991

ASA の REST API agent は古い Java ベースのアプリケーションを利用しており、新しいモデルにはこの agent を入れていないため、このような制限が出てきているようです。

# ASA での CLI over HTTPS について

「REST API が駄目ならコマンドを直接 ASA に送り込んでしまえばいいじゃないか。どうせ ASDM も HTTPS で ASA に繋いでコマンドを実施しているんだし」と思った方 (いるのか?)、正解です。
まさに ASDM が ASA を設定・管理する仕組みを直接 ASDM を使わずに curl コマンド等で https を使って ASA のコマンドを直接叩いてしまう方法が CLI over HTTPS です。
この仕組みは、意外とドキュメントが公開されておらず、あまり知られていない ASA の設定・管理方法の1つです。

command option1 option2

というコマンドを実施したければ、

`https://ASAのIPアドレス/admin/exec/command+option1+option2`

と、コマンドと引数を + (プラス) でつなげて https で ASA に向けてリクエストすることで実現できます。

command1 option1
 command2 option2

といったように階層が変わる場合には、

`https://ASAのIPアドレス/admin/exec/command1+option1/command2+option2`

のように / (スラッシュ) で区切れば OK です。

# ASA で CLI over HTTPS を使ってみよう

## 初期準備と show コマンド

実際に使ってみるためには、まずは ASA で ASDM アクセスを許可してください。初期設定時のセットアップモードで ASDM アクセスを特定のネットワークから許可してもいいですし、工場出荷状態や ASA アプリケーション初期インストール時のデフォルトのコンフィグでは、Management ポートに ASDM アクセスが可能になっています。もちろん、完全初期化後に、特定インターフェイスに IP アドレスを付与し、そこに ASDM でアクセスできるように設定しても構いません。

Linux や MacOS ではもちろん、最近は Windows 10 でもデフォルトで curl コマンドが使えるようなので、まずは curl コマンドで ASA にアクセスできるかどうかを試してみましょう。

注意点として、ASDM 利用時に認証を実施している際には、curl での接続毎に　-u オプションを使ってユーザ名とパスワードを指定する必要があります。また、-A オプションを使ってユーザエージェントが ASDM であることを宣言する必要があります。

ASDM アクセス可能で、ユーザ名が cisco、パスワードが Admin123、IP アドレスが 10.71.153.54 の ASA (今回は ASAv を使用) に、MacOS から curl でアクセスし、show version の結果を得てみましょう。証明書のエラーは無視するために、-k オプションも使っています。

```
TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+version

Cisco Adaptive Security Appliance Software Version 9.16(1) 
SSP Operating System Version 2.10(1.159)
Device Manager Version 7.16(1)

Compiled on Thu 20-May-21 17:26 GMT by builders
System image file is "disk0:/asa9-16-1-smp-k8.bin"
Config file at boot was "startup-config"

asav-tatskoba-1 up 68 days 21 hours

Hardware:   ASAv, 2048 MB RAM, CPU Xeon 5600 series 2666 MHz,
Internal ATA Compact Flash, 1024MB
Slot 1: ATA Compact Flash, 8192MB
BIOS Flash Firmware Hub @ 0x0, 0KB


 0: Ext: Management0/0       : address is 000c.2931.a53e, irq 10
 1: Ext: GigabitEthernet0/0  : address is 000c.2931.a548, irq 7
 2: Ext: GigabitEthernet0/1  : address is 000c.2931.a552, irq 9
 3: Ext: GigabitEthernet0/2  : address is 000c.2931.a55c, irq 11
 4: Ext: GigabitEthernet0/3  : address is 000c.2931.a566, irq 10
 5: Ext: GigabitEthernet0/4  : address is 000c.2931.a570, irq 7
 6: Ext: GigabitEthernet0/5  : address is 000c.2931.a57a, irq 9
 7: Ext: GigabitEthernet0/6  : address is 000c.2931.a584, irq 11
 8: Ext: GigabitEthernet0/7  : address is 000c.2931.a58e, irq 10
 9: Ext: GigabitEthernet0/8  : address is 000c.2931.a598, irq 7
10: Int: Internal-Data0/0    : address is 0000.0100.0001, irq 0

License mode: Smart Licensing
ASAv Platform License State: Licensed
Active entitlement: ASAv-STD-1G, enforce mode: Authorized
Firewall throughput limited to 1 Gbps

Licensed features for this platform:
Maximum VLANs                     : 50             
Inside Hosts                      : Unlimited      
Failover                          : Active/Standby 
Encryption-DES                    : Enabled        
Encryption-3DES-AES               : Enabled        
Security Contexts                 : 0              
Carrier                           : Enabled        
AnyConnect Premium Peers          : 250            
AnyConnect Essentials             : Disabled       
Other VPN Peers                   : 250            
Total VPN Peers                   : 250            
AnyConnect for Mobile             : Enabled        
AnyConnect for Cisco VPN Phone    : Enabled        
Advanced Endpoint Assessment      : Enabled        
Shared License                    : Disabled       
Total TLS Proxy Sessions          : 500            
Botnet Traffic Filter             : Enabled        
Cluster                           : Disabled       

Serial Number: 9AS9Q3UHSP5

Image type          : Release
Key version         : A

Configuration last modified by admin at 15:57:05.096 JST Mon Nov 22 2021
```

無事に show version の結果を取得することができました。

## object 作成

show コマンドだけでなく、実際の設定を入れることはできるのでしょうか。
試してみましょう。ASA のコンソール CLI で確認すると、現時点で TEST-OBJECT-1 というネットワークオブジェクトが以下のように設定されています。

```
asav-tatskoba-1# show run object
object network TEST-OBJECT-1
 subnet 192.168.1.0 255.255.255.0
```

この状態で curl で既存のオブジェクトを確認し、その後、TEST-OBJECT-2 というネットワークオブジェクトを作成し、中身を 192.168.2.0/24 で設定してみましょう。

```
TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+run+object
object network TEST-OBJECT-1
 subnet 192.168.1.0 255.255.255.0

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/object+network+TEST-OBJECT-2/subnet+192.168.2.0+255.255.255.0
TATSKOBA-M-W597:~ tatskoba$  <-- 設定変更が成功した場合は echo back なし

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+run+object
object network TEST-OBJECT-1
 subnet 192.168.1.0 255.255.255.0
object network TEST-OBJECT-2
 subnet 192.168.2.0 255.255.255.0
```

どうやら無事に TEST-OBJECT-2 が作られたようです。コンソール CLI で試しても同様の結果を得ることができました。

```
asav-tatskoba-1# show run object
object network TEST-OBJECT-1
 subnet 192.168.1.0 255.255.255.0
object network TEST-OBJECT-2
 subnet 192.168.2.0 255.255.255.0
```

## ACL 書き換え

通常の CLI と同様に ACL の中身の書き換えも、line オプションを使って実現できます。

```
TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+run+access-list+TEST-ACL-1
access-list TEST-ACL-1 extended permit ip any object TEST-OBJECT-1 
access-list TEST-ACL-1 extended permit ip any object TEST-OBJECT-2 

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+access-list+TEST-ACL-1
access-list TEST-ACL-1; 2 elements; name hash: 0xe11bb924
access-list TEST-ACL-1 line 1 extended permit ip any object TEST-OBJECT-1 (hitcnt=0) 0x287bc82e 
  access-list TEST-ACL-1 line 1 extended permit ip any 192.168.1.0 255.255.255.0 (hitcnt=0) 0x287bc82e 
access-list TEST-ACL-1 line 2 extended permit ip any object TEST-OBJECT-2 (hitcnt=0) 0x7eadb91a 
  access-list TEST-ACL-1 line 2 extended permit ip any 192.168.2.0 255.255.255.0 (hitcnt=0) 0x7eadb91a 

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/no+access-list+TEST-ACL-1+extended+permit+ip+any+object+TEST-OBJECT-1
TATSKOBA-M-W597:~ tatskoba$  <-- 設定変更が成功した場合は echo back なし

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+run+access-list+TEST-ACL-1
access-list TEST-ACL-1 extended permit ip any object TEST-OBJECT-2  <-- TEST-OBJECT-1 の行が削除されている

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+access-list+TEST-ACL-1
access-list TEST-ACL-1; 1 elements; name hash: 0xe11bb924　　　<-- TEST-OBJECT-1 の行が削除されている
access-list TEST-ACL-1 line 1 extended permit ip any object TEST-OBJECT-2 (hitcnt=0) 0x7eadb91a 
  access-list TEST-ACL-1 line 1 extended permit ip any 192.168.2.0 255.255.255.0 (hitcnt=0) 0x7eadb91a 

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/access-list+TEST-ACL-1+line+1++extended+permit+ip+any+object+TEST-OBJECT-3
TATSKOBA-M-W597:~ tatskoba$  <-- 設定変更が成功した場合は echo back なし

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+run+access-list+TEST-ACL-1
access-list TEST-ACL-1 extended permit ip any object TEST-OBJECT-3 　　<-- TEST-OBJECT-３ の行が先頭 (Line 1) に追加されている
access-list TEST-ACL-1 extended permit ip any object TEST-OBJECT-2 

TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+access-list+TEST-ACL-1
access-list TEST-ACL-1; 2 elements; name hash: 0xe11bb924　　　<-- TEST-OBJECT-３ の行が先頭 (Line 1) に追加されている
access-list TEST-ACL-1 line 1 extended permit ip any object TEST-OBJECT-3 (hitcnt=0) 0x8ee6b583 
  access-list TEST-ACL-1 line 1 extended permit ip any 192.168.3.0 255.255.255.0 (hitcnt=0) 0x8ee6b583 
access-list TEST-ACL-1 line 2 extended permit ip any object TEST-OBJECT-2 (hitcnt=0) 0x7eadb91a 
  access-list TEST-ACL-1 line 2 extended permit ip any 192.168.2.0 255.255.255.0 (hitcnt=0) 0x7eadb91a 
```

## CLI over HTTP の間違った例

-A で user agent を ASDM と宣言しないと以下のようにレスポンスコード 400 の Bad Request が帰ってきます。

```
TATSKOBA-M-W597:~ tatskoba$ curl -k -u cisco:Admin123 https://10.71.153.54/admin/exec/show+version
<H1>400 Bad Request</H1>
```

証明書を正しく ASA にインストールせずに仮環境で管理している場合、-k オプションを使わないと、証明書エラーが帰ってきてしまいます。

```
TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -u cisco:Admin123 https://10.71.153.54/admin/exec/show+version
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
```

-u でユーザ名とパスワードを入れないと、認証が必要な旨のエラーが帰ってきます。
毎回必要なのでご注意ください。

```
TATSKOBA-M-W597:~ tatskoba$ curl -A ASDM -k https://10.71.153.54/admin/exec/show+version
<HEAD><TITLE>Authorization Required</TITLE></HEAD><BODY><H1>Authorization Required</H1>Browser not authentication-capable or authentication failed.</BODY>
```

# まとめ

REST API が使えないモデルでも、外部からプログラムやスクリプトを使って　CLI over HTTPS で ASA ソフトウェアの設定・管理を行うことが可能です。curl コマンドを筆頭に、簡単に試すことができるので、是非一度トライしてみてください。

# 免責事項

本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本Webサイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。