Lihtsustame tööd Check Point API-ga, kasutades Python SDK-d

Lihtsustame tööd Check Point API-ga, kasutades Python SDK-dKogu API vĂ”imekus avatakse koostöös programmikoodiga, vĂ”imaldades dĂŒnaamiliselt luua API pĂ€ringuid ja tööriistu API vastuste analĂŒĂŒsimiseks. Kuid seni on vĂ€hem mĂ€rgatud Python'i tarkvaraarenduse komplekti (edaspidi — Python SDK) for Check Point Management API, mida on kahju. See muudab arendajate ja automatiseerimise entusiastide elu oluliselt lihtsamaks. Python on viimasel ajal saavutanud tohutut populaarsust ning ma otsustasin tĂ€ita tĂŒhimiku ja teha ĂŒlevaate peamistest vĂ”imalustest Check Point API Python Development Kit. See artikkel on suurepĂ€rane lisa teisele artiklile Habrisse Check Point R80.10 API. Halduse CLI kaudu, skriptid ja palju muud. Me vaatame, kuidas kirjutada skripte, kasutades Python SDK-d, ja peatume lĂ€hemalt Management API uuel funktsionaalsusel versioonis 1.6 (toetatakse alates R80.40). Artikli mĂ”istmiseks on vajalikud pĂ”hitĂ”ed API ja Python töötamise osas.

Check Point arendab aktiivselt API-d ja hetkel on ilmunud:

Python SDK toetab praegu ainult Management API ja Gaia API. KĂ€sitleme selle mooduli olulisemaid klasse, meetodeid ja muutujaid.

Lihtsustame tööd Check Point API-ga, kasutades Python SDK-d

Mooduli

Modul cpapi paigaldamine on kiire ja lihtne Check Point'i ametlikust gitHubi hoidlast kasutades pip. Üksikasjalik installatsiooni juhend on saadaval README.md. See moodul on kohandatud töötamiseks Python 2.7 ja 3.7 versioonidega. Antud artiklis on nĂ€ited toodud kasutades Python 3.7. Siiski, Python SDK-d saab kĂ€ivitada otse Check Point'i haldusserverilt (Smart Management), kuid seal toetatakse ainult Python 2.7 versiooni, seega viimases osas on toodud kood versioonile 2.7. Kohe pĂ€rast mooduli installimist soovitan vaadata nĂ€iteid kataloogides examples_python2 ja examples_python3.

Alustamine

Kuna meil on vÔimalus töötada cpapi mooduli komponentidega, tuleb importida moodulist cpapi vÀhemalt kaks vajalikku klassi:

APIClient ja APIClientArgs

from cpapi import APIClient, APIClientArgs

Klass APIClientArgs millel on seotud API serveriga ĂŒhenduse parameetrid, ning klass APIClient kĂ€sitleb API-ga suhtlemist.

MÀÀra ĂŒhenduse parameetrid

Erinevate API-ga ĂŒhenduse parameetrite mÀÀramiseks tuleb luua klassi APIClientArgseksemplar. Üldiselt on selle parameetrid eelnevalt mÀÀratud ja skripti kĂ€ivitamisel haldussĂŒsteemis ei pea neid kindlasti mÀÀrama.

client_args = APIClientArgs()

Kuid kolmandal serveril kĂ€ivitamisel tuleb mÀÀrata vĂ€hemalt API serveri IP-aadress vĂ”i hostinimi (see on ka haldussĂŒsteem). Allolevas nĂ€ites mÀÀrame ĂŒhenduse parameetri server ja mÀÀrame sellele stringina haldussĂŒsteemi IP-aadressi.

client_args = APIClientArgs(server='192.168.47.241')

Vaatame kĂ”iki parameetreid ja nende vaikimisi vÀÀrtusi, mida saab API-serveriga ĂŒhendamiseks kasutada:

APIClientArgs klassi __init__ meetodi argumendid

class APIClientArgs:
    """
    See klass pakub argumente APIClient konfigureerimiseks.
    KÔik argumendid on seadistatud oma vaikevÀÀrtustega.
    """

    # port on vaikimisi seadistatud None, kuid asendatakse 443-ga, kui ei ole mÀÀratud
    # konteksti vÔimalikud vÀÀrtused - web_api (vaikimisi) vÔi 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
        # haldusteenuse sÔrmejÀlg
        self.fingerprint = fingerprint
        # sessiooni-ID.
        self.sid = sid
        # haldusteenuse nimi vÔi IP-aadress
        self.server = server
        # silumise tase
        self.http_debug_level = http_debug_level
        # massiiv, kus on kÔik API-kutsed (silumise eesmÀrkidel)
        self.api_calls = api_calls if api_calls else []
        # silumise faili nimi. Kui see jÀÀb tĂŒhjaks, ei salvestata silumise andmeid kettale.
        self.debug_file = debug_file
        # HTTP-proksi serveri aadress (ilma "http://")
        self.proxy_host = proxy_host
        # HTTP-proksi port
        self.proxy_port = proxy_port
        # haldusteenuse API versioon
        self.api_version = api_version
        # NĂ€itab, et klient ei tohiks kontrollida serveri sertifikaati
        self.unsafe = unsafe
        # NĂ€itab, et klient peaks automaatselt aktsepteerima ja salvestama serveri sertifikaadi
        self.unsafe_auto_accept = unsafe_auto_accept
        # Kliendi kasutamise kontekst - vaikimisi web_api
        self.context = context

Arvan, et APIClientArgs klassi eksemplaride argumentide mÔisted on Check Pointi administraatoritele loogiliselt arusaadavad ning neile ei ole lisakommentaare vajalik.

Ühendame APIClienti ja kontekstihalduriga

Klass APIClient on kĂ”ige mugavam kasutada kontekstihalduse kaudu. KĂ”ik, mis tuleb APIClient klassi eksemplarile edastada, on ĂŒhenduse parameetrid, mis mÀÀrati eelnevas sammus.

with APIClient(client_args) as client:

Kontekstihaldur ei soorita automaatselt login kÔnet API serverisse, kuid ta teeb logout kÔne, kui sellest vÀljutakse. Kui mingil pÔhjusel pole API kÔnede lÔpetamise jÀrgselt logout vajalik, tuleb alustada tööd ilma kontekstihaldurita:

client = APIClient(client_args)

Ühenduse kontrollimine

Kontrollida, kas ĂŒhendus antud parameetritega on lihtsaim kasutada meetodi check_fingerprint. Kui API serveri sertifikaadi fingerprinti sha1 kontrollimised ei lĂ€inud lĂ€bi (meetod tagastas False), on see tavaliselt pĂ”hjustatud ĂŒhenduse probleemidest ning me saame programmi kĂ€ivitamise peatada (vĂ”i anda kasutajale vĂ”imaluse andmeid parandada):

    kui client.check_fingerprint() on vale:
        print("Ei saanud serveri sĂ”rmejĂ€lge - Kontrollige ĂŒhendust serveriga.")
        exit(1)

Pange tĂ€hele, et edaspidi klass APIClient kontrollib iga API-ĂŒlesande korral (meetodid api_call ja api_query, millest rÀÀgime hiljem) sha1 sĂ”rmejĂ€lge API serveri sertifikaadi kohta. Kui sha1 sĂ”rmejĂ€lje kontrollimisel tuvastatakse viga (sertifikaat on tundmatu vĂ”i on muutunud), siis meetod check_fingerprint pakub vĂ”imalust lisada/muuta selle kohta teavet kohaliku masina automaatreĆŸiimis. Selle kontrolli saab ĂŒldse vĂ€lja lĂŒlitada (kuid seda soovitatakse ainult juhul, kui skripte kĂ€itatakse otse API serveris, ĂŒhendades 127.0.0.1), kasutades argumenti APIClientArgs — unsafe_auto_accept (vt APIClientArgs kohta lĂ€hemalt "MÀÀratlege ĂŒhenduse parameetrid"-s).

client_args = APIClientArgs(unsafe_auto_accept=True)

Logi sisse API serverisse

U APIClient on kokku 3 meetodit sisse logimiseks API serverisse, ja igaĂŒhe puhul salvestatakse vÀÀrtus sid(session-id), mida kasutatakse automaatselt igas jĂ€rgmises API-ĂŒhenduses pĂ€ises (selle parameetri nimi pĂ€ises on X-chkp-sid), nii et seda parameetrit ei pea eraldi töötlema.

Meetod login

Variant, kasutades sisselogimist ja parooli (nÀiteks on kasutajanimi admin ja parool 1q2w3e edastatud positsiooniliste argumentidena):

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

Metoodis login on saadaval ka tÀiendavad valikuvÔimalused, siin on nende nimed ja vaikimisi vÀÀrtused:

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

Meetod login_with_api_key

Variant, kasutades API vĂ”tit (tugineb versioonist R80.40 / Management API v1.6, «3TsbPJ8ZKjaJGvFyoFqHFA==» see on API vĂ”ti ĂŒhele kasutajale haldusserveris, kasutades autentimismeetodit API key):

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

Meetodis login_with_api_key on saadaval samad valikuvÔimalused nagu meetodis login.

Meetod login_as_root

Variant sisselogimiseks lokaalsesse masinasse API serveriga:

     login = client.login_as_root()

Selle meetodi jaoks on saadaval vaid kaks valikuvÔimalust:

domain=None, payload=None

Ja lÔpuks, ise API kutsed

Meil on kaks varianti API kutsude tegemiseks lÀbi meetodite. api_call ja api_queryVaatame, milline nende vahel on erinevus.

api_call

Seda meetodit saab kasutada igasuguste kutsuste jaoks. Me peame edastama viimase osa API kutsest ja payload'i soovi korral. Kui payload on tĂŒhi, siis seda ei pea ĂŒldse edastama:

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

KÀesoleva pÀringu vÀljund allpool:

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

KÀesoleva pÀringu vÀljund allpool:

In [25]: show_host                                                              
Out[25]: 
APIResponse({
    "data": {
        "color": "must", 
        "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": "must",
            "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

EsmapĂ€raselt ĂŒtlen, et see meetod kehtib ainult nende API-kutsede puhul, mille vĂ€ljundis on offset (tĂ”uke) olemas. Sellist vĂ€ljundit kasutatakse, kui see sisaldab vĂ”i vĂ”ib sisaldada suurt hulka teavet. NĂ€iteks vĂ”ib see olla pĂ€ring kĂ”igi loodud hostide loendi saamiseks haldusserveris. Selliste pĂ€ringute puhul tagastab API vaikimisi 50 objekti (selle arvu saab suurendada kuni 500 objekti). Et vĂ€ltida teabe mitu korda pĂ€rimist erineva offset parameetriga API-kutses, on olemas meetod api_query, mis teeb selle töö automaatselt Ă€ra. NĂ€ited kutsetest, kus seda meetodit on vaja: 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. Tegelikult nĂ€eme nende API-kutsete nimedes sĂ”nu mitmuses, nii et neid kutseid on lihtsam töödelda lĂ€bi api_query

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

KÀesoleva pÀringu vÀljund allpool:

In [21]: show_hosts                                                             
Out[21]: 
APIResponse({
    "data": [
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC kasutaja",
                "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 kasutaja",
                "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 kasutaja",
                        "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 kasutaja",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "8.8.8.8",
                    "name": "h_8.8.8.8",
                    "type": "host",
                    "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
                }
            ],
            "to": 2,
            "total": 2
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

API kutsungite tulemuste töötlemine

PÀrast seda saab kasutada klassi muutujaid ja meetodeid APIResponse(nii konteksti halduri sees kui ka vÀljaspool). Klassil APIResponse on mÀÀratud 4 meetodit ja 5 muutujat, millest kÔige olulisematel peatume lÀhemalt.

Lihtsustame tööd Check Point API-ga, kasutades Python SDK-d

success

Alustuseks oleks hea veenduda, et API kutse Ônnestus ja tagastas tulemuse. Selleks on olemas meetod success:

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

Tagastab True, kui API kutse Ă”nnestus (vastuskood — 200) ja False, kui mitte (ĂŒkskĂ”ik milline teine vastuskood). Mugav kasutada kohe pĂ€rast API kutsest, et vastavalt vastuskoodile erinevat teavet kuvada.

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

statuscode

Tagastab vastuskoodi pÀrast API kutsumise tÀitmist.

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

VÔimalikud vastuskoodid: 200,400,401,403,404,409,500,501.

set_success_status

Samuti vĂ”ib olla vajalik muuta staatuse vÀÀrtust success. Tehniliselt vĂ”ib sinna panna mis tahes, isegi tavalise stringi. Kuid reaalseks nĂ€iteks vĂ”ib olla selle parameetri seadmine False'iks teatud kĂ”rvaltingimustes. Allpool on nĂ€ide, kus on ĂŒlesanded, mis tĂ€idetakse haldusserveris, kuid me peame seda pĂ€ringut ebaĂ”nnestunuks (seadke muutuja success False, hoolimata sellest, et API-kutse oli edukas ja tagastas koodi 200).

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

response()

Meetod response vÔimaldab vaadata sÔnastikku koos vastuse koodiga (status_code) ja vastuse kehaga (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

VÔimaldab nÀha ainult vastuse keha (body) ilma liigsete detailideta.

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

See teave on saadaval ainult siis, kui API pÀringu töötlemise kÀigus tekkis tÔrge (vastuse kood ei 200). NÀide vÀljundist

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

Kasulikud nÀited

Allpool on toodud nÀited, kus kasutatakse API pÀringuid, mis on lisatud juhtimise API versioonile 1.6.

Alustuseks vaatame pĂ€ringute toimimist add-host ja add-address-range. Oletame, et me peame looma objektid, mille tĂŒĂŒp on host, kĂ”ikide IP aadresside jaoks alamsĂŒsteemis 192.168.0.0/24, mille viimane oktet on 5, ja kĂ”ik ĂŒlejÀÀnud IP aadressid salvestama objektidena, mille tĂŒĂŒp on aadressirida. Samuti tuleb vĂ€lja jĂ€tta alamsĂŒsteemi aadress ja laiendatud aadress.

Nii et allpool on esitatud skript, mis lahendab antud ĂŒlesande ja loob 50 host tĂŒĂŒpi objekti ja 51 aadressirea objekti. Probleemi lahendamiseks kulub 101 API pĂ€ringut (ilma lĂ”pp-pĂ€ringut publish arvestamata). Samuti kasutame moodulit timeit, et arvutada skripti tĂ€itmise aega kuni muudatuste avaldamiseni.

Skript koos add-host ja add-address-range kasutamisega

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

Minu laboratooriumis kulub selle skripti tÀitmiseks sÔltuvalt haldusserveri koormusest 30 kuni 50 sekundit.

NĂŒĂŒd vaatame, kuidas lahendada sama probleem API kutsumise abil add-objects-batch, mille tugi on lisatud API versioonis 1.6. See kutsumine vĂ”imaldab ĂŒhes API pĂ€ringus luua mitmeid objekte. Need vĂ”ivad olla erinevat tĂŒĂŒpi objektid (nĂ€iteks hostid, alamvĂ”rgud ja aadressivahemikud). Seega saame meie ĂŒlesande lahendada ĂŒhe API kutsumise raames.

Skript, mis kasutab 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')

Kuid skripti tĂ€itmine minu laborikeskkonnas vĂ”tab aega 3 kuni 7 sekundit olenevalt haldusseervere koormusest. See tĂ€hendab, et keskmiselt saab 101 objekti puhul API kutsumine tĂŒĂŒpi batch 10 korda kiiremini. Suurema objekti arvu korral on erinevus veelgi muljetavaldavam.

NĂŒĂŒd vaatame, kuidas töötada set-objects-batch. Selle API-kĂ”ne abil saame massiliselt muuta mis tahes parameetrit. Seadistame esimeses pooles aadresse eelmisest nĂ€itest (kuni .124 hostini, sealhulgas ka vahemike jaoks) vĂ€rvi sienna ja teises pooles aadresse mÀÀrame vĂ€rvi khaki.

Objektide vÀrvi muutmine, mis loodi eelnevas nÀites

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

Eemaldada mitmed objektid ĂŒhe API kutsumisega on vĂ”imalik kasutades delete-objects-batch. Ja nĂŒĂŒd vaatame koodi nĂ€idet, mis eemaldab kĂ”ik varem loodud hostid add-objects-batch.

Objektide eemaldamine delete-objects-batch abil

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}'}
    objects_list_ip.append(data)

first_ip = 1
last_ip = 4
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip
}, {
    "type" : "address-range",
    "list" : objects_list_range
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     delete_objects_batch = client.api_call("delete-objects-batch", data_for_batch)
     publish = client.api_call("publish")

print(delete_objects_batch.data)

Check Pointi tarkvara uutes versioonides on kĂ”ik funktsioonid koheselt seotud ka API kutsungitega. NĂ€iteks R80.40 versioonis tutvustatakse selliseid funktsioone nagu „Revert to revision” ja „Smart Task”, ning nende jaoks on kohe valmis vastavad API kutsungid. Lisaks sellele, kogu funktsionaalsus, kui toimub ĂŒleminek Legacy konsoolidest Unified Policy reĆŸiimi, saab samuti API toe. NĂ€iteks oodatud uuendus R80.40 versioonis oli HTTPS Inspection poliitika ĂŒleminek Legacy reĆŸiimist Unified Policy reĆŸiimi, ning see funktsionaalsus sai kohe API kutsungid. Siin on koodinĂ€ide, mis lisab HTTPS Inspection poliitika tippu reegli, mis vĂ€listab kolmest kategooriast (Tervis, Rahandus, Avalikud teenused) inspektsiooni, mille inspektsioon on mitmes riigis seadusandluses keelatud.

Lisa reegel HTTPS Inspection poliitikasse

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

Python skriptide kÀivitamine Check Pointi haldusserveris

Kogu sisu jÀÀb samaks README.md sisal on teavet, kuidas kĂ€ivitada skripte Pythonis otse haldusserverist. See vĂ”ib olla mugav, kui teil pole vĂ”imalik ĂŒhendada API serverisse mĂ”nest teisest masinast. Olen salvestanud kuue minuti video, milles kĂ€sitlen mooduli cpapi ja Python-skriptide kĂ€ivitamise eripĂ€rasid haldusserveris. NĂ€iteks kĂ€ivitan skripti, mis automatiseerib uue lĂŒĂŒsikoodi seadistamist selliste ĂŒlesannete jaoks nagu vĂ”rgu auditeerimine. Security CheckUp. EripĂ€rad, millega silmitsi seisin: Python 2.7 versioonis polnud veel funktsiooni input, seega kasutatakse kasutaja sisestatud teabe töötlemiseks funktsiooni raw_input. Muudelt masinakĂ€ivitustelt koodit erakordselt ei erine, lihtsalt on mugavam kasutada funktsiooni login_as_root, et mitte oma enda kasutajanime, paroole ja haldusserveri IP-aadressi uuesti sisestada.

Vaata videot

Skript Security CheckUp kiireks seadistamiseks.

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("Ei saanud serveri sĂ”rmejĂ€lge kĂ€tte - kontrollige serveriga ĂŒhendust.")
       #     exit(1)
        login_res = client.login_as_root()

        if login_res.success is False:
            print("Sisselogimine ebaÔnnestus:n{}".format(login_res.error_message))
            exit(1)

        gw_name = raw_input("Sisesta vÀrava nimi:")
        gw_ip = raw_input("Sisesta vÀrava IP-aadress:")
        if sys.stdin.isatty():
            sic = getpass.getpass("Sisesta ĂŒhekordne parool vĂ€rava jaoks (SIC): ")
        else:
            print("TĂ€helepanu! Teie parool ilmub ekraanile!")
            sic = raw_input("Sisesta ĂŒhekordne parool vĂ€rava jaoks (SIC): ")
        version = raw_input("Sisesta vÀrava versioon (nt 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("Turvaline ĂŒhendus vĂ€ravaga ei ole loodud!")
            exit(1)
        elif add_gw.success:
            print("VĂ€rav lisati edukalt.")
            gw_uid = add_gw.data['uid']
            gw_name = add_gw.data['name']
        else:
            print("VÀrava lisamine ebaÔnnestus - {}".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("Poliitika muudeti edukalt")
        else:
            print("Poliitika muutmine ebaÔnnestus - {}".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("Cleanup reegel muudeti edukalt")
        else:
            print("Cleanup reegli muutmine ebaÔnnestus - {}".format(change_rule.error_message))

        # avalda tulemus
        publish_res = client.api_call("publish", {})
        if publish_res.success:
            print("Muudatused avaldati edukalt.")
        else:
                print("Muudatuste avaldamine ebaÔnnestus - {}".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("JuurdepÀÀsu poliitika on installitud")
        else:
                print("JuurdepÀÀsu poliitika installimine ebaÔnnestus - {}".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("Sissetungi tÔkestamise poliitika on installitud")
        else:
            print("Sissetungi tÔkestamise poliitika installimine ebaÔnnestus - {}".format(install_tp_policy.error_message))
        
        # lisa paroolid ja salasÔnad sÔnastikku
        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" : "Lisa paroolid ja salasÔnad", "script" : "printf "{}" >> $FWDIR/conf/additional_pass.conf".format(line), "targets" : gw_name})
                if add_password_dictionary.success:
                    print("Parooli sÔnastiku rida {} lisati edukalt".format(line_num))
                else:
                    print("SÔnastiku lisamine ebaÔnnestus - {}".format(add_password_dictionary.error_message))

main()

NÀidis fail sÔnadega varvete jaoks additional_pass.conf
{
"passwords" : ["malware","malicious","infektoitunud","Infected"],
"phrases" : ["parool","Parool","Pass","pass","kood","vĂ”ti","pwd","ĐżĐ°Ń€ĐŸĐ»ŃŒ","ĐŸĐ°Ń€ĐŸĐ»ŃŒ","Ключ","Đșлюч","шофр","йофр"]
}

KokkuvÔte

See artikkel kĂ€sitleb ainult pĂ”hivĂ”imalusi tööks Python SDK ja mooduli cpapi(nagu te vĂ”isite arvata, need on pĂ”himĂ”tteliselt sĂŒnonĂŒĂŒmid), ja uurides selle mooduli koodi avastate veelgi rohkem vĂ”imalusi selle kasutamiseks. Pole vĂ€listatud, et tekib soov tĂ€iendada seda oma klassidega, funktsioonidega, meetoditega ja muutujatega. Te vĂ”ite alati jagada oma saavutusi ja vaadata teisi Check Pointi skripte jaotises CodeHub kogukonnas CheckMates, mis ĂŒhendab nii toodete arendajaid kui ka kasutajaid.

Head programmeerimist ja aitÀh, et lugesite lÔpuni!

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster