Pinasimple ang Check Point API gamit ang Python SDK

Pinasimple ang Check Point API gamit ang Python SDKAng buong kapangyarihan ng pakikipag-ugnayan sa API ay makikita kapag ginamit kasama ng program code, kapag naging posible na dynamic na bumuo ng mga kahilingan sa API at mga tool para sa pagsusuri ng mga tugon ng API. Gayunpaman, nananatili pa rin itong hindi napapansin Python Software Development Kit (pagkatapos nito - Python SDK) para sa Check Point Management API, ngunit walang kabuluhan. Ito ay makabuluhang pinapasimple ang buhay ng mga developer at mahilig sa automation. Ang Python ay nakakuha ng napakalaking katanyagan sa mga nakaraang taon at nagpasya akong isara ang puwang at suriin ang mga pangunahing tampok. Check Point API Python Development Kit. Ang artikulong ito ay nagsisilbing isang mahusay na karagdagan sa isa pang artikulo sa HabrΓ© Check Point R80.10 API. Kontrol sa pamamagitan ng CLI, mga script at higit pa. Titingnan natin kung paano magsulat ng mga script gamit ang Python SDK at pag-isipan ang bagong functionality ng Management API sa bersyon 1.6 (sinusuportahan mula noong R80.40). Upang maunawaan ang artikulo, kakailanganin mo ng pangunahing kaalaman sa pagtatrabaho sa API at Python.

Ang Check Point ay aktibong bumubuo ng API at sa sandaling ito ay isinilang:

Kasalukuyang sinusuportahan lamang ng Python SDK ang pakikipag-ugnayan sa Management API at Gaia API. Tatalakayin natin ang pinakamahahalagang klase, pamamaraan at variable sa modyul na ito.

Pinasimple ang Check Point API gamit ang Python SDK

Pag-install ng module

Modyul cpapi na-install nang mabilis at madali mula sa Check Point opisyal na imbakan sa github sa tulong tuldukan. Ang mga detalyadong tagubilin sa pag-install ay nasa README.md. Ang modyul na ito ay iniangkop upang gumana sa mga bersyon ng Python 2.7 at 3.7. Sa artikulong ito, ibibigay ang mga halimbawa gamit ang Python 3.7. Gayunpaman, ang Python SDK ay maaaring direktang patakbuhin mula sa Check Point management server (Smart Management), ngunit sinusuportahan lamang nila ang Python 2.7, kaya ang code para sa bersyon 2.7 ay ibibigay sa huling seksyon. Kaagad pagkatapos i-install ang module, inirerekomenda kong tingnan ang mga halimbawa sa mga direktoryo examples_python2 ΠΈ examples_python3.

Pagsisimula

Upang magawa natin ang mga bahagi ng module ng cpapi, kinakailangan na mag-import mula sa module cpapi hindi bababa sa dalawang kinakailangang klase:

APIClient ΠΈ APIClientArgs

from cpapi import APIClient, APIClientArgs

klase APIClientArgs ay responsable para sa mga parameter ng koneksyon sa API server, at ang klase APIClient responsable para sa pakikipag-ugnayan sa API.

Pagtukoy ng mga parameter ng koneksyon

Upang tukuyin ang iba't ibang mga parameter para sa pagkonekta sa API, kailangan mong lumikha ng isang instance ng klase APIClientArgs. Sa prinsipyo, ang mga parameter nito ay paunang natukoy, at kapag pinapatakbo ang script sa control server, maaari silang alisin.

client_args = APIClientArgs()

Ngunit kapag tumatakbo sa isang third-party na host, dapat mong tukuyin ang hindi bababa sa IP address o pangalan ng host ng API server (aka ang server ng pamamahala). Sa halimbawa sa ibaba, tinukoy namin ang server ng parameter ng koneksyon at itinalaga ito bilang isang string ang IP address ng server ng pamamahala.

client_args = APIClientArgs(server='192.168.47.241')

Tingnan natin ang lahat ng mga parameter at ang kanilang mga default na halaga na maaaring magamit kapag kumokonekta sa API server:

Mga argumento para sa __init__ na pamamaraan ng klase ng APIClientArgs

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

Naniniwala ako na ang mga argumento na maaaring magamit sa mga pagkakataon ng klase ng APIClientArgs ay madaling maunawaan para sa mga administrator ng Check Point at hindi nangangailangan ng mga karagdagang komento.

Kumokonekta sa pamamagitan ng APIClient at Context Manager

klase APIClient ito ay pinaka-maginhawang gamitin sa pamamagitan ng context manager. Ang kailangan lang ipasa sa isang instance ng klase ng APIClient ay ang mga parameter ng koneksyon na tinukoy sa huling hakbang.

with APIClient(client_args) as client:

Ang tagapamahala ng konteksto ay hindi awtomatikong gagawa ng isang tawag sa pag-login sa API server, ngunit ito ay gagawa ng isang logout na tawag kapag lumabas dito. Kung sa ilang kadahilanan ay hindi mo kailangang mag-logout kapag natapos mo nang magtrabaho sa mga tawag sa API, kailangan mong magsimulang magtrabaho nang hindi gumagamit ng context manager:

client = APIClient(clieng_args)

Pagsubok sa koneksyon

Ito ay pinakamadaling suriin kung ang koneksyon ay pumasa ayon sa tinukoy na mga parameter gamit ang pamamaraan check_fingerprint. Kung nabigo ang pag-verify ng sha1 hash sum para sa fingerprint ng server API certificate (ibinalik ang pamamaraan Huwad), kung gayon ito ay karaniwang sanhi ng mga problema sa koneksyon at maaari naming ihinto ang programa mula sa pagtakbo (o bigyan ang user ng pagkakataon na iwasto ang data para sa koneksyon):

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

Mangyaring tandaan na sa hinaharap ang klase APIClient susuriin ang bawat tawag sa API (methods api_call ΠΈ api_query, pag-uusapan natin ang mga ito nang kaunti pa) sha1 fingerprint ng certificate sa API server. Ngunit kung may nakitang error kapag sinusuri ang sha1 fingerprint ng server API certificate (ang certificate ay hindi kilala o binago), ang pamamaraan check_fingerprint ay magbibigay ng pagkakataong magdagdag / magbago ng impormasyon tungkol dito sa lokal na makina sa awtomatikong mode. Ang pagsusuring ito ay maaaring ganap na hindi paganahin (ngunit maaari lamang itong irekomenda kung ang mga script ay pinapatakbo sa API server mismo, kapag kumokonekta sa 127.0.0.1), gamit ang APIClientArgs argument - unsafe_auto_accept (Tumingin ng higit pa tungkol sa APIClientArgs mas maaga sa "Pagtukoy ng Mga Parameter ng Koneksyon").

client_args = APIClientArgs(unsafe_auto_accept=True)

Mag-login sa API server

Π£ APIClient mayroong kasing dami ng 3 paraan ng pag-log in sa API server, at bawat isa sa kanila ay naaalala ang halaga Sid(session-id), na awtomatikong ginagamit sa bawat kasunod na API call sa header (ang pangalan sa header ng parameter na ito ay X-chkp-sid), kaya hindi na kailangang iproseso pa ang parameter na ito.

paraan ng pag-login

Pagpipilian gamit ang pag-login at password (sa halimbawa, ang username admin at password 1q2w3e ay ipinasa bilang mga positional na argumento):

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

Available din ang mga karagdagang opsyonal na parameter sa paraan ng pag-login, narito ang kanilang mga pangalan at default na halaga:

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

login_with_api_key method

Opsyon gamit ang isang api key (sinusuportahan mula noong bersyon ng pamamahala na R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA=" ito ang halaga ng API key para sa isa sa mga user sa management server gamit ang API key authorization method):

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

Sa pamamaraan login_with_api_key ang parehong mga opsyonal na parameter ay magagamit tulad ng sa pamamaraan login.

login_as_root method

Pagpipilian upang mag-login sa isang lokal na makina na may API server:

     login = client.login_as_root()

Dalawang opsyonal na parameter lamang ang magagamit para sa pamamaraang ito:

domain=None, payload=None

At sa wakas, tinawag ng API ang kanilang sarili

Mayroon kaming dalawang opsyon para sa paggawa ng mga tawag sa API sa pamamagitan ng mga pamamaraan api_call ΠΈ api_query. Tingnan natin kung ano ang pagkakaiba sa pagitan nila.

api_call

Ang pamamaraang ito ay naaangkop sa anumang mga tawag. Kailangan nating ipasa ang huling bahagi para sa api call at payload sa request body kung kinakailangan. Kung walang laman ang payload, hindi ito mailipat sa lahat:

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

Ang output para sa kahilingang ito sa ilalim ng cut:

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'})

Ang output para sa kahilingang ito sa ilalim ng cut:

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

Magsasagawa ako kaagad ng reserbasyon na ang paraang ito ay naaangkop lamang para sa mga tawag na ang output ay nagpapahiwatig ng isang offset (shift). Ang ganitong konklusyon ay nangyayari kapag naglalaman ito o maaaring naglalaman ng malaking halaga ng impormasyon. Halimbawa, maaaring ito ay isang kahilingan para sa isang listahan ng lahat ng nilikhang object ng uri ng host sa server ng pamamahala. Para sa mga naturang kahilingan, ang API ay nagbabalik ng isang listahan ng 50 mga bagay bilang default (maaari mong taasan ang limitasyon sa 500 mga bagay sa tugon). At upang hindi makuha ang impormasyon nang maraming beses, binabago ang offset na parameter sa kahilingan ng API, mayroong isang api_query na paraan na awtomatikong ginagawa ito. Mga halimbawa ng mga tawag kung saan kailangan ang paraang ito: mga show-session, show-host, show-network, show-wildcard, show-group, show-address-range, show-simple-gateway, show-simple-cluster, show-access-role, show-trusted-clients, ipakita ang mga pakete. Sa katunayan, sa pangalan ng mga API na tawag na ito, nakikita namin ang mga salita sa maramihan, kaya ang mga tawag na ito ay magiging mas madaling iproseso sa pamamagitan ng api_query

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

Ang output para sa kahilingang ito sa ilalim ng cut:

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
})

Pangangasiwa sa mga resulta ng mga tawag sa API

Pagkatapos nito, maaari mong gamitin ang mga variable at pamamaraan ng klase APIResponse(kapwa sa loob ng tagapamahala ng konteksto at sa labas). Sa klase APIResponse 4 na mga pamamaraan at 5 mga variable ang paunang natukoy, tatalakayin natin ang pinakamahalagang mga bagay nang mas detalyado.

Pinasimple ang Check Point API gamit ang Python SDK

tagumpay

Upang magsimula, mainam na tiyaking matagumpay ang tawag sa API at nagbalik ng resulta. May paraan para dito tagumpay:

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

Nagbabalik ng True kung ang API call ay matagumpay (response code - 200) at False kung hindi matagumpay (anumang ibang response code). Maginhawang gamitin kaagad pagkatapos ng tawag sa API upang magpakita ng iba't ibang impormasyon depende sa code ng pagtugon.

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

code ng katayuan

Ibinabalik ang response code pagkatapos maisagawa ang isang API call.

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

Mga posibleng sagot na code: 200,400,401,403,404,409,500,501.

set_success_status

Sa kasong ito, maaaring kailanganin na baguhin ang halaga ng katayuan ng tagumpay. Sa teknikal, maaari kang maglagay ng kahit ano doon, kahit isang regular na string. Ngunit ang isang tunay na halimbawa ay ang pag-reset ng ibinigay na parameter sa False sa ilalim ng ilang partikular na kasamang kundisyon. Sa ibaba, bigyang pansin ang halimbawa kapag may mga gawain na tumatakbo sa server ng pamamahala, ngunit ituturing naming hindi matagumpay ang kahilingang ito (itatakda namin ang variable ng tagumpay sa Huwad, kahit na matagumpay ang tawag sa API at nagbalik ng 200 code).

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

tugon()

Binibigyang-daan ka ng paraan ng pagtugon na tingnan ang diksyunaryo na may response code (status_code) at ang response body (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']}}

data

Binibigyang-daan kang makita lamang ang katawan ng tugon (katawan) nang walang hindi kinakailangang impormasyon.

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']}

maling mensahe

Available lang ang impormasyong ito kapag may naganap na error habang pinoproseso ang kahilingan sa API (response code hindi 200). Halimbawa ng output

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

Mga kapaki-pakinabang na halimbawa

Ang mga sumusunod ay mga halimbawa na gumagamit ng mga tawag sa API na idinagdag sa 1.6 na bersyon ng Management API.

Una, tingnan natin kung paano gumagana ang mga tawag. add-host ΠΈ add-address-range. Ipagpalagay na kailangan nating likhain ang lahat ng ip address ng subnet 192.168.0.0/24 bilang mga object ng uri ng host, ang huling octet ay 5, at isulat ang lahat ng natitirang ip address bilang mga object ng uri ng hanay ng address. Sa kasong ito, ibukod ang subnet address at ang broadcast address.

Kaya, nasa ibaba ang isang script na lumulutas sa problemang ito at lumilikha ng 50 object ng host type at 51 object ng address range type. Ang mga 101 API na tawag ay kinakailangan upang malutas ang problema (hindi binibilang ang huling publish na tawag). Gayundin, gamit ang timeit module, kinakalkula namin ang oras upang maisagawa ang script hanggang sa mai-publish ang mga pagbabago.

Script gamit ang add-host at 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')

Sa aking kapaligiran sa lab, ang script na ito ay tumatagal sa pagitan ng 30 at 50 segundo upang makumpleto, depende sa pag-load sa server ng pamamahala.

At ngayon tingnan natin kung paano lutasin ang parehong problema gamit ang API call add-objects-batch, suporta kung saan idinagdag sa bersyon 1.6 ng API. Binibigyang-daan ka ng tawag na ito na lumikha ng maraming bagay nang sabay-sabay sa isang kahilingan sa API. Bukod dito, ang mga ito ay maaaring mga bagay na may iba't ibang uri (halimbawa, mga host, subnet at hanay ng address). Kaya, ang aming gawain ay maaaring malutas sa loob ng isang tawag sa API.

Script gamit ang 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')

At sa aking kapaligiran sa lab, ang script na ito ay tumatagal mula 3 hanggang 7 segundo upang maisagawa, depende sa pag-load sa server ng pamamahala. Iyon ay, sa karaniwan, sa 101 API object, ang isang tawag ng batch type ay 10 beses na mas mabilis. Sa higit pang mga bagay, ang pagkakaiba ay magiging mas kahanga-hanga.

Ngayon tingnan natin kung paano magtrabaho set-objects-batch. Sa API call na ito, maaari naming bultuhang baguhin ang anumang parameter. Itakda natin ang unang kalahati ng mga address mula sa nakaraang halimbawa (hanggang sa .124 na mga host, at ang mga hanay din) upang maging sienna, at ang pangalawang kalahati ng mga address ay khaki.

Pagbabago ng kulay ng mga bagay na nilikha sa nakaraang halimbawa

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")

Maaari kang magtanggal ng maraming bagay sa isang API na tawag gamit delete-objects-batch. At ngayon, tingnan natin ang isang halimbawa ng code na nag-aalis sa lahat ng mga host na ginawa nang mas maaga add-objects-batch.

Pagtanggal ng mga bagay na may 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)

Lahat ng feature na lumalabas sa mga bagong release ng Check Point software ay agad na nakakakuha ng mga API call. Kaya, sa R80.40, lumitaw ang mga "feature" tulad ng Revert to revision at Smart Task, at ang mga katumbas na API call ay inihanda kaagad para sa kanila. Bukod dito, lahat ng functionality kapag lumipat mula sa Legacy consoles patungo sa Unified Policy mode ay nakakakuha din ng suporta sa API. Halimbawa, ang pinakahihintay na update sa bersyon ng software na R80.40 ay ang paglipat ng HTTPS Inspection policy mula sa Legacy mode patungo sa Unified Policy mode, at ang functionality na ito ay nakatanggap kaagad ng mga API call. Narito ang isang halimbawa ng code na nagdaragdag ng panuntunan sa pinakamataas na posisyon ng patakaran sa Pag-inspeksyon ng HTTPS na nagbubukod ng 3 kategorya mula sa inspeksyon (Health, Finance, Public Services), na ipinagbabawal sa inspeksyon alinsunod sa mga batas sa ilang bansa.

Magdagdag ng Panuntunan sa Patakaran sa Pag-inspeksyon ng 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")

Pagpapatakbo ng Python Scripts sa Check Point Management Server

Lahat sa parehong README.md naglalaman ng impormasyon kung paano direktang magpatakbo ng mga script ng Python mula sa server ng pamamahala. Maaari itong maging madaling gamitin kapag hindi ka makakonekta sa API server mula sa isa pang makina. Nag-record ako ng anim na minutong video kung saan isinasaalang-alang ko ang pag-install ng module cpapi at mga tampok ng pagpapatakbo ng mga script ng Python sa control server. Bilang halimbawa, pinapatakbo ang isang script na nag-automate sa pagsasaayos ng isang bagong gateway para sa isang gawain tulad ng pag-audit sa isang network Security CheckUp. Sa mga tampok na kailangan kong harapin: sa bersyon ng Python 2.7, ang function ay hindi pa lumitaw input, kaya para maproseso ang impormasyong ipinasok ng user, ginagamit ang function raw input. Kung hindi man, ang code ay kapareho ng para sa pagtakbo mula sa iba pang mga makina, tanging ito ay mas maginhawang gamitin ang function login_as_root, upang hindi matukoy muli ang iyong sariling username, password at IP address ng server ng pamamahala.

Script para sa mabilis na configuration ng 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()

Isang halimbawa ng file na may diksyonaryo ng password additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","ΠΏΠ°Ρ€ΠΎΠ»ΡŒ","ΠŸΠ°Ρ€ΠΎΠ»ΡŒ","ΠšΠ»ΡŽΡ‡","ΠΊΠ»ΡŽΡ‡","ΡˆΠΈΡ„Ρ€","Π¨ΠΈΡ„Ρ€"] }

Konklusyon

Ang artikulong ito ay sumasaklaw lamang sa mga pangunahing tampok ng trabaho Python SDK at modyul cpapi(tulad ng maaari mong hulaan, ang mga ito ay talagang kasingkahulugan), at sa pamamagitan ng pag-aaral ng code sa modyul na ito, matutuklasan mo ang higit pang mga posibilidad para sa paggamit nito. Posible na magkakaroon ka ng pagnanais na dagdagan ito ng iyong sariling mga klase, function, pamamaraan at variable. Maaari mong ibahagi ang iyong trabaho anumang oras at tingnan ang iba pang mga script para sa Check Point sa seksyon codehub sa komunidad CheckMates, na pinagsasama ang parehong mga developer ng produkto at mga user.

Happy coding at salamat sa pagbabasa hanggang dulo!

Pinagmulan: www.habr.com

Magdagdag ng komento