使用 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 中的新管理 API 功能(從 R80.40 開始支援)。 要理解本文,您需要使用 API 和 Python 的基礎知識。

Check Point 正在積極開發 API,目前已發布以下內容:

Python SDK目前僅支援與管理API交互 蓋亞API。 我們將了解本模組中最重要的類別、方法和變數。

使用 Python SDK 簡化 Check Point API

模塊安裝

CPAPI 快速、輕鬆地安裝 github 上的官方 Check Point 儲存庫 在...的幫助下 點子。 詳細的安裝說明可參見 README.md。 此模組適用於 Python 2.7 和 3.7 版本。 在本文中,將使用 Python 3.7 給出範例。 但是,Python SDK 可以直接從 Check Point 管理伺服器(智慧管理)運行,但它們僅支援 Python 2.7,因此最後一節將提供 2.7 版本的程式碼。 安裝模組後,我建議立即查看目錄中的範例 範例_python2 и 範例_python3.

入門

為了讓我們能夠使用 cpapi 模組的元件,我們需要從模組導入 CPAPI 至少兩個必修課程:

API客戶端 и API客戶端參數

from cpapi import APIClient, APIClientArgs

API客戶端參數 負責API伺服器的連線參數,以及類別 API客戶端 負責與API互動。

確定連接參數

要定義連接API的各種參數,您需要建立該類別的實例 API客戶端參數。 原則上,其參數是預先定義的,在控制伺服器上執行腳本時不需要指定它們。

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 呼叫後不需要註銷,則需要在不使用上下文管理器的情況下開始工作:

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_調用 и api查詢,我們將進一步討論它們)API 伺服器上的 sha1 指紋憑證。 但是,如果在檢查 API 伺服器憑證的 sha1 指紋時偵測到錯誤(憑證未知或已變更),則該方法 檢查指紋 將提供在本機電腦上自動新增/更改有關它的資訊的機會。 可以使用 APIClientArgs 參數完全停用此檢查(但只有在連接到 127.0.0.1 時在 API 伺服器本身上執行腳本時才建議這樣做) - 不安全自動接受 (請參閱前面「定義連線參數」中有關 APIClientArgs 的更多資訊)。

client_args = APIClientArgs(unsafe_auto_accept=True)

登入API伺服器

У API客戶端 登入API伺服器的方法多達3種,每種方法都明白其意義 SID(session-id),在 header 中後續每次 API 呼叫時都會自動使用該參數(該參數的 header 中的名稱為 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 金鑰授權方法的使用者之一的 API 金鑰值):

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

在方法中 使用 api 金鑰登入 與方法中相同的可選參數可用 登錄.

登入為根方法

使用 API 伺服器登入本機的選項:

     login = client.login_as_root()

此方法只有兩個可選參數可用:

domain=None, payload=None

最後API呼叫自己

我們有兩種選擇透過方法進行 API 呼叫 api_調用 и api查詢。 讓我們弄清楚它們之間有什麼區別。

api_調用

此方法適用於任何呼叫。 如有必要,我們需要在請求正文中傳遞 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查詢

我馬上預約一下,這個方法只適用於輸出涉及偏移量的呼叫。 當包含或可能包含大量資訊時,就會發生這種推斷。 例如,這可能是對管理伺服器上所有建立的主機物件的清單的請求。 對於此類請求,API 預設傳回 50 個物件的清單(您可以在回應中將限制增加到 500 個物件)。 為了不多次拉取訊息,更改 API 請求中的 offset 參數,有一個 api_query 方法可以自動完成此工作。 需要此方法的呼叫範例: 顯示會話、顯示主機、顯示網路、顯示通配符、顯示群組、顯示位址範圍、顯示簡單閘道、顯示簡單叢集、顯示存取角色、顯示受信任用戶端、顯示包。 事實上,我們在這些 API 呼叫的名稱中看到複數單詞,因此這些呼叫將更容易通過 api查詢

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.

設定成功狀態

在這種情況下,可能需要變更成功狀態的值。 從技術上講,您可以在那裡放置任何東西,甚至是常規字串。 但一個真實的例子是在某些伴隨條件下將此參數重設為 False。 下面,請注意管理伺服器上有任務正在運行時的範例,但我們會認為此請求不成功(我們將 success 變數設為 ,儘管 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']}}

數據

允許您只看到回應的正文(body),而沒有不必要的資訊。

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 的所有 IP 位址(最後一個八位元組為 5)作為主機類型的對象,並將所有其他 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 中加入了對此的支援。 此呼叫允許您在一個 API 請求中一次建立多個物件。 此外,這些可以是不同類型的物件(例如主機、子網路和位址範圍)。 因此,我們的任務可以在一次 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")

您可以使用以下命令在一次 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中就出現了Revert to revision、Smart Task這樣的“功能”,並立即為它們準備了相應的API呼叫。 此外,從舊版控制台遷移到統一策略模式時的所有功能也獲得 API 支援。 例如,軟體版本R80.40中期待已久的更新是將HTTPS檢查策略從傳統模式轉移到統一策略模式,並且該功能立即收到API呼叫。 以下程式碼範例將一條規則新增至 HTTPS 檢查策略的頂部位置,該規則從檢查中排除 3 個類別(健康、金融、政府服務),根據許多國家/地區的法律,這些類別是禁止檢查的。

在 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 伺服器時,這會很方便。 我錄製了一個六分鐘的視頻,在其中查看如何安裝模組 CPAPI 以及在控制伺服器上執行Python腳本的功能。 例如,執行一個腳本,自動為網路審核等任務配置新網關 安全檢查。 我必須處理的功能包括:該功能尚未出現在 Python 2.7 中 輸入,因此為了處理使用者輸入的訊息,使用了一個函數 原始輸入。 其他方面與其他機器啟動代碼相同,只是使用功能更方便 以root身分登入,以免再次指定您自己的管理伺服器的使用者名稱、密碼和IP位址。

用於快速設定安全檢查的腳本

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","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

結論

本文僅考察工作的基本可能性 開發工具包 和模組 CPAPI(正如您可能已經猜到的,這些實際上是同義詞),透過研究本模組中的程式碼,您將發現使用它的更多可能性。 您可能想用自己的類別、函數、方法和變數來補充它。 您可以隨時在 參考資料 部分分享您的作品並查看 Check Point 的其他腳本 代碼中心 在社區中 將軍,它將產品開發人員和用戶聚集在一起。

祝您編碼愉快,感謝您閱讀到最後!

來源: www.habr.com

添加評論