Is-simplifikazzjoni tal-API Check Point bil-Python SDK

Is-simplifikazzjoni tal-API Check Point bil-Python SDKIl-qawwa sħiħa tal-interazzjoni mal-APIs tiġi żvelata meta tintuża flimkien mal-kodiċi tal-programm, meta jsir possibbli li jiġu ġġenerati b'mod dinamiku talbiet tal-API u għodod għall-analiżi tar-risponsi tal-API. Madankollu, xorta tibqa' ma tinnotax Kit ta' Żvilupp tas-Softwer Python (minn hawn 'il quddiem imsejħa Python SDK) għal Check Point Management API, imma għalxejn. Jissimplifika b'mod sinifikanti l-ħajja tal-iżviluppaturi u d-dilettanti tal-awtomazzjoni. Python kiseb popolarità enormi dan l-aħħar u ddeċidejt li timla l-vojt u nirrevedi l-karatteristiċi ewlenin. Check Point API Python Development Kit. Dan l-artiklu jservi bħala żieda eċċellenti għal artiklu ieħor dwar Habré Check Point R80.10 API. Ġestjoni permezz ta 'CLI, skripts u aktar. Aħna ser inħarsu lejn kif tikteb skripts bl-użu tal-Python SDK u nagħtu ħarsa aktar mill-qrib lejn il-funzjonalità l-ġdida tal-Management API fil-verżjoni 1.6 (sostnjata li tibda minn R80.40). Biex tifhem l-artiklu, ser ikollok bżonn għarfien bażiku dwar kif taħdem ma 'APIs u Python.

Check Point qed jiżviluppa b'mod attiv l-API u bħalissa ġew rilaxxati dawn li ġejjin:

Il-Python SDK bħalissa jappoġġja biss l-interazzjoni mal-API tal-Ġestjoni u Gaia API. Aħna se nħarsu lejn l-aktar klassijiet, metodi u varjabbli importanti f'dan il-modulu.

Is-simplifikazzjoni tal-API Check Point bil-Python SDK

Installazzjoni tal-modulu

Modulu cpapi jinstalla malajr u faċilment minn repożitorju uffiċjali ta' Check Point fuq github bl-għajnuna pip. Istruzzjonijiet dettaljati għall-installazzjoni huma disponibbli fi README.md. Dan il-modulu huwa adattat biex jaħdem mal-verżjonijiet Python 2.7 u 3.7. F'dan l-artikolu, se jingħataw eżempji bl-użu ta' Python 3.7. Madankollu, il-Python SDK jista 'jitħaddem direttament mis-Server ta' Ġestjoni tal-Punt ta 'Check (Ġestjoni Intelliġenti), iżda jappoġġjaw biss Python 2.7, għalhekk l-aħħar taqsima se tipprovdi kodiċi għall-verżjoni 2.7. Immedjatament wara l-installazzjoni tal-modulu, nirrakkomanda li tħares lejn l-eżempji fid-direttorji examples_python2 и examples_python3.

Getting Started

Sabiex inkunu nistgħu naħdmu mal-komponenti tal-modulu cpapi, għandna bżonn nimportaw mill-modulu cpapi mill-inqas żewġ klassijiet meħtieġa:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Klassi APIClientArgs huwa responsabbli għall-parametri tal-konnessjoni mas-server tal-API, u l-klassi APIClient huwa responsabbli għall-interazzjoni mal-API.

Determinazzjoni tal-parametri tal-konnessjoni

Biex tiddefinixxi diversi parametri għall-konnessjoni mal-API, trid toħloq istanza tal-klassi APIClientArgs. Fil-prinċipju, il-parametri tiegħu huma predefiniti u meta tħaddem l-iskrittura fuq is-server tal-kontroll, m'għandhomx għalfejn jiġu speċifikati.

client_args = APIClientArgs()

Iżda meta taħdem fuq host ta 'parti terza, trid tispeċifika mill-inqas l-indirizz IP jew l-isem tal-host tas-server tal-API (magħruf ukoll bħala s-server tal-ġestjoni). Fl-eżempju hawn taħt, aħna niddefinixxu l-parametru tal-konnessjoni tas-server u nassenjawh l-indirizz IP tas-server tal-ġestjoni bħala string.

client_args = APIClientArgs(server='192.168.47.241')

Ejja nħarsu lejn il-parametri kollha u l-valuri awtomatiċi tagħhom li jistgħu jintużaw meta tikkonnettja mas-server API:

Argumenti tal-metodu __init__ tal-klassi 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

Nemmen li l-argumenti li jistgħu jintużaw f'każijiet tal-klassi APIClientArgs huma intuwittivi għall-amministraturi ta 'Check Point u ma jeħtieġux kummenti addizzjonali.

Konnessjoni permezz tal-APIClient u l-maniġer tal-kuntest

Klassi APIClient L-aktar mod konvenjenti biex tużah huwa permezz tal-maniġer tal-kuntest. Dak kollu li jeħtieġ li jiġi mgħoddi lil istanza tal-klassi APIClient huma l-parametri tal-konnessjoni li ġew definiti fil-pass preċedenti.

with APIClient(client_args) as client:

Il-maniġer tal-kuntest mhux se jagħmel awtomatikament sejħa tal-login lis-server tal-API, iżda jagħmel sejħa tal-logout meta joħroġ minnu. Jekk għal xi raġuni l-logout ma jkunx meħtieġ wara li tispiċċa taħdem mas-sejħiet API, trid tibda taħdem mingħajr ma tuża l-maniġer tal-kuntest:

client = APIClient(clieng_args)

Test tal-konnessjoni

L-eħfef mod biex tivverifika jekk il-konnessjoni tissodisfax il-parametri speċifikati qed tuża l-metodu check_fingerprint. Jekk il-verifika tas-somma hash sha1 għall-marki tas-swaba' taċ-ċertifikat API tas-server tfalli (il-metodu rritornat False), allura dan ġeneralment ikun ikkawżat minn problemi ta 'konnessjoni u nistgħu nwaqqfu l-eżekuzzjoni tal-programm (jew nagħtu lill-utent l-opportunità li jikkoreġi d-dejta tal-konnessjoni):

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

Jekk jogħġbok innota li fil-futur il-klassi APIClient se jiċċekkja kull sejħa API (metodi api_call и api_query, nitkellmu dwarhom ftit aktar) ċertifikat tal-marki tas-swaba’ sha1 fuq is-server tal-API. Imma jekk, meta tiċċekkja l-marki tas-swaba 'sha1 taċ-ċertifikat tas-server API, jiġi skopert żball (iċ-ċertifikat mhux magħruf jew inbidel), il-metodu check_fingerprint se tipprovdi l-opportunità li żżid/tbiddel informazzjoni dwarha fuq il-magna lokali awtomatikament. Dan il-kontroll jista' jiġi diżattivat kompletament (iżda dan jista' jiġi rrakkomandat biss jekk l-iskripts jitmexxew fuq is-server tal-API innifsu, meta tikkonnettja ma' 127.0.0.1), bl-użu tal-argument APIClientArgs - unsafe_auto_accept (ara aktar dwar APIClientArgs aktar kmieni fi “Definizzjoni tal-parametri tal-konnessjoni”).

client_args = APIClientArgs(unsafe_auto_accept=True)

Idħol fis-server tal-API

У APIClient hemm daqs 3 metodi biex tidħol fis-server API, u kull wieħed minnhom jifhem it-tifsira sid(id-sessjoni), li tintuża awtomatikament f'kull sejħa API sussegwenti fl-intestatura (l-isem fl-intestatura ta' dan il-parametru huwa X-chkp-sid), għalhekk m'hemmx bżonn li jkompli jipproċessa dan il-parametru.

metodu ta' login

Għażla li tuża login u password (fl-eżempju, l-username admin u l-password 1q2w3e huma mgħoddija bħala argumenti pożizzjonali):

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

Parametri fakultattivi addizzjonali huma wkoll disponibbli fil-metodu tal-login; hawn huma l-ismijiet u l-valuri awtomatiċi tagħhom:

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

Metodu Login_with_api_key

Għażla li tuża ċavetta api (sostnjata li tibda mill-verżjoni tal-ġestjoni R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" dan huwa l-valur taċ-ċavetta tal-API għal wieħed mill-utenti fuq is-server tal-ġestjoni bil-metodu tal-awtorizzazzjoni taċ-ċavetta tal-API):

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

Fil-metodu login_with_api_key l-istess parametri fakultattivi huma disponibbli bħal fil-metodu login.

metodu login_as_root

Għażla li tidħol f'magna lokali b'server API:

     login = client.login_as_root()

Hemm biss żewġ parametri mhux obbligatorji disponibbli għal dan il-metodu:

domain=None, payload=None

U fl-aħħarnett l-API jsejħu lilhom infushom

Għandna żewġ għażliet biex nagħmlu sejħiet API permezz ta 'metodi api_call и api_query. Ejja naraw x'inhi d-differenza bejniethom.

api_call

Dan il-metodu huwa applikabbli għal kwalunkwe sejħiet. Irridu ngħaddu l-aħħar parti għas-sejħa api u t-tagħbija fil-korp tat-talba jekk meħtieġ. Jekk it-tagħbija hija vojta, allura ma tistax tiġi trasferita għal kollox:

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

Output għal din it-talba taħt il-qatgħa:

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 għal din it-talba taħt il-qatgħa:

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

Ħa nagħmel riżerva minnufih li dan il-metodu huwa applikabbli biss għal sejħiet li l-output tagħhom jinvolvi offset. Tali inferenza sseħħ meta jkun fiha jew jista’ jkun fiha ammont kbir ta’ informazzjoni. Pereżempju, din tista' tkun talba għal lista tal-oġġetti ospitanti kollha maħluqa fuq is-server tal-ġestjoni. Għal tali talbiet, l-API jirritorna lista ta '50 oġġett awtomatikament (tista' żżid il-limitu għal 500 oġġett fir-rispons). U sabiex ma tiġbedx l-informazzjoni diversi drabi, billi tbiddel il-parametru tal-offset fit-talba tal-API, hemm metodu api_query li jagħmel dan ix-xogħol awtomatikament. Eżempji ta' sejħiet fejn dan il-metodu huwa meħtieġ: sessjonijiet tal-ispettaklu, hosts tal-wiri, netwerks tal-wiri, wildcards tal-wiri, gruppi tal-wiri, firxiet tal-indirizzi tal-ispettaklu, gateways-sempliċi tal-wiri, raggruppamenti-sempliċi tal-wiri, rwoli-aċċess tal-wiri, klijenti-fidati-turi, Show-pakketti. Fil-fatt, naraw kliem plural f'isem dawn is-sejħiet API, għalhekk dawn is-sejħiet ikunu aktar faċli biex jiġu mmaniġġjati. api_query

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

Output għal din it-talba taħt il-qatgħa:

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

Ipproċessa r-riżultati tas-sejħiet API

Wara dan tista' tuża l-varjabbli u l-metodi tal-klassi APIRispons(kemm ġewwa l-maniġer tal-kuntest kif ukoll barra). Fil-klassi APIRispons 4 metodi u 5 varjabbli huma predefiniti; aħna se noqogħdu fuq dawk l-aktar importanti f'aktar dettall.

Is-simplifikazzjoni tal-API Check Point bil-Python SDK

suċċess

Biex tibda, tkun idea tajba li tiżgura li s-sejħa API kienet ta 'suċċess u rritornat riżultat. Hemm metodu għal dan suċċess:

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

Jirritorna Veru jekk is-sejħa API kienet ta' suċċess (kodiċi ta' rispons - 200) u Falza jekk ma rnexxiex (kwalunkwe kodiċi ta' rispons ieħor). Huwa konvenjenti li tuża immedjatament wara sejħa API biex turi informazzjoni differenti skont il-kodiċi tar-rispons.

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

statuscode

Jirritorna l-kodiċi tar-rispons wara li tkun saret sejħa API.

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

Kodiċi ta' rispons possibbli: 200,400,401,403,404,409,500,501.

set_success_status

F'dan il-każ, jista 'jkun meħtieġ li jinbidel il-valur tal-istatus ta' suċċess. Teknikament, tista 'tpoġġi xi ħaġa hemmhekk, anki spag regolari. Iżda eżempju reali jkun li dan il-parametru jerġa' jiġi ssettjat għal Falz taħt ċerti kundizzjonijiet ta' akkumpanjament. Hawn taħt, oqgħod attent għall-eżempju meta jkun hemm kompiti li qed jaħdmu fuq is-server tal-ġestjoni, iżda aħna se nqisu din it-talba ma tirnexxix (se nissettjaw il-varjabbli tas-suċċess għal False, minkejja l-fatt li s-sejħa API kienet ta’ suċċess u rritornat il-kodiċi 200).

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

risposta ()

Il-metodu tar-rispons jippermettilek tara d-dizzjunarju bil-kodiċi tar-rispons (status_code) u l-korp tar-rispons (korp).

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

Jippermettilek tara biss il-korp tar-rispons (korp) mingħajr informazzjoni bla bżonn.

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

Din l-informazzjoni hija disponibbli biss meta seħħ żball waqt l-ipproċessar tat-talba API (kodiċi ta’ rispons ebda 200). Eżempju ta' produzzjoni

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

Eżempji utli

Dawn li ġejjin huma eżempji li jużaw is-sejħiet API li ġew miżjuda fl-API ta' Ġestjoni 1.6.

L-ewwel, ejja nħarsu lejn kif jaħdmu sejħiet add-host и żid-firxa-indirizz. Ejja ngħidu li għandna bżonn noħolqu l-indirizzi IP kollha tas-subnet 192.168.0.0/24, li l-aħħar ottett tiegħu huwa 5, bħala oġġetti tat-tip ospitanti, u ikteb l-indirizzi IP l-oħra kollha bħala oġġetti tat-tip ta 'firxa ta' indirizzi. F'dan il-każ, eskludi l-indirizz tas-subnet u l-indirizz tax-xandir.

Allura, hawn taħt hemm skript li ssolvi din il-problema u joħloq 50 oġġett tat-tip ospitanti u 51 oġġett tat-tip ta 'firxa ta' indirizzi. Biex issolvi l-problema, huma meħtieġa 101 sejħiet API (mingħajr ma tingħadd is-sejħa finali tal-pubblikazzjoni). Ukoll, bl-użu tal-modulu timeit, aħna nikkalkulaw iż-żmien li tieħu biex tesegwixxi l-iskrittura sakemm il-bidliet jiġu ppubblikati.

Script bl-użu ta 'add-host u 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')

Fl-ambjent tal-laboratorju tiegħi, din l-iskrittura tieħu bejn 30 u 50 sekonda biex tesegwixxi, skont it-tagħbija fuq is-server tal-ġestjoni.

Issa ejja naraw kif issolvi l-istess problema billi tuża sejħa API żid-oġġetti-lott, li appoġġ għalih ġie miżjud fil-verżjoni API 1.6. Din is-sejħa tippermettilek toħloq ħafna oġġetti f'daqqa f'talba API waħda. Barra minn hekk, dawn jistgħu jkunu oġġetti ta' tipi differenti (pereżempju, hosts, subnets u meded ta' indirizzi). Għalhekk, il-kompitu tagħna jista 'jiġi solvut fil-qafas ta' sejħa API waħda.

Skript li juża 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')

U t-tħaddim ta 'dan l-iskript fl-ambjent tal-laboratorju tiegħi jieħu minn 3 sa 7 sekondi, skond it-tagħbija fuq is-server ta' ġestjoni. Jiġifieri, bħala medja, fuq 101 oġġett API, sejħa tat-tip ta 'lott taħdem 10 darbiet aktar malajr. Fuq numru akbar ta 'oġġetti d-differenza se tkun saħansitra aktar impressjonanti.

Issa ejja naraw kif taħdem magħhom sett-oġġetti-lott. Billi tuża din is-sejħa API, nistgħu nibdlu bl-ingrossa kwalunkwe parametru. Ejja nissettjaw l-ewwel nofs ta 'l-indirizzi mill-eżempju preċedenti (sa .124 hosts, u firxiet ukoll) għall-kulur sienna, u jassenja l-kulur kaki għat-tieni nofs ta' l-indirizzi.

Nibdlu l-kulur tal-oġġetti maħluqa fl-eżempju preċedenti

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

Tista 'tħassar oġġetti multipli f'sejħa API waħda bl-użu ħassar-oġġetti-lott. Issa ejja nħarsu lejn eżempju ta 'kodiċi li jħassar l-ospiti kollha maħluqa preċedentement permezz żid-oġġetti-lott.

Tħassir ta' oġġetti bl-użu ta' 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)

Il-funzjonijiet kollha li jidhru fir-rilaxxi ġodda tas-softwer Check Point jakkwistaw immedjatament sejħiet API. Għalhekk, f'R80.40 dehru "karatteristiċi" bħal Revert to reviżjoni u Smart Task, u sejħiet API korrispondenti tħejjew immedjatament għalihom. Barra minn hekk, il-funzjonalità kollha meta tiċċaqlaq minn Legacy consoles għall-mod Unified Policy wkoll takkwista appoġġ API. Pereżempju, l-aġġornament tant mistenni fil-verżjoni tas-softwer R80.40 kien iċ-ċaqliq tal-politika tal-Ispezzjoni HTTPS mill-modalità Legacy għall-modalità Politika Unifikata, u din il-funzjonalità immedjatament irċeviet sejħiet API. Hawn eżempju ta 'kodiċi li żżid regola mal-pożizzjoni ewlenija tal-politika ta' Spezzjoni HTTPS li teskludi 3 kategoriji mill-ispezzjoni (Saħħa, Finanzi, Servizzi tal-Gvern), li huma pprojbiti mill-ispezzjoni skont il-liġi f'numru ta 'pajjiżi.

Żid regola mal-politika ta' Spezzjoni 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")

Tmexxi skripts Python fuq is-server tal-ġestjoni tal-Check Point

Kollox huwa l-istess README.md fih informazzjoni dwar kif tħaddem skripts Python direttament mis-server tal-kontroll. Dan jista 'jkun konvenjenti meta ma tkunx tista' tikkonnettja mas-server API minn magna oħra. Irreġistrajt vidjo ta’ sitt minuti li fih inħares lejn l-installazzjoni tal-modulu cpapi u karatteristiċi tat-tħaddim ta' skripts Python fuq is-server tal-kontroll. Bħala eżempju, titħaddem skript li awtomatizza l-konfigurazzjoni ta' portal ġdid għal biċċa xogħol bħall-awditjar tan-netwerk Kontroll tas-Sigurtà. Fost il-karatteristiċi li kelli nittratta magħhom: il-funzjoni għadha ma dehritx f'Python 2.7 input, għalhekk biex tipproċessa l-informazzjoni li l-utent idaħħal, tintuża funzjoni raw_input. Inkella, il-kodiċi huwa l-istess bħal għat-tnedija minn magni oħra, biss huwa aktar konvenjenti li tuża l-funzjoni login_as_root, sabiex ma terġax tispeċifika l-isem tal-utent, il-password u l-indirizz IP tiegħek tas-server tal-ġestjoni.

Skript għal setup ta' malajr ta' 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()

Fajl ta' eżempju b'dizzjunarju password addizzjonali_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

Konklużjoni

Dan l-artikolu jeżamina biss il-possibbiltajiet bażiċi tax-xogħol Python SDK u modulu cpapi(kif tista' tkun qtajt, dawn huma fil-fatt sinonimi), u billi tistudja l-kodiċi f'dan il-modulu inti ser tiskopri saħansitra aktar opportunitajiet biex taħdem miegħu. Huwa possibbli li tkun trid tissupplimentaha bil-klassijiet, funzjonijiet, metodi u varjabbli tiegħek stess. Dejjem tista' taqsam ix-xogħol tiegħek u tara skripts oħra għal Check Point fit-taqsima CodeHub fil-komunità CheckMates, li tiġbor flimkien kemm l-iżviluppaturi tal-prodotti kif ukoll l-utenti.

Kodifikazzjoni kuntenta u grazzi tal-qari sal-aħħar!

Sors: www.habr.com

Żid kumment