Pagpasimple sa Check Point API gamit ang Python SDK

Pagpasimple sa Check Point API gamit ang Python SDKAng bug-os nga gahum sa interaksyon sa mga API gipadayag kung gigamit kauban ang code sa programa, kung mahimo na nga dinamikong makamugna ang mga hangyo sa API ug mga himan alang sa pag-analisar sa mga tubag sa API. Bisan pa, kini nagpabilin nga dili mamatikdan Python Software Development Kit (human niini gitawag nga Python SDK) alang sa Check Point Management API, apan kawang. Mahinungdanon nga gipasimple niini ang kinabuhi sa mga developer ug mga mahiligon sa automation. Ang Python nakakuha og dako nga pagkapopular karong bag-o ug nakahukom ako nga pun-on ang kal-ang ug susihon ang mga nag-unang bahin. Check Point API Python Development Kit. Kini nga artikulo nagsilbi nga usa ka maayo kaayo nga pagdugang sa laing artikulo sa Habré Check Point R80.10 API. Pagdumala pinaagi sa CLI, mga script ug uban pa. Atong tan-awon kung giunsa pagsulat ang mga script gamit ang Python SDK ug tan-awon pag-ayo ang bag-ong pagpaandar sa Management API sa bersyon 1.6 (gisuportahan sugod sa R80.40). Aron masabtan ang artikulo, kinahanglan nimo ang sukaranan nga kahibalo sa pagtrabaho kauban ang mga API ug Python.

Ang Check Point aktibo nga nagpalambo sa API ug sa pagkakaron ang mosunod nga gipagawas:

Ang Python SDK sa pagkakaron nagsuporta lamang sa interaksyon sa Management API ug Gaia API. Atong tan-awon ang labing hinungdanon nga mga klase, pamaagi ug mga variable sa kini nga module.

Pagpasimple sa Check Point API gamit ang Python SDK

Pag-instalar sa module

Modyul cpapi instalar dali ug sayon ​​gikan sa opisyal nga Check Point repository sa github sa panabang pip. Ang detalyado nga mga panudlo sa pag-install anaa sa README.md. Kini nga module gipasibo aron magamit sa Python nga bersyon 2.7 ug 3.7. Niini nga artikulo, ang mga pananglitan ihatag gamit ang Python 3.7. Bisan pa, ang Python SDK mahimong direkta nga ipadagan gikan sa Check Point Management Server (Smart Management), apan gisuportahan lamang nila ang Python 2.7, mao nga ang katapusan nga seksyon maghatag code alang sa bersyon 2.7. Diha-diha dayon pagkahuman sa pag-instalar sa module, girekomenda nako ang pagtan-aw sa mga pananglitan sa mga direktoryo examples_python2 и examples_python3.

Pagsugod

Aron makahimo kami sa pagtrabaho uban sa mga sangkap sa cpapi module, kinahanglan namon nga mag-import gikan sa module cpapi labing menos duha ka gikinahanglan nga mga klase:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Класс APIClientArgs responsable sa mga parameter sa koneksyon sa API server, ug ang klase APIClient responsable sa pakig-uban sa API.

Pagtino sa mga parameter sa koneksyon

Aron mahibal-an ang lainlaing mga parameter alang sa pagkonektar sa API, kinahanglan nimo nga maghimo usa ka pananglitan sa klase APIClientArgs. Sa prinsipyo, ang mga parameter niini gitakda nang daan ug kung gipadagan ang script sa control server, dili nila kinahanglan nga itakda.

client_args = APIClientArgs()

Apan kung nagdagan sa usa ka ikatulo nga partido nga host, kinahanglan nimo nga ipiho ang labing menos ang IP address o ngalan sa host sa API server (nailhan usab nga server sa pagdumala). Sa pananglitan sa ubos, among gihubit ang parameter sa koneksyon sa server ug gi-assign kini sa IP address sa management server isip usa ka string.

client_args = APIClientArgs(server='192.168.47.241')

Atong tan-awon ang tanan nga mga parameter ug ang ilang mga default nga kantidad nga magamit kung magkonektar sa API server:

Mga argumento sa __init__ nga pamaagi sa APIClientArgs nga klase

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

Nagtuo ako nga ang mga argumento nga magamit sa mga higayon sa klase sa APIClientArgs intuitive sa mga tagdumala sa Check Point ug wala magkinahanglan dugang nga mga komento.

Pagkonektar pinaagi sa APIClient ug tagdumala sa konteksto

Класс APIClient Ang labing sayon ​​​​nga paagi sa paggamit niini mao ang pinaagi sa tagdumala sa konteksto. Ang tanan nga kinahanglan ipasa sa usa ka pananglitan sa klase sa APIClient mao ang mga parameter sa koneksyon nga gihubit sa miaging lakang.

with APIClient(client_args) as client:

Ang tagdumala sa konteksto dili awtomatik nga maghimo usa ka tawag sa pag-login sa API server, apan maghimo kini usa ka tawag sa pag-logout kung mag-log out. Kung tungod sa pipila ka hinungdan dili kinahanglan ang pag-logout pagkahuman sa pagtrabaho sa mga tawag sa API, kinahanglan nimo nga magsugod sa pagtrabaho nga wala gigamit ang tagdumala sa konteksto:

client = APIClient(clieng_args)

Pagsusi sa koneksyon

Ang labing kadali nga paagi aron masusi kung ang koneksyon nakab-ot sa gitakda nga mga parameter mao ang paggamit sa pamaagi check_fingerprint. Kung ang pag-verify sa sha1 hash sum para sa fingerprint sa server API certificate mapakyas (ang pamaagi gibalik bakak nga mga), nan kini kasagaran tungod sa mga problema sa koneksyon ug mahimo natong hunongon ang pagpatuman sa programa (o hatagan ang tiggamit og oportunidad sa pagtul-id sa data sa koneksyon):

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

Palihug timan-i nga sa umaabot nga klase APIClient susihon ang matag tawag sa API (pamaagi api_tawag и api_query, maghisgot pa kami bahin kanila) sha1 fingerprint certificate sa API server. Apan kung, kung gisusi ang sha1 fingerprint sa sertipiko sa server sa API, usa ka sayup ang nakit-an (ang sertipiko wala nahibal-an o giusab), ang pamaagi check_fingerprint maghatag ug kahigayonan sa pagdugang/pag-usab sa impormasyon bahin niini sa lokal nga makina awtomatik. Kini nga tseke mahimong hingpit nga ma-disable (apan kini mahimo lamang nga irekomenda kung ang mga script gipadagan sa API server mismo, kung nagkonektar sa 127.0.0.1), gamit ang argumento sa APIClientArgs - unsafe_auto_accept (tan-awa ang dugang bahin sa APIClientArgs sa sayo pa sa "Pagtino sa mga parameter sa koneksyon").

client_args = APIClientArgs(unsafe_auto_accept=True)

Login sa API server

У APIClient adunay ingon ka daghan sa 3 nga mga pamaagi sa pag-log in sa API server, ug ang matag usa kanila nakasabut sa kahulogan sid(session-id), nga awtomatiko nga gigamit sa matag sunod nga tawag sa API sa header (ang ngalan sa header niini nga parameter mao ang X-chkp-sid), busa dili na kinahanglan nga iproseso pa kini nga parameter.

pamaagi sa pag-login

Opsyon gamit ang login ug password (sa pananglitan, ang username admin ug password 1q2w3e gipasa isip positional arguments):

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

Ang dugang nga opsyonal nga mga parameter anaa usab sa pamaagi sa pag-login; ania ang ilang mga ngalan ug default nga mga bili:

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

Login_with_api_key nga pamaagi

Opsyon gamit ang api key (gisuportahan sugod sa management version R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA=" kini ang API key value para sa usa sa mga user sa management server nga adunay API key authorization method):

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

Sa pamaagi login_with_api_key ang parehas nga opsyonal nga mga parameter anaa sama sa pamaagi sulod.

login_as_root nga pamaagi

Opsyon sa pag-login sa usa ka lokal nga makina nga adunay API server:

     login = client.login_as_root()

Adunay duha lamang ka opsyonal nga mga parameter nga magamit alang niini nga pamaagi:

domain=None, payload=None

Ug sa katapusan ang API nagtawag sa ilang kaugalingon

Adunay kami duha ka kapilian sa paghimo sa mga tawag sa API pinaagi sa mga pamaagi api_tawag и api_query. Atong tan-awon kon unsa ang kalainan tali kanila.

api_tawag

Kini nga pamaagi magamit sa bisan unsang mga tawag. Kinahanglan namong ipasa ang kataposang bahin para sa api call ug payload sa request body kon gikinahanglan. Kung walay sulod ang payload, nan dili na kini mabalhin:

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

Output alang niini nga hangyo ubos sa 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'})

Output alang niini nga hangyo ubos sa 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

Tugoti ako nga maghimo dayon og reserbasyon nga kini nga pamaagi magamit lamang sa mga tawag nga ang output naglakip sa offset. Ang ingon nga inference mahitabo kung kini adunay o mahimo nga adunay daghang kasayuran. Pananglitan, mahimo kini nga usa ka hangyo alang sa usa ka lista sa tanan nga gibuhat nga mga butang sa host sa server sa pagdumala. Alang sa ingon nga mga hangyo, ang API nagbalik sa usa ka lista sa 50 nga mga butang nga default (mahimo nimong madugangan ang limitasyon sa 500 nga mga butang sa tubag). Ug aron dili mabira ang impormasyon sa makadaghang higayon, nga mag-usab sa offset parameter sa API request, adunay api_query nga pamaagi nga awtomatiko kining trabaho. Mga pananglitan sa mga tawag diin kini nga pamaagi gikinahanglan: 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, show-packages. Sa tinuud, nakita namon ang plural nga mga pulong sa ngalan sa kini nga mga tawag sa API, aron kini nga mga tawag mas dali nga madumala api_query

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

Output alang niini nga hangyo ubos sa 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
})

Pagproseso sa mga resulta sa mga tawag sa API

Pagkahuman niini mahimo nimong gamiton ang mga variable ug pamaagi sa klase APIResponse(sa sulod sa tagdumala sa konteksto ug sa gawas). Sa klase APIResponse 4 nga mga pamaagi ug 5 nga mga baryable ang gitakda nang daan; atong hisgotan ang labing importante nga mga butang sa mas detalyado.

Pagpasimple sa Check Point API gamit ang Python SDK

kalampusan

Sa pagsugod, maayo nga ideya ang pagsiguro nga ang tawag sa API malampuson ug nagbalik usa ka resulta. Adunay usa ka pamaagi alang niini kalampusan:

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

Mobalik nga Tinuod kung ang tawag sa API malampuson (kodigo sa pagtubag - 200) ug Bakak kung dili malampuson (bisan unsang lain nga code sa pagtubag). Kombenyente nga gamiton dayon pagkahuman sa usa ka tawag sa API aron ipakita ang lainlaing kasayuran depende sa code sa tubag.

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

statuscode

Ibalik ang tubag nga code pagkahuman nahimo ang usa ka tawag sa API.

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

Posible nga mga code sa pagtubag: 200,400,401,403,404,409,500,501.

set_success_status

Sa kini nga kaso, mahimo’g kinahanglan nga usbon ang kantidad sa kahimtang sa kalampusan. Sa teknikal, mahimo nimong ibutang ang bisan unsa didto, bisan usa ka regular nga hilo. Apan ang usa ka tinuod nga pananglitan mao ang pag-reset niini nga parameter sa False ubos sa pipila ka kauban nga mga kondisyon. Sa ubos, hatagi'g pagtagad ang panig-ingnan kung adunay mga buluhaton nga nagdagan sa server sa pagdumala, apan among ikonsiderar kini nga hangyo nga wala magmalampuson (atong ibutang ang variable nga kalampusan sa bakak nga mga, bisan pa sa kamatuoran nga ang tawag sa API malampuson ug gibalik ang code 200).

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

tubag()

Ang paagi sa pagtubag nagtugot kanimo sa pagtan-aw sa diksyonaryo nga adunay tubag nga code (status_code) ug ang tubag nga lawas (lawas).

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

nga data

Nagtugot kanimo nga makita lamang ang lawas sa tubag (lawas) nga wala’y kinahanglan nga kasayuran.

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

error_message

Kini nga kasayuran magamit lamang kung adunay usa ka sayup nga nahitabo samtang nagproseso sa hangyo sa API (response code dili 200). Pananglitan nga output

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

Mapuslanon nga mga pananglitan

Ang mosunod mao ang mga pananglitan nga naggamit sa mga tawag sa API nga gidugang sa Management API 1.6.

Una, atong tan-awon kon sa unsang paagi ang mga tawag nagtrabaho add-host и add-address-range. Ingnon ta nga kinahanglan natong mugnaon ang tanang IP address sa subnet nga 192.168.0.0/24, ang kataposang octet niini mao ang 5, isip mga butang sa host type, ug isulat ang tanang ubang IP address isip mga butang sa address range type. Sa kini nga kaso, dili iapil ang subnet address ug broadcast address.

Busa, sa ubos mao ang usa ka script nga nagsulbad niini nga problema ug nagmugna og 50 ka butang sa host type ug 51 ka butang sa address range type. Aron masulbad ang problema, gikinahanglan ang 101 ka mga tawag sa API (dili pag-ihap sa katapusang tawag sa pagmantala). Usab, gamit ang timeit module, among kuwentahon ang oras nga gikinahanglan aron ma-execute ang script hangtod mamantala ang mga kausaban.

Script gamit ang add-host ug 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 akong lab nga palibot, kini nga script nagkinahanglan sa taliwala sa 30 ug 50 segundos aron ma-execute, depende sa load sa management server.

Karon tan-awon naton kung giunsa pagsulbad ang parehas nga problema gamit ang usa ka tawag sa API add-objects-batch, suporta nga gidugang sa bersyon sa API 1.6. Kini nga tawag nagtugot kanimo sa paghimo og daghang mga butang nga dungan sa usa ka hangyo sa API. Dugang pa, kini mahimo nga mga butang sa lain-laing mga matang (pananglitan, mga host, subnet ug address range). Busa, ang atong buluhaton mahimong masulbad sulod sa gambalay sa usa ka 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')

Ug ang pagpadagan niini nga script sa akong lab environment nagkinahanglan gikan sa 3 ngadto sa 7 segundos, depende sa load sa management server. Kana mao, sa kasagaran, sa 101 ka mga butang sa API, ang usa ka batch type nga tawag modagan 10 ka beses nga mas paspas. Sa mas daghang gidaghanon sa mga butang ang kalainan mahimong mas impresibo.

Karon atong tan-awon kon sa unsang paagi sa pagtrabaho uban sa set-objects-batch. Gamit kini nga tawag sa API, mahimo natong usbon ang bisan unsang parameter. Atong ibutang ang unang katunga sa mga adres gikan sa miaging pananglitan (hangtod sa .124 nga mga host, ug mga han-ay usab) ngadto sa kolor nga sienna, ug i-assign ang kolor nga khaki sa ikaduhang katunga sa mga adres.

Pag-usab sa kolor sa mga butang nga gihimo sa miaging pananglitan

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

Mahimo nimong mapapas ang daghang mga butang sa usa ka tawag sa API gamit delete-objects-batch. Karon atong tan-awon ang usa ka pananglitan sa code nga nagtangtang sa tanan nga mga host nga gihimo kaniadto pinaagi sa add-objects-batch.

Pagtangtang sa mga butang gamit ang 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)

Ang tanan nga mga gimbuhaton nga makita sa mga bag-ong pagpagawas sa Check Point software dali nga makakuha mga tawag sa API. Busa, sa R80.40 ang maong "mga feature" sama sa Revert to revision ug Smart Task nagpakita, ug ang katugbang nga mga tawag sa API giandam dayon alang kanila. Dugang pa, ang tanan nga pag-andar kung mobalhin gikan sa Legacy consoles hangtod sa Unified Policy mode nakakuha usab suporta sa API. Pananglitan, ang dugay nang gipaabot nga update sa software version R80.40 mao ang pagbalhin sa HTTPS Inspection policy gikan sa Legacy mode ngadto sa Unified Policy mode, ug kini nga functionality nakadawat dayon og API calls. Ania ang usa ka pananglitan sa code nga nagdugang usa ka lagda sa taas nga posisyon sa HTTPS Inspection nga palisiya nga wala maglakip sa 3 nga mga kategorya gikan sa inspeksyon (Health, Finance, Government Services), nga gidid-an sa pag-inspeksyon subay sa balaod sa daghang mga nasud.

Pagdugang usa ka lagda sa polisiya sa Pag-inspeksyon sa 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")

Pagpadagan sa mga script sa Python sa server sa pagdumala sa Check Point

Ang tanan managsama ra README.md adunay impormasyon kon unsaon pagpadagan ang mga script sa Python direkta gikan sa control server. Mahimong sayon ​​​​kini kung dili ka makakonektar sa API server gikan sa laing makina. Nagrekord ko og unom ka minuto nga video diin akong gitan-aw ang pag-instalar sa module cpapi ug mga bahin sa pagpadagan sa mga script sa Python sa control server. Ingon pananglitan, usa ka script ang gipadagan nga nag-automate sa pag-configure sa usa ka bag-ong ganghaan alang sa usa ka buluhaton sama sa pag-audit sa network Pagsusi sa Seguridad. Lakip sa mga bahin nga kinahanglan nakong atubangon: ang function wala pa makita sa Python 2.7 input, aron maproseso ang impormasyon nga gisulod sa user, usa ka function ang gigamit raw_input. Kung dili, ang code parehas sa paglansad gikan sa ubang mga makina, labi ka dali nga gamiton ang function login_as_root, aron dili ipiho ang imong kaugalingong username, password ug IP address sa management server pag-usab.

Script para sa dali nga setup sa 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()

Usa ka pananglitan nga file nga adunay password nga diksyonaryo additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

konklusyon

Kini nga artikulo nagsusi lamang sa sukaranang mga posibilidad sa trabaho Python SDK ug module cpapi(sumala sa imong natag-an, kini sa tinuod nga mga synonyms), ug pinaagi sa pagtuon sa code niini nga modyul madiskobrehan nimo ang daghang mga posibilidad sa pagtrabaho niini. Posible nga gusto nimo nga dugangan kini sa imong kaugalingon nga mga klase, gimbuhaton, pamaagi ug mga variable. Mahimo nimong ipaambit kanunay ang imong trabaho ug tan-awon ang ubang mga script para sa Check Point sa seksyon CodeHub sa komunidad CheckMates, nga naghiusa sa mga nag-develop ug tiggamit sa produkto.

Malipayon nga coding ug salamat sa pagbasa hangtod sa katapusan!

Source: www.habr.com

Idugang sa usa ka comment