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.

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

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster