Simplificà l'API Check Point cù u Python SDK

Simplificà l'API Check Point cù u Python SDKA piena putenza di l'interazzione cù l'API hè revelata quandu s'utilice inseme cù u codice di u prugramma, quandu diventa pussibule generà dinamicamente richieste API è strumenti per analizà e risposte API. Tuttavia, ferma sempre unnoticeable Kit di sviluppu di software Python (in seguitu chjamatu Python SDK) per Check Point Management API, ma in vanu. Simplifica significativamente a vita di i sviluppatori è l'amatori di l'automatizazione. Python hà guadagnatu una enorme pupularità ultimamente è aghju decisu di riempie u gap è rivede e caratteristiche principali. Check Point API Python Development Kit. Questu articulu serve cum'è un aghjuntu eccellente à un altru articulu nantu à Habré Check Point R80.10 API. Gestione via CLI, scripts è più. Fighjemu cumu scrive script cù u Python SDK è fighjemu un ochju più vicinu à a nova funziunalità di l'API di Gestione in a versione 1.6 (suportata da R80.40). Per capisce l'articulu, avete bisognu di cunniscenze basi di travaglià cù API è Python.

Check Point sviluppa attivamente l'API è à u mumentu sò stati liberati i seguenti:

U Python SDK attualmente supporta solu l'interazzione cù l'API di gestione è Gaia API. Fighjemu e classi, metudi è variàbili più impurtanti in stu modulu.

Simplificà l'API Check Point cù u Python SDK

Stallà u modulu

Modulu cpapi s'installa rapidamente è facilmente da Repositoriu ufficiale di Check Point in github cun l'aiutu di seme. Istruzzioni d'installazione dettagliate sò dispunibili in README.md. Stu modulu hè adattatu per travaglià cù e versioni Python 2.7 è 3.7. In questu articulu, l'esempii seranu datu cù Python 3.7. In ogni casu, u Python SDK pò esse eseguitu direttamente da u Check Point Management Server (Smart Management), ma sustene solu Python 2.7, cusì l'ultima sezione furnisce u codice per a versione 2.7. Immediatamente dopu a stallazione di u modulu, ricumandemu di vede l'esempii in i cartulari esempi_python2 и esempi_python3.

Getting passé

Per pudè travaglià cù i cumpunenti di u modulu cpapi, avemu bisognu di impurtà da u modulu. cpapi almenu duie classi richieste:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Class APIClientArgs hè rispunsevule per i paràmetri di cunnessione à u servitore API, è a classa APIClient hè rispunsevule per l'interazzione cù l'API.

Determinazione di i paràmetri di cunnessione

Per definisce diversi paràmetri per a cunnessione à l'API, avete bisognu di creà una istanza di a classe APIClientArgs. In principiu, i so paràmetri sò predefiniti è quandu eseguite u script in u servitore di cuntrollu, ùn anu micca bisognu di specificatu.

client_args = APIClientArgs()

Ma quandu eseguite nantu à un òspite di terzu, avete bisognu di specificà almenu l'indirizzu IP o u nome d'ospite di u servitore API (cunnisciutu ancu com'è u servitore di gestione). In l'esempiu sottu, definiscemu u paràmetru di cunnessione di u servitore è l'assignemu l'indirizzu IP di u servitore di gestione cum'è una stringa.

client_args = APIClientArgs(server='192.168.47.241')

Fighjemu tutti i paràmetri è i so valori predeterminati chì ponu esse utilizati quandu si cunnessi à u servitore API:

Argumenti di u metudu __init__ di a classa 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

Credu chì l'argumenti chì ponu esse aduprati in casi di a classe APIClientArgs sò intuitivi per l'amministratori di Check Point è ùn necessitanu micca cumenti supplementari.

Cunnessione via APIClient è gestore di cuntestu

Class APIClient A manera più còmuda di usà hè attraversu u gestore di cuntestu. Tuttu ciò chì deve esse passatu à una istanza di a classa APIClient hè i paràmetri di cunnessione chì sò stati definiti in u passu precedente.

with APIClient(client_args) as client:

U gestore di u cuntestu ùn farà micca automaticamente una chjama di login à u servitore API, ma farà una chjama di logout quandu esce. Se per una certa ragione ùn hè micca necessariu u logout dopu avè finitu di travaglià cù e chjama API, avete bisognu di cumincià à travaglià senza aduprà u gestore di cuntestu:

client = APIClient(clieng_args)

Verificate a cunnessione

U modu più faciule per verificà s'ellu a cunnessione scontra i paràmetri specificati hè di utilizà u metudu check_fingerprint. Se a verificazione di a somma hash sha1 per l'impronta digitale di u certificatu API di u servitore falla (u metudu restituitu False), allora questu hè generalmente causatu da prublemi di cunnessione è pudemu piantà l'esekzione di u prugramma (o dà à l'utilizatori l'uppurtunità di curregà i dati di cunnessione):

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

Per piacè nutate chì in u futuru a classa APIClient verificarà ogni chjama API (metude api_call и api_query, Parleremu di elli un pocu più) certificatu di impronte digitali sha1 nantu à u servitore API. Ma se, quandu verificate l'impronta sha1 di u certificatu di u servitore API, un errore hè rilevatu (u certificatu hè scunnisciutu o hè statu cambiatu), u metudu check_fingerprint darà l'uppurtunità di aghjunghje / cambià l'infurmazioni annantu à a macchina locale automaticamente. Questa verificazione pò esse disattivata cumplettamente (ma questu pò esse cunsigliatu solu se i script sò eseguiti nantu à u servitore API stessu, quandu si cunnetta à 127.0.0.1), utilizendu l'argumentu APIClientArgs - unsafe_auto_accept (vede più nantu à APIClientArgs prima in "Defining parameters connection").

client_args = APIClientArgs(unsafe_auto_accept=True)

Accedi à u servitore API

У APIClient Ci sò quant'è 3 metudi per accede à u servitore API, è ognunu capisce u significatu sid(session-id), chì hè utilizatu automaticamente in ogni chjama API sussegwente in l'intestazione (u nome in l'intestazione di stu paràmetru hè X-chkp-sid), dunque ùn ci hè bisognu di più processà stu paràmetru.

metudu di login

Opzione cù login è password (in l'esempiu, l'username admin è a password 1q2w3e sò passati cum'è argumenti pusiziunali):

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

Paràmetri opzionali supplementari sò ancu dispunibili in u metudu di login; quì sò i so nomi è i valori predeterminati:

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

Metudu login_with_api_key

Opzione chì usa una chjave API (supportata da a versione di gestione R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" questu hè u valore di chjave API per unu di l'utilizatori nantu à u servitore di gestione cù u metudu d'autorizazione di chjave API):

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

In u metudu login_with_api_key i stessi paràmetri opzionali sò dispunibuli cum'è in u metudu purtellu.

login_as_root mètudu

Opzione per accede à una macchina locale cù un servitore API:

     login = client.login_as_root()

Ci hè solu dui paràmetri opzionali dispunibili per stu metudu:

domain=None, payload=None

È infine l'API si chjama

Avemu duie opzioni per fà chjamate API attraversu metudi api_call и api_query. Scupritemu quale hè a diffarenza trà elli.

api_call

Stu metudu hè applicabile per qualsiasi chjama. Avemu bisognu di passà l'ultima parte per a chjama api è u payload in u corpu di dumanda se ne necessariu. Se u payload hè viotu, ùn pò micca esse trasmessu in tuttu:

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

Output per sta dumanda sottu u 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 per sta dumanda sottu u 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

Lasciami fà una riservazione subitu chì stu metudu hè applicabile solu per e chjama chì a so pruduzzioni implica offset. Una tale inferenza si trova quandu cuntene o pò cuntene una grande quantità di informazioni. Per esempiu, questu puderia esse una dumanda per una lista di tutti l'oggetti d'ospiti creati in u servitore di gestione. Per tali richieste, l'API torna una lista di 50 oggetti per difettu (pudete aumentà u limitu à 500 oggetti in a risposta). È per ùn tirà l'infurmazioni parechje volte, cambiendu u paràmetru di offset in a dumanda API, ci hè un metudu api_query chì faci stu travagliu automaticamente. Esempii di chjamate induve stu metudu hè necessariu: 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, pacchetti di mostra. In fatti, vedemu e parolle plurali in u nome di sti chjamati API, cusì queste chjamate seranu più faciuli di trattà. api_query

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

Output per sta dumanda sottu u 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
})

Trattamentu di i risultati di e chjama API

Dopu questu, pudete aduprà e variàbili è i metudi di a classe APIRisposta(sia in u cuntestu manager è fora). À a classe APIRisposta 4 metudi è 5 variàbili sò predefiniti; ci stendemu nantu à i più impurtanti in più dettagliu.

Simplificà l'API Check Point cù u Python SDK

a riescita

Per principià, saria una bona idea per assicurà chì a chjamata API hè stata successu è hà tornatu un risultatu. Ci hè un metudu per questu a riescita:

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

Ritorna True se a chjama API hè stata successu (codice di risposta - 200) è False se micca successu (qualsiasi altru codice di risposta). Hè cunvenutu à aduprà immediatamente dopu à una chjama API per visualizà diverse informazioni secondu u codice di risposta.

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

codice di statutu

Ritorna u codice di risposta dopu chì una chjama API hè stata fatta.

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

Codici di risposta pussibuli: 200,400,401,403,404,409,500,501.

set_success_status

In questu casu, pò esse necessariu di cambià u valore di u statutu di successu. Tecnicamente, pudete mette qualcosa quì, ancu una stringa regulare. Ma un veru esempiu seria resetting stu paràmetru à False in certi cundizioni di accumpagnamentu. Sottu, fate attenzione à l'esempiu quandu ci sò compiti in esecuzione nantu à u servitore di gestione, ma cunsidereremu sta dumanda falluta (avemu stabilitu a variàbile di successu à False, malgradu u fattu chì a chjama API hà successu è hà tornatu u codice 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 ()

U metudu di risposta permette di vede u dizziunariu cù u codice di risposta (status_code) è u corpu di risposta (corpu).

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

données

Permette di vede solu u corpu di a risposta (corpu) senza infurmazione inutile.

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

messagiu_errore

Questa infurmazione hè dispunibule solu quandu un errore hè accadutu durante u processu di a dumanda API (codice di risposta ùn 200). Esempiu di output

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

Esempi utili

I seguenti sò esempi chì utilizanu e chjama API chì sò state aghjunte in Management API 1.6.

Prima, fighjemu cumu funziona e chjama add-host и aghjunghje-indirizzu-range. Dicemu chì avemu bisognu di creà tutti l'indirizzi IP di a subnet 192.168.0.0/24, l'ultimu octet di quale hè 5, cum'è l'uggetti di u tipu d'ospiti, è scrivite tutti l'altri indirizzi IP cum'è l'uggetti di u tipu d'indirizzu. In questu casu, escludite l'indirizzu di a subnet è l'indirizzu di trasmissione.

Allora, quì sottu hè un script chì risolve stu prublema è crea 50 ogetti di u tipu d'ospite è 51 oggetti di u tipu d'indirizzu. Per risolve u prublema, 101 chjamate API sò richieste (senza cuntà a chjama di pubblicazione finale). Inoltre, utilizendu u modulu timeit, calculemu u tempu chì ci vole à eseguisce u script finu à chì i cambiamenti sò publicati.

Script utilizendu add-host è add-address-range

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

first_ip = 1
last_ip = 4

client_args = APIClientArgs(server="192.168.47.240")

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     for ip in range(5,255,5):
         add_host = client.api_call("add-host", {"name" : f"h_192.168.0.{ip}", "ip-address": f'192.168.0.{ip}'})
     while last_ip < 255:
         add_range = client.api_call("add-address-range", {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"})
         first_ip+=5
         last_ip+=5
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

In u mo ambiente di laboratoriu, stu script dura trà 30 è 50 seconde per eseguisce, secondu a carica nantu à u servitore di gestione.

Avà vedemu cumu risolve u listessu prublema utilizendu una chjamata API aghjunghje-oggetti-batch, supportu per quale hè statu aghjuntu in a versione API 1.6. Questa chjama permette di creà parechji oggetti à una volta in una dumanda API. Inoltre, questi ponu esse oggetti di diversi tipi (per esempiu, hosts, subnets è intervalli di indirizzu). Cusì, u nostru compitu pò esse risoltu in u quadru di una chjama API.

Script cù 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')

È eseguisce stu script in u mo ambiente di laboratoriu dura da 3 à 7 seconde, secondu a carica nantu à u servitore di gestione. Hè, in media, nantu à 101 oggetti API, una chjama di tipu batch corre 10 volte più veloce. Nantu à un nùmeru più grande d'uggetti, a diferenza serà ancu più impressiunanti.

Avà vedemu cumu travaglià cun set-oggetti-batch. Utilizendu sta chjama API, pudemu cambià in massa ogni paràmetru. Fighjemu a prima mità di l'indirizzi da l'esempiu precedente (finu à .124 hosts, è ancu varieghja) à u culore sienna, è assignà u culore khaki à a seconda mità di l'indirizzi.

Cambia u culore di l'uggetti creati in l'esempiu precedente

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

Pudete sguassà parechje oggetti in una chjama API usendu sguassate-oggetti-batch. Avà fighjemu un esempiu di codice chì elimina tutti l'ospiti creati prima via aghjunghje-oggetti-batch.

Eliminazione di l'ogetti usendu 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)

Tutte e funzioni chì appariscenu in novi versioni di u software Check Point acquistanu immediatamente chjamate API. Cusì, in R80.40 tali "caratteristiche" cum'è Revert to revision è Smart Task apparsu, è e chjama API currispundenti sò state immediatamente preparate per elli. Inoltre, tutte e funziunalità quandu passanu da e console Legacy à u modu di Politica Unificata acquistanu ancu supportu API. Per esempiu, l'aghjurnà longu aspittatu in a versione di software R80.40 hè stata a mossa di a pulitica di Inspeczione HTTPS da u modu Legacy à u modu di Politica Unificata, è sta funziunalità hà immediatamente ricevutu chjamati API. Eccu un esempiu di codice chì aghjunghje una regula à a pusizione di punta di a pulitica di Inspeczione HTTPS chì esclude 3 categurie da l'ispezione (Salute, Finanze, Servizi di Guvernu), chì sò pruibiti da l'ispezione in cunfurmità cù a lege in parechji paesi.

Aghjunghjite una regula à a pulitica di Inspeczione 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")

Esecuzione di script Python nantu à u servitore di gestione di Check Point

Tuttu hè u listessu README.md cuntene infurmazione nantu à cumu eseguisce script Python direttamente da u servitore di cuntrollu. Questu pò esse convenientu quandu ùn pudete micca cunnette à u servitore API da una altra macchina. Aghju registratu un video di sei minuti in quale mi fighjulà à stallà u modulu cpapi è caratteristiche di eseguisce script Python in u servitore di cuntrollu. Per esempiu, un script hè esecutatu chì automatizeghja a cunfigurazione di una nova porta d'ingressu per un compitu cum'è l'auditu di rete. Verificazione di Sicurezza. Trà e funziunalità chì aghju avutu à trattà: a funzione ùn hè ancu apparsa in Python 2.7 Ingressu, cusì per processà l'infurmazioni chì l'utilizatore entra, una funzione hè aduprata raw_input. Altrimenti, u codice hè u listessu cum'è per lanciari da altre machini, solu hè più còmuda di utilizà a funzione login_as_root, per ùn spicificà micca u vostru nome d'utilizatore, password è indirizzu IP di u servitore di gestione.

Script per a cunfigurazione rapida di 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()

Un schedariu d'esempiu cù un dizziunariu di password additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

cunchiusioni

Stu articulu esamina solu e pussibulità basi di u travagliu SDK di Python è modulu cpapi(cum'è avete capitu, questi sò in realtà sinonimi), è studiendu u codice in stu modulu scuprerete ancu più opportunità per travaglià cun ellu. Hè pussibule chì vulete supplementà cù e vostre classi, funzioni, metudi è variàbili. Pudete sempre sparte u vostru travagliu è vede altri script per Check Point in a sezione CodeHub in a cumunità CheckMates, chì riunisce i sviluppatori di prudutti è l'utilizatori.

Felice codificazione è grazie per a lettura finu à a fine!

Source: www.habr.com

Add a comment