てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Batfish] SRX(Junos)上の評価されないポリシーを検出する

はじめに

ネットワーク機器のコンフィグ解析ツール Batfish には、読み込んだコンフィグのルーターACLや、ファイアウォールのポリシーの中から、評価されないポリシーを検出する機能があります。 Batfish の Python ライブラリpybatfish でいう filterLineReachabilityです。

評価されないポリシーとは

ポリシーは、通常上から順番に評価され、条件にマッチした時点でそれ以降のポリシーは評価しません。そのため、例えば(極端な例ですが)1行目に IP を利用したすべての通信を許可するポリシーがある場合、2行目に HTTP を許可するポリシーが定義してあっても評価されません。

ポリシーの追加、変更が繰り返されるとポリシーが複雑化し、意図せずこのような評価されないポリシーができてしまうこともあるかもしれません。 ポリシーの数が多い場合、人間の判断による検出が難しいので、機械的に実現したいところです。

SRX (Junos)で試しました

試した Jupyter Notebook の .ipynb ファイルを以下の Gist にアップしましたので貼り付けます。

gist3bf4a03265db735977dbec7625169d96

なお、上記の例には含まれていませんが、ICMP の type や code までは判断していないようです。 具体的に試したのは、junos-icmp-all 許可と junos-icmp-ping 許可 の組み合わせです。

junos-icmp-ping 許可 → junos-icmp-all 許可というポリシーの順番であれば、後者の junos-icmp-all も評価されるはずです。ですが、batfish 上では、評価されないポリシーとして検出されました。

そのため、batfish 上では2つのポリシーとも type や code までは判断せず、単にICMP 許可という定義として扱われ、重複、後ろにあるポリシーは評価されないと判断された、と考えました。

Cisco IOSACL での例は公式 Notebook に

Cisco IOSACL での利用されないエントリを検出する例は、公式 Jupyter Notebook の Analyzing ACLs and firewall rules with Batfish 内の filterLineReachability: Analyzing reachability of filter lines にあります。

参考

tekunabe.hatenablog.jp