Cisco ASA や FTD の Object Group Search で ACL を減らせるって本当ですか

# はじめに
この記事は、Cisco Systems Japan Advent Calendar 2022 1枚目 の 19日目として投稿しています。
毎年、コテコテの技術記事からふんわりした楽しい記事まで、みんなで好き勝手なことを書いて楽しく盛り上がっております。

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
2022年版: https://qiita.com/advent-calendar/2022/cisco <-- この記事はこちら

# ACL の最大数問題

「ACL 何行書けますか？」

Firewall の提案や設計をしていると、一度は聞いたことがある質問ではないでしょうか。
私は Cisco Secure Firewall の ASA (L4 までの Basic Fireall) や FTD (L7 対応の NGFW/IPS) という製品専任のプリセールスエンジニアなので、1兆回くらい聞いたことがある質問です(注1)。
"アクルナンギョウカケマスカ" という呪文にすら聞こえてきます(注2)。

実はこの質問に対する回答は簡単ではないのです。
メモリ容量に依存するから簡単ではない、というだけでなく、見た目の ACL (Access Control List) の行数と、Firewall 内部で保有する ACE (Access Control Entry) の数は異なるからであり、メモリ使用量はこの ACE の数で決まるからです。

ACE の数え方については、シスココミュニティの記事に細かく記載されています(注3)。

https://community.cisco.com/t5/-/-/ta-p/3375913

以降、ASA の CLI で実際に説明します。
以下の1行に見える ACL は、
```
ciscoasa# show run access-list
access-list ACL-1 extended permit object-group SVC-INBOUND-1 object-group NET-OUTSIDE-1 object-group NET-INSIDE-1 
```
実は各 Object Group に登録が複数あると、
```
ciscoasa# show object-group 
object-group service SVC-INBOUND-1
 service-object tcp destination eq www 
 service-object tcp destination eq https 
 (略) 
object-group network NET-OUTSIDE-1
 network-object host 172.16.0.1
 network-object host 172.16.0.3
 (略)
object-group network NET-INSIDE-1
 network-object host 192.168.1.1
 network-object host 192.168.1.3
 (略)
```
普通に access-group コマンドで　access-list を適用すると、ACE がその Object Group に登録されているエントリの掛け算になってしまいます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309674/41025bd9-2ceb-bd8c-4c4a-6cd9bfa1731d.png)

```
ciscoasa# show access-list | inc element
access-list ACL-1; 150000 elements; name hash: 0xd7d86ebc
```
こうなると ASA でのメモリ使用量も増え、ASA の機種によっては最大の ACE を超えてしまい、処理ができなくなってしまいます。
```
ciscoasa# show memory
Free memory:         355010312 bytes (17%)
Used memory:        1711106296 bytes (83%)
-------------     ------------------
Total memory:       2066116608 bytes (100%)

(略)
```
# Object Group Search を使ってみる

Object Group Search とは、ACE をメモリに展開する際に、Object Group の中身を展開せずに ACE を Object Group のまま保持する機能です。
ASA Version 8.3 にて新機能として導入された機能ですが、意外と知られていないことが多いです。
ちなみに、ASA Version 9.18 および FTD Version 7.２ 以降では、新規インストール時にこの機能がデフォルトで有効になっていますので、もしかしたら知らないうちにこの機能を使っているかもしれません。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309674/3efc22b9-b85f-77b4-791d-aab46a9edd51.png)

実際にやってみましょう。方法は簡単で、以下のコマンドを入れるだけです。
```
ciscoasa(config)# object-group-search access-control 
INFO: For large ACLs, this operation may take a while to complete.
ciscoasa(config)# show access-list | inc element     
access-list ACL-1; 5 elements; name hash: 0xd7d86ebc
```

object-group-search access-control コマンドを実施すると、access-group コマンドでアクセス制御に使われている ACL の ACE 展開方法が変わり、Object Group の中身を展開せずに ACE を Object Group のまま保持するようになります。
こうなると、メモリ使用率も大きく変わります。

```
ciscoasa# show memory
Free memory:         693782776 bytes (34%)
Used memory:        1372333832 bytes (66%)
-------------     ------------------
Total memory:       2066116608 bytes (100%)
```
具体的に show access-list コマンドで展開された ACE を細かくみてみると、Object Group を展開して持っているか展開せずに持っているかがわかります。

Object Group Search が有効な場合
```
ciscoasa# show access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list ACL-1; 5 elements; name hash: 0xd7d86ebc
access-list ACL-1 line 1 extended permit object-group SVC-INBOUND-1 object-group NET-OUTSIDE-1 object-group NET-INSIDE-1 (hitcnt=0) 0xb9cd992e 
  access-list ACL-1 line 1 extended permit tcp v4-object-group NET-OUTSIDE-1(2147483649) v4-object-group NET-INSIDE-1(2147483650) eq www (hitcnt=0) 0xdc602353 
  access-list ACL-1 line 1 extended permit tcp v4-object-group NET-OUTSIDE-1(2147483649) v4-object-group NET-INSIDE-1(2147483650) eq https (hitcnt=0) 0x6399a215 
  access-list ACL-1 line 1 extended permit tcp v4-object-group NET-OUTSIDE-1(2147483649) v4-object-group NET-INSIDE-1(2147483650) eq ssh (hitcnt=0) 0x86736335 
  access-list ACL-1 line 1 extended permit udp v4-object-group NET-OUTSIDE-1(2147483649) v4-object-group NET-INSIDE-1(2147483650) eq domain (hitcnt=0) 0xa223533e 
  access-list ACL-1 line 1 extended permit tcp v4-object-group NET-OUTSIDE-1(2147483649) v4-object-group NET-INSIDE-1(2147483650) eq domain (hitcnt=0) 0x99347244 
```

Object Group Search を無効にした場合
```
ciscoasa(config)# no object-group-search access-control 
INFO: For large ACLs, this operation may take a while to complete.
ciscoasa(config)# show access-list
access-list cached ACL log flows: total 0, denied 0 (deny-flow-max 4096)
            alert-interval 300
access-list ACL-1; 150000 elements; name hash: 0xd7d86ebc
access-list ACL-1 line 1 extended permit object-group SVC-INBOUND-1 object-group NET-OUTSIDE-1 object-group NET-INSIDE-1 (hitcnt=0) 0xb9cd992e 
  access-list ACL-1 line 1 extended permit tcp host 172.16.0.1 host 192.168.1.1 eq www (hitcnt=0) 0x79d33141 
  access-list ACL-1 line 1 extended permit tcp host 172.16.0.1 host 192.168.1.3 eq www (hitcnt=0) 0x33bfe6cc 
  access-list ACL-1 line 1 extended permit tcp host 172.16.0.1 host 192.168.1.5 eq www (hitcnt=0) 0x4083edb7 
  access-list ACL-1 line 1 extended permit tcp host 172.16.0.1 host 192.168.1.7 eq www (hitcnt=0) 0xab5074b8 
  access-list ACL-1 line 1 extended permit tcp host 172.16.0.1 host 192.168.1.9 eq www (hitcnt=0) 0x560f9199 
(以下略)
```
# Object Group Search のメリットとデメリット

ここまでの検証のとおり、Object Group Search を有効にすることで、ACL に Network や Service の Object Group を使っている場合に、メモリ使用率を大幅に減らせる可能性があります。

その反面、パケットの処理を行う際に毎回 CPU で Object Group の中身を展開することになるので、CPU 負荷が上がってしまいます。

メモリ使用率を取るか、CPU 負荷を取るか、それは利用方法によって変わってきます。
先に記載したように、最近の ASA や FTD のソフトウェアでは、デフォルトでこの機能が有効になっていることもあり、現時点でのシスコからの推奨は "Object Group Search は有効にした方がよい" です。
access-group で使う ACL で Network や Service の Object Group を使っていて、メモリ使用率が高い場合にはこの機能を有効にする価値があります。

なお、この機能は access-group コマンドで ACL を適用していて、その ACL で Network や Service　の Object Group を使っている場合のみに有益です。Security Group や User Group を ACL で使っている場合には、この機能は使わないでください。

また、そもそも ACL で Object Group を使っていない場合、この機能に意味はありません。
Object Group を使わずにただただ ACL が多い場合には、まず Object Group を使って、記載する ACL の行数を減らすようにしてください。
それでも ACL が多すぎる場合には、根本的なポリシーの見直しが必要です。

# 機種毎の最大推奨 ACE は？

過去には社外に公開しておりました。
まだシスココミュニティの記事や公開済みの Cisco Live! の資料等に情報が残っています。
しかしながら、最新の情報は社外には非公開となりました。
案件対応等で最新の情報が必要な場合には、シスコの営業までお問い合わせください。

# つまり、表題への答えは？

show run で見えるような config の ACL を減らしたい場合には Object Group を使って行数そのものを減らすことができます。
ただし、それだけではメモリに展開する ACE は多いままなので、Object Group Search を使ってメモリに展開する ACE を削減しないと本質的な効果が期待できません。

なので「ケースバイケースで実質減らせる」が答えです。

# 終わりに

ASA Version 8.3 という、12年も前にリリースされた機能を、なぜ今頃記事にしてみたかというと…
・意外と知られてない
・最新のソフトウェアではデフォルト有効になっている
・昔 Object Group の中身が多すぎて困ってしまった案件があり、私から改善要求を本社に出したところ、このような機能がしばらく経って実現された
という、私にとって思い出深い機能なので、この機会に記事として書いてみました。

# 補足

(注1)　回数は大幅に誇張しております。
(注2)　幻聴も含みます。幻聴が聞こえてくる場合は、休養が必要です。
(注3)　機種別の推奨最大 ACE の数を公開していますが、情報がやや古いので、最新情報が必要な場合にはシスコの営業までお問い合わせください。

# 免責事項

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