1

Cisco ASA の構成からファイアウォール ルールを解析するスクリプトを作成しています。

私の入力の例は次のとおりです。

access-list myACL line 1 extended permit tcp host 10.8.13.200 host 10.32.53.22 eq 1122
access-list myACL line 2 extended permit tcp 10.8.13.0 255.255.255.0 host 10.1.206.17 eq 445 
access-list myACL line 3 extended permit udp host 10.8.13.200 eq 54345 host 10.1.206.17 eq 445
access-list myACL line 4 extended permit icmp any any

上記の 3 行を .csv 形式で出力すると、次のようになります。ただし、これらはデータベースに格納されるタプルでもかまいません。

#aclName,lineNumber,action,protocol,sourceIP,sourcePort,destIP,destPort
myACL,1,permit,tcp,10.8.13.200,*,10.32.53.22,1122
myACL,2,permit,tcp,10.8.13.0/24,*,10.1.206.17,445
myACL,3,permit,udp,10.8.13.200,54345,10.1.206.17,445
myACL,4,permit,icmp,*,*,*,*

このプロジェクトへのアプローチの選択に問題があります。ats、shlex、または単に正規表現を使用するなど、多くのオプションを見てきましたが、最適なオプションを判断するのに苦労しています。ここで PLY は役に立ちますか?

これに適したアプローチは何ですか?

4

3 に答える 3

0

CSV ターゲットを出力するだけでよい場合は、最も慣れている方法をお勧めします。それが1回限りの/アドジョックなものである場合は、最も速く実行できるものをさらにお勧めします.

それが私だったら、おそらく正規表現でしょう。

于 2012-04-17T18:51:19.490 に答える
0

最初の 6 つのフィールドは非常に予測可能であるように思われ、複数の表現を持つことができるエンドポイントが残ります。可能性は次のとおりです(テストされていないコードですが、アイデアが得られることを願っています):

parts = rule.split(" ")
aclName, _, lineNumber, _, action, protocol = parts[:6]
endpoints = parts[6:]

def get_endpoint(eps):
    host, port = "*", "*"
    if eps[0] == "host":
        host = eps[1]
        eps = eps[2:]
    elif eps[0] == "any":
        eps = eps[1:]
    else:
        host = eps[0] + "/" + mask_to_bits(eps[1])
        eps = eps[2:]

    if eps and eps[0] == 'eq':
        port = eps[1]
        eps = eps[2:]
    return host, port, eps

sourceIP, sourcePort, endpoints = get_endpoint(endpoints)
destIP, destPort, endpoints = get_endpoint(endpoints)
于 2012-04-17T19:06:12.620 に答える
0

ファイアウォール文字列を次のように解析します.split(" ")

于 2012-04-17T18:55:17.727 に答える