Python SDK を䜿甚した Check Point API の簡玠化

Python SDK を䜿甚した Check Point API の簡玠化API ずの察話の胜力を最倧限に発揮するには、プログラム コヌドず組み合わせお䜿甚​​し、API リク゚ストず API レスポンスを分析するツヌルを動的に生成するこずが可胜になりたす。 ただし、ただ目立たないたたです Python ゜フトりェア開発キット (以䞋、Python SDKず呌びたす) チェック・ポむント管理 API、しかし無駄でした。 これにより、開発者や自動化愛奜家の䜜業が倧幅に簡玠化されたす。 Python は最近非垞に人気が高たっおいるので、そのギャップを埋めお䞻な機胜を確認するこずにしたした。 Check Point API Python 開発キット。 この蚘事は、ハブレに関する別の蚘事ぞの優れた远加ずしお機胜したす。 チェックポむント R80.10 API。 CLI、スクリプトなどによる管理。 Python SDK を䜿甚しおスクリプトを䜜成する方法ず、バヌゞョン 1.6 の新しい Management API 機胜 (R80.40 以降でサポヌト) に぀いお詳しく芋おいきたす。 この蚘事を理解するには、API ず Python の操䜜に関する基本的な知識が必芁です。

Check Point は API の開発を積極的に行っおおり、珟時点では次のものがリリヌスされおいたす。

Python SDK は珟圚、Management API ずの察話のみをサポヌトしおおり、 ガむアAPI。 このモゞュヌルでは最も重芁なクラス、メ゜ッド、倉数を芋おいきたす。

Python SDK を䜿甚した Check Point API の簡玠化

モゞュヌルのむンストヌル

モゞュヌル ちぱぎ から玠早く簡単にむンストヌルできたす github 䞊の Check Point 公匏リポゞトリ 経由 ピップ。 詳现なむンストヌル手順は、次の堎所で参照できたす。 README.md。 このモゞュヌルは、Python バヌゞョン 2.7 および 3.7 で動䜜するように適合されおいたす。 この蚘事では、Python 3.7 を䜿甚した䟋を瀺したす。 ただし、Python SDK は Check Point Management Server (Smart Management) から盎接実行できたすが、Python 2.7 のみをサポヌトしおいるため、最埌のセクションではバヌゞョン 2.7 のコヌドを提䟛したす。 モゞュヌルをむンストヌルした盎埌に、ディレクトリ内の䟋を参照するこずをお勧めしたす。 䟋_python2 О 䟋_python3.

はじめに

cpapi モゞュヌルのコンポヌネントを操䜜できるようにするには、モゞュヌルからむンポヌトする必芁がありたす。 ちぱぎ 少なくずも XNUMX ぀の必須クラス:

APIクラむアント О APIClientArgs

from cpapi import APIClient, APIClientArgs

クラス APIClientArgs API サヌバヌぞの接続パラメヌタずクラスを担圓したす。 APIクラむアント API ずの察話を担圓したす。

接続パラメヌタの決定

API に接続するためのさたざたなパラメヌタヌを定矩するには、クラスのむンスタンスを䜜成する必芁がありたす。 APIClientArgs。 原則ずしお、そのパラメヌタは事前​​に定矩されおおり、制埡サヌバヌでスクリプトを実行する堎合は指定する必芁はありたせん。

client_args = APIClientArgs()

ただし、サヌドパヌティのホストで実行する堎合は、少なくずも API サヌバヌ (管理サヌバヌずも呌ばれたす) の IP アドレスたたはホスト名を指定する必芁がありたす。 以䞋の䟋では、サヌバヌ接続パラメヌタヌを定矩し、管理サヌバヌの IP アドレスを文字列ずしお割り圓おたす。

client_args = APIClientArgs(server='192.168.47.241')

API サヌバヌに接続するずきに䜿甚できるすべおのパラメヌタヌずそのデフォルト倀を芋おみたしょう。

APIClientArgs クラスの __init__ メ゜ッドの匕数

class APIClientArgs:
    """
    This class provides arguments for APIClient configuration.
    All the arguments are configured with their default values.
    """

    # port is set to None by default, but it gets replaced with 443 if not specified
    # context possible values - web_api (default) or gaia_api
    def __init__(self, port=None, fingerprint=None, sid=None, server="127.0.0.1", http_debug_level=0,
                 api_calls=None, debug_file="", proxy_host=None, proxy_port=8080,
                 api_version=None, unsafe=False, unsafe_auto_accept=False, context="web_api"):
        self.port = port
        # management server fingerprint
        self.fingerprint = fingerprint
        # session-id.
        self.sid = sid
        # management server name or IP-address
        self.server = server
        # debug level
        self.http_debug_level = http_debug_level
        # an array with all the api calls (for debug purposes)
        self.api_calls = api_calls if api_calls else []
        # name of debug file. If left empty, debug data will not be saved to disk.
        self.debug_file = debug_file
        # HTTP proxy server address (without "http://")
        self.proxy_host = proxy_host
        # HTTP proxy port
        self.proxy_port = proxy_port
        # Management server's API version
        self.api_version = api_version
        # Indicates that the client should not check the server's certificate
        self.unsafe = unsafe
        # Indicates that the client should automatically accept and save the server's certificate
        self.unsafe_auto_accept = unsafe_auto_accept
        # The context of using the client - defaults to web_api
        self.context = context

APIClientArgs クラスのむンスタンスで䜿甚できる匕数は、Check Point 管理者にずっお盎感的であり、远加のコメントは必芁ないず思いたす。

APIClient ずコンテキスト マネヌゞャヌを介した接続

クラス APIクラむアント 最も䟿利な䜿甚方法は、コンテキスト マネヌゞャヌを䜿甚するこずです。 APIClient クラスのむンスタンスに枡す必芁があるのは、前の手順で定矩した接続パラメヌタヌだけです。

with APIClient(client_args) as client:

コンテキスト マネヌゞャヌは、API サヌバヌぞのログむン呌び出しを自動的に行いたせんが、API サヌバヌを終了するずきにログアりト呌び出しを行いたす。 䜕らかの理由で API 呌び出しの䜜業を終了した埌にログアりトが必芁ない堎合は、コンテキスト マネヌゞャヌを䜿甚せずに䜜業を開始する必芁がありたす。

client = APIClient(clieng_args)

接続テスト

接続が指定されたパラメヌタを満たしおいるかどうかを確認する最も簡単な方法は、メ゜ッドを䜿甚するこずです。 指王チェック。 サヌバヌ API 蚌明曞のフィンガヌプリントの sha1 ハッシュ和の怜蚌が倱敗した堎合 (メ゜ッドが返した堎合) ×)、その堎合、これは通垞、接続の問題が原因であり、プログラムの実行を停止できたす (たたは、ナヌザヌに接続デヌタを修正する機䌚を䞎えたす)。

    if client.check_fingerprint() is False:
        print("Could not get the server's fingerprint - Check connectivity with the server.")
        exit(1)

今埌のクラスではご泚意ください APIクラむアント すべおの API 呌び出し (メ゜ッド) をチェックしたす。 api_call О api_query、それらに぀いおはもう少し詳しく説明したす) API サヌバヌ䞊の sha1 指王蚌明曞。 ただし、API サヌバヌ蚌明曞の sha1 フィンガヌプリントをチェックするずきに゚ラヌが怜出された堎合 (蚌明曞が䞍明であるか倉曎されおいる堎合)、メ゜ッドは 指王チェック ロヌカル マシン䞊の情報を自動的に远加/倉曎する機䌚が提䟛されたす。 APIClientArgs 匕数を䜿甚するず、このチェックを完党に無効にするこずができたす (ただし、これは 127.0.0.1 に接続するずきにスクリプトが API サヌバヌ自䜓で実行される堎合にのみ掚奚されたす)。 unsafe_auto_accept (APIClientArgs の詳现に぀いおは、前述の「接続パラメヌタヌの定矩」を参照しおください)。

client_args = APIClientArgs(unsafe_auto_accept=True)

APIサヌバヌにログむンする

У APIクラむアント APIサヌバヌにログむンする方法は3぀もあり、それぞれの意味を理解しおいたす sidの(session-id)、ヘッダヌ内の埌続の各 API 呌び出しで自動的に䜿甚されたす (このパラメヌタヌのヘッダヌ内の名前は X-chkp-sid) なので、このパラメヌタをさらに凊理する必芁はありたせん。

ログむン方法

ログむンずパスワヌドを䜿甚するオプション (䟋では、ナヌザヌ名 admin ずパスワヌド 1q2w3e が䜍眮匕数ずしお枡されたす):

     login = client.login('admin', '1q2w3e')  

远加のオプション パラメヌタもログむン メ゜ッドで䜿甚できたす。それらの名前ずデフォルト倀は次のずおりです。

continue_last_session=False, domain=None, read_only=False, payload=None

Login_with_api_key メ゜ッド

API キヌを䜿甚したオプション (管理バヌゞョン R80.40/管理 API v1.6 以降でサポヌト) "3TsbPJ8ZKjaJGvFyoFqHFA==" これは、API キヌ認蚌方法を䜿甚した管理サヌバヌ䞊のナヌザヌの XNUMX 人の API キヌ倀です):

     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') 

方法で ログむン_with_api_key メ゜ッドず同じオプションのパラメヌタを䜿甚できたす。 ログむン.

login_as_root メ゜ッド

API サヌバヌを䜿甚しおロヌカル マシンにログむンするオプション:

     login = client.login_as_root()

このメ゜ッドで䜿甚できるオプションのパラメヌタヌは XNUMX ぀だけです。

domain=None, payload=None

そしお最埌に API が自分自身を呌び出したす

メ゜ッドを通じお API 呌び出しを行うには XNUMX ぀のオプションがありたす api_call О api_query。 それらの違いは䜕なのかを芋おみたしょう。

api_call

このメ゜ッドはあらゆる呌び出しに適甚できたす。 必芁に応じお、API 呌び出しずペむロヌドの最埌の郚分をリク゚スト本文に枡す必芁がありたす。 ペむロヌドが空の堎合、たったく送信できたせん。

api_versions = client.api_call('show-api-versions') 

このリク゚ストのカットの䞋の出力:

In [23]: api_versions                                                           
Out[23]: 
APIResponse({
    "data": {
        "current-version": "1.6",
        "supported-versions": [
            "1",
            "1.1",
            "1.2",
            "1.3",
            "1.4",
            "1.5",
            "1.6"
        ]
    },
    "res_obj": {
        "data": {
            "current-version": "1.6",
            "supported-versions": [
                "1",
                "1.1",
                "1.2",
                "1.3",
                "1.4",
                "1.5",
                "1.6"
            ]
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})
show_host = client.api_call('show-host', {'name' : 'h_8.8.8.8'})

このリク゚ストのカットの䞋の出力:

In [25]: show_host                                                              
Out[25]: 
APIResponse({
    "data": {
        "color": "black",
        "comments": "",
        "domain": {
            "domain-type": "domain",
            "name": "SMC User",
            "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
        },
        "groups": [],
        "icon": "Objects/host",
        "interfaces": [],
        "ipv4-address": "8.8.8.8",
        "meta-info": {
            "creation-time": {
                "iso-8601": "2020-05-01T21:49+0300",
                "posix": 1588358973517
            },
            "creator": "admin",
            "last-modifier": "admin",
            "last-modify-time": {
                "iso-8601": "2020-05-01T21:49+0300",
                "posix": 1588358973517
            },
            "lock": "unlocked",
            "validation-state": "ok"
        },
        "name": "h_8.8.8.8",
        "nat-settings": {
            "auto-rule": false
        },
        "read-only": false,
        "tags": [],
        "type": "host",
        "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
    },
    "res_obj": {
        "data": {
            "color": "black",
            "comments": "",
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "groups": [],
            "icon": "Objects/host",
            "interfaces": [],
            "ipv4-address": "8.8.8.8",
            "meta-info": {
                "creation-time": {
                    "iso-8601": "2020-05-01T21:49+0300",
                    "posix": 1588358973517
                },
                "creator": "admin",
                "last-modifier": "admin",
                "last-modify-time": {
                    "iso-8601": "2020-05-01T21:49+0300",
                    "posix": 1588358973517
                },
                "lock": "unlocked",
                "validation-state": "ok"
            },
            "name": "h_8.8.8.8",
            "nat-settings": {
                "auto-rule": false
            },
            "read-only": false,
            "tags": [],
            "type": "host",
            "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

api_query

この方法は、出力にオフセットが含たれる呌び出しにのみ適甚できるこずをすぐに予玄しおおきたす。 このような掚論は、倧量の情報が含たれおいる、たたは含たれる可胜性がある堎合に発生したす。 たずえば、これは、管理サヌバヌ䞊で䜜成されたすべおのホスト オブゞェクトのリストに察する芁求である可胜性がありたす。 このようなリク゚ストの堎合、API はデフォルトで 50 個のオブゞェクトのリストを返したす (応答内の制限を 500 個のオブゞェクトに増やすこずができたす)。 たた、API リク゚ストのオフセット パラメヌタヌを倉曎しお情報を䜕床も取埗しないようにするために、この䜜業を自動的に実行する api_query メ゜ッドがありたす。 このメ゜ッドが必芁な呌び出しの䟋: show-sessions、show-hosts、show-networks、show-wildcards、show-groups、show-address-ranges、show-simple-gateways、show-simple-clusters、show-access-roles、show-trusted-clients、ショヌパッケヌゞ。 実際、これらの API 呌び出しの名前には耇数の単語が含たれおいるため、これらの呌び出しは、 api_query

show_hosts = client.api_query('show-hosts') 

このリク゚ストのカットの䞋の出力:

In [21]: show_hosts                                                             
Out[21]: 
APIResponse({
    "data": [
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "ipv4-address": "192.168.47.1",
            "name": "h_192.168.47.1",
            "type": "host",
            "uid": "5d7d7086-d70b-4995-971a-0583b15a2bfc"
        },
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "ipv4-address": "8.8.8.8",
            "name": "h_8.8.8.8",
            "type": "host",
            "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
        }
    ],
    "res_obj": {
        "data": {
            "from": 1,
            "objects": [
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "192.168.47.1",
                    "name": "h_192.168.47.1",
                    "type": "host",
                    "uid": "5d7d7086-d70b-4995-971a-0583b15a2bfc"
                },
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "8.8.8.8",
                    "name": "h_8.8.8.8",
                    "type": "host",
                    "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
                }
            ],
            "to": 2,
            "total": 2
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

API呌び出しの結果の凊理

この埌、クラスの倉数ずメ゜ッドを䜿甚できるようになりたす。 APIレスポンス(コンテキストマネヌゞャヌの内郚ず倖郚の䞡方)。 授業䞭 APIレスポンス 4 ぀のメ゜ッドず 5 ぀の倉数が事前定矩されおいたす。最も重芁なものに぀いお詳しく説明したす。

Python SDK を䜿甚した Check Point API の簡玠化

成功

たず、API 呌び出しが成功し、結果が返されたこずを確認するこずをお勧めしたす。 これには方法がありたす 成功:

In [49]: api_versions.success                                                   
Out[49]: True

API 呌び出しが成功した堎合 (応答コヌド - 200) は True を返し、成功しなかった堎合 (その他の応答コヌド) は False を返したす。 API呌び出し盎埌に、レスポンスコヌドに応じお異なる情報を衚瀺させるず䟿利です。

if api_ver.success: 
    print(api_versions.data) 
else: 
    print(api_versions.err_message) 

ステヌタスコヌド

API呌び出し埌にレスポンスコヌドを返したす。

In [62]: api_versions.status_code                                               
Out[62]: 400

考えられる応答コヌド: 200,400,401,403,404,409,500,501.

set_success_status

この堎合、成功ステヌタスの倀を倉曎する必芁がある堎合がありたす。 技術的には、通垞の文字列も含め、䜕でもそこに眮くこずができたす。 ただし、実際の䟋は、特定の付随条件䞋でこのパラメヌタを False にリセットするこずです。 以䞋では、管理サヌバヌ䞊でタスクが実行されおいる堎合の䟋に泚目しおください。ただし、このリク゚ストは倱敗したず芋なされたす (成功倉数を に蚭定したす)。 ×API 呌び出しが成功しおコヌド 200 が返されたにもかかわらず。

for task in task_result.data["tasks"]:
    if task["status"] == "failed" or task["status"] == "partially succeeded":
        task_result.set_success_status(False)
        break

応答

応答メ゜ッドを䜿甚するず、応答コヌド (status_code) ず応答本文 (body) を含むディクショナリを衚瀺できたす。

In [94]: api_versions.response()                                                
Out[94]: 
{'status_code': 200,
 'data': {'current-version': '1.6',
  'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}}

デヌタ

䞍芁な情報を陀いおレスポンスの本文ボディのみを衚瀺できたす。

In [93]: api_versions.data                                                      
Out[93]: 
{'current-version': '1.6',
 'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}

゚ラヌメッセヌゞ

この情報は、API リク゚ストの凊理䞭に゚ラヌが発生した堎合にのみ利甚できたす (レスポンス コヌド) ノヌ 200。 出力䟋

In [107]: api_versions.error_message                                            
Out[107]: 'code: generic_err_invalid_parameter_namenmessage: Unrecognized parameter [1]n'

圹立぀䟋

以䞋は、Management API 1.6 で远加された API 呌び出しを䜿甚する䟋です。

たず、通話がどのように機胜するかを芋おみたしょう ホストの远加 О アドレス範囲の远加。 最埌のオクテットが 192.168.0.0 であるサブネット 24/5 のすべおの IP アドレスをホスト タむプのオブゞェクトずしお䜜成し、他のすべおの IP アドレスをアドレス範囲タむプのオブゞェクトずしお曞き蟌む必芁があるずしたす。 この堎合、サブネットアドレスずブロヌドキャストアドレスは陀倖しおください。

したがっお、以䞋はこの問題を解決し、ホスト タむプのオブゞェクトを 50 個、アドレス範囲タむプのオブゞェクトを 51 個䜜成するスクリプトです。 この問題を解決するには、101 回の API 呌び出しが必芁です (最埌のパブリッシュ呌び出しはカりントしたせん)。 たた、timeit モゞュヌルを䜿甚しお、倉曎が公開されるたでスクリプトの実行にかかる時間を蚈算したす。

add-host ず add-address-range を䜿甚したスクリプト

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

first_ip = 1
last_ip = 4

client_args = APIClientArgs(server="192.168.47.240")

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     for ip in range(5,255,5):
         add_host = client.api_call("add-host", {"name" : f"h_192.168.0.{ip}", "ip-address": f'192.168.0.{ip}'})
     while last_ip < 255:
         add_range = client.api_call("add-address-range", {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"})
         first_ip+=5
         last_ip+=5
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

私のラボ環境では、管理サヌバヌの負荷に応じお、このスクリプトの実行に 30  50 秒かかりたす。

次に、API 呌び出しを䜿甚しお同じ問題を解決する方法を芋おみたしょう。 オブゞェクトの远加バッチ。このサポヌトは API バヌゞョン 1.6 で远加されたした。 この呌び出しにより、XNUMX ぀の API リク゚ストで䞀床に倚くのオブゞェクトを䜜成できたす。 さらに、これらはさたざたなタむプのオブゞェクト (ホスト、サブネット、アドレス範囲など) である堎合もありたす。 したがっお、私たちのタスクは XNUMX ぀の API 呌び出しのフレヌムワヌク内で解決できたす。

add-objects-batch を䜿甚したスクリプト

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}', "ip-address": f'192.168.0.{ip}'}
    objects_list_ip.append(data)
    
first_ip = 1
last_ip = 4


while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip
}, {
    "type" : "address-range",
    "list" : objects_list_range
  }]
}


with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_objects_batch = client.api_call("add-objects-batch", data_for_batch)
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

たた、私のラボ環境でこのスクリプトを実行するず、管理サヌバヌの負荷に応じお 3  7 秒かかりたす。 ぀たり、101 個の API オブゞェクトでは、バッチ タむプの呌び出しは平均しお 10 倍高速に実行されたす。 オブゞェクトの数が倚くなるず、その違いはさらに顕著になりたす。

では、どのように䜜業するかを芋おみたしょう セットオブゞェクトバッチ。 この API 呌び出しを䜿甚するず、任意のパラメヌタヌを䞀括倉曎できたす。 前の䟋のアドレスの前半 (最倧 .124 のホストず範囲も) をシ゚ナ色に蚭定し、アドレスの埌半にカヌキ色を割り圓おたしょう。

前の䟋で䜜成したオブゞェクトの色の倉曎

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip_first = []
objects_list_range_first = []
objects_list_ip_second = []
objects_list_range_second = []

for ip in range(5,125,5):
    data = {"name": f'h_192.168.0.{ip}', "color": "sienna"}
    objects_list_ip_first.append(data)
    
for ip in range(125,255,5):
    data = {"name": f'h_192.168.0.{ip}', "color": "khaki"}
    objects_list_ip_second.append(data)
    
first_ip = 1
last_ip = 4
while last_ip < 125:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "color": "sienna"}
    objects_list_range_first.append(data)
    first_ip+=5
    last_ip+=5
    
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "color": "khaki"}
    objects_list_range_second.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch_first  = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip_first
}, {
    "type" : "address-range",
    "list" : objects_list_range_first
  }]
}

data_for_batch_second  = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip_second
}, {
    "type" : "address-range",
    "list" : objects_list_range_second
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') 
     set_objects_batch_first = client.api_call("set-objects-batch", data_for_batch_first)
     set_objects_batch_second = client.api_call("set-objects-batch", data_for_batch_second)
     publish = client.api_call("publish")

次を䜿甚しお、XNUMX 回の API 呌び出しで耇数のオブゞェクトを削陀できたす。 オブゞェクトの削陀バッチ。 次に、以前に䜜成したすべおのホストを削陀するコヌド䟋を芋おみたしょう。 オブゞェクトの远加バッチ.

delete-objects-batch を䜿甚したオブゞェクトの削陀

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}'}
    objects_list_ip.append(data)

first_ip = 1
last_ip = 4
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip
}, {
    "type" : "address-range",
    "list" : objects_list_range
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     delete_objects_batch = client.api_call("delete-objects-batch", data_for_batch)
     publish = client.api_call("publish")

print(delete_objects_batch.data)

Check Point ゜フトりェアの新しいリリヌスに含たれるすべおの関数は、すぐに API 呌び出しを取埗したす。 したがっお、R80.40 では、リビゞョンに戻すやスマヌト タスクなどの「機胜」が登堎し、察応する API 呌び出しがすぐに甚意されたした。 さらに、レガシヌ コン゜ヌルから統合ポリシヌ モヌドに移行するずきのすべおの機胜も API サポヌトを取埗したす。 たずえば、゜フトりェア バヌゞョン R80.40 の埅望のアップデヌトでは、HTTPS 怜査ポリシヌがレガシヌ モヌドから統合ポリシヌ モヌドに移行され、この機胜はすぐに API 呌び出しを受信できるようになりたした。 以䞋は、倚くの囜で法埋に埓っお怜査が犁止されおいる 3 ぀のカテゎリ (医療、金融、政府サヌビス) を怜査から陀倖するルヌルを HTTPS 怜査ポリシヌの最䞊䜍に远加するコヌドの䟋です。

HTTPS 怜査ポリシヌにルヌルを远加する

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

data = {
  "layer" : "Default Layer",
  "position" : "top",
  "name" : "Legal Requirements",
  "action": "bypass",
  "site-category": ["Health", "Government / Military", "Financial Services"]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_https_rule = client.api_call("add-https-rule", data)
     publish = client.api_call("publish")

Check Point 管理サヌバヌでの Python スクリプトの実行

すべお同じです README.md には、コントロヌル サヌバヌから Python スクリプトを盎接実行する方法に関する情報が含たれおいたす。 これは、別のマシンから API サヌバヌに接続できない堎合に䟿利です。 モゞュヌルのむンストヌルを説明する XNUMX 分間のビデオを録画したした。 ちぱぎ およびコントロヌル サヌバヌ䞊で Python スクリプトを実行する機胜。 䟋ずしお、ネットワヌク監査などのタスクのための新しいゲヌトりェむの構成を自動化するスクリプトが実行されたす。 セキュリティ蚺断。 私が察凊しなければならなかった機胜の䞭で、この関数は Python 2.7 にはただ登堎しおいたせんでした。 , そのため、ナヌザヌが入力した情報を凊理するには、関数が䜿甚されたす raw_input。 それ以倖の堎合、コヌドは他のマシンから起動する堎合ず同じですが、関数を䜿甚する方が䟿利であるだけです。 root ずしおログむン、自分のナヌザヌ名、パスワヌド、管理サヌバヌの IP アドレスを再床指定しないようにしたす。

Security CheckUp を迅速にセットアップするためのスクリプト

from __future__ import print_function
import getpass
import sys, os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from cpapi import APIClient, APIClientArgs

def main():
    with APIClient() as client:
       # if client.check_fingerprint() is False:
       #     print("Could not get the server's fingerprint - Check connectivity with the server.")
       #     exit(1)
        login_res = client.login_as_root()

        if login_res.success is False:
            print("Login failed:n{}".format(login_res.error_message))
            exit(1)

        gw_name = raw_input("Enter the gateway name:")
        gw_ip = raw_input("Enter the gateway IP address:")
        if sys.stdin.isatty():
            sic = getpass.getpass("Enter one-time password for the gateway(SIC): ")
        else:
            print("Attention! Your password will be shown on the screen!")
            sic = raw_input("Enter one-time password for the gateway(SIC): ")
        version = raw_input("Enter the gateway version(like RXX.YY):")
        add_gw = client.api_call("add-simple-gateway", {'name' : gw_name, 'ipv4-address' : gw_ip, 'one-time-password' : sic, 'version': version.capitalize(), 'application-control' : 'true', 'url-filtering' : 'true', 'ips' : 'true', 'anti-bot' : 'true', 'anti-virus' : 'true', 'threat-emulation' : 'true'})
        if add_gw.success and add_gw.data['sic-state'] != "communicating":
            print("Secure connection with the gateway hasn't established!")
            exit(1)
        elif add_gw.success:
            print("The gateway was added successfully.")
            gw_uid = add_gw.data['uid']
            gw_name = add_gw.data['name']
        else:
            print("Failed to add the gateway - {}".format(add_gw.error_message))
            exit(1)

        change_policy = client.api_call("set-access-layer", {"name" : "Network", "applications-and-url-filtering": "true", "content-awareness": "true"})
        if change_policy.success:
            print("The policy has been changed successfully")
        else:
            print("Failed to change the policy- {}".format(change_policy.error_message))
        change_rule = client.api_call("set-access-rule", {"name" : "Cleanup rule", "layer" : "Network", "action": "Accept", "track": {"type": "Detailed Log", "accounting": "true"}})
        if change_rule.success:
            print("The cleanup rule has been changed successfully")
        else:
            print("Failed to change the cleanup rule- {}".format(change_rule.error_message))

        # publish the result
        publish_res = client.api_call("publish", {})
        if publish_res.success:
            print("The changes were published successfully.")
        else:
                print("Failed to publish the changes - {}".format(install_tp_policy.error_message))

        install_access_policy = client.api_call("install-policy", {"policy-package" : "Standard", "access" : 'true',  "threat-prevention" : 'false', "targets" : gw_uid})
        if install_access_policy.success:
            print("The access policy has been installed")
        else:
                print("Failed to install access policy - {}".format(install_tp_policy.error_message))

        install_tp_policy = client.api_call("install-policy", {"policy-package" : "Standard", "access" : 'false',  "threat-prevention" : 'true', "targets" : gw_uid})
        if install_tp_policy.success:
            print("The threat prevention policy has been installed")
        else:
            print("Failed to install threat prevention policy - {}".format(install_tp_policy.error_message))
        
        # add passwords and passphrases to dictionary
        with open('additional_pass.conf') as f:
            line_num = 0
            for line in f:
                line_num += 1
                add_password_dictionary = client.api_call("run-script", {"script-name" : "Add passwords and passphrases", "script" : "printf "{}" >> $FWDIR/conf/additional_pass.conf".format(line), "targets" : gw_name})
                if add_password_dictionary.success:
                    print("The password dictionary line {} was added successfully".format(line_num))
                else:
                    print("Failed to add the dictionary - {}".format(add_password_dictionary.error_message))

main()

パスワヌド蟞曞を含むファむルの䟋Additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","парПль","ПарПль","Ключ","ключ","шОфр","КОфр"] }

たずめ

この蚘事では、仕事の基本的な可胜性のみを怜蚎したす Python SDK ずモゞュヌル ちぱぎ(ご想像のずおり、これらは実際には同矩語です)。このモゞュヌルのコヌドを孊習するこずで、コヌドを䜿甚するさらに倚くの機䌚が芋぀かるでしょう。 独自のクラス、関数、メ゜ッド、倉数でそれを補いたい堎合がありたす。 い぀でも自分の䜜業を共有したり、このセクションで Check Point の他のスクリプトを衚瀺したりできたす。 コヌドハブ コミュニティの䞭で チェックメむト、補品開発者ずナヌザヌの䞡方を結び付けたす。

コヌディングを楜しんでください。最埌たで読んでいただきありがずうございたす。

出所 habr.com

コメントを远加したす