Pojednostavljivanje Check Point API-ja sa Python SDK-om

Pojednostavljivanje Check Point API-ja sa Python SDK-omPuna moć interakcije sa API-jima se otkriva kada se koristi zajedno sa programskim kodom, kada postane moguće dinamički generisati API zahteve i alate za analizu API odgovora. Međutim, to i dalje ostaje neprimjetno Komplet za razvoj softvera Python (u daljem tekstu Python SDK) za Check Point Management API, ali uzalud. To značajno pojednostavljuje život programera i entuzijasta automatizacije. Python je u posljednje vrijeme stekao ogromnu popularnost i odlučio sam popuniti prazninu i pregledati glavne karakteristike. Check Point API Python razvojni komplet. Ovaj članak služi kao odličan dodatak drugom članku na Habréu Check Point R80.10 API. Upravljanje putem CLI-a, skripti i još mnogo toga. Pogledat ćemo kako pisati skripte koristeći Python SDK i pobliže pogledati novu funkcionalnost API-ja za upravljanje u verziji 1.6 (podržano počevši od R80.40). Da biste razumjeli članak, trebat će vam osnovno znanje o radu s API-jem i Pythonom.

Check Point aktivno razvija API i trenutno je objavljeno sljedeće:

Python SDK trenutno podržava samo interakciju sa API-jem za upravljanje i Gaia API. U ovom modulu ćemo pogledati najvažnije klase, metode i varijable.

Pojednostavljivanje Check Point API-ja sa Python SDK-om

Instalacija modula

Modul cpapi instalira se brzo i jednostavno sa službeni Check Point repozitorij na githubu uz pomoć pipa. Detaljna uputstva za instalaciju su dostupna u README.md. Ovaj modul je prilagođen za rad sa Python verzijama 2.7 i 3.7. U ovom članku će biti dati primjeri koristeći Python 3.7. Međutim, Python SDK se može pokrenuti direktno sa Check Point Management Servera (Smart Management), ali podržava samo Python 2.7, tako da će posljednji odjeljak pružiti kod za verziju 2.7. Odmah nakon instaliranja modula, preporučujem da pogledate primjere u direktorijima examples_python2 и examples_python3.

Prvi koraci

Da bismo mogli da radimo sa komponentama cpapi modula, potrebno je da uvezemo iz modula cpapi najmanje dvije obavezne klase:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Класс APIClientArgs je odgovoran za parametre povezivanja sa API serverom i klasom APIClient je odgovoran za interakciju sa API-jem.

Određivanje parametara veze

Da biste definirali različite parametre za povezivanje na API, trebate kreirati instancu klase APIClientArgs. U principu, njegovi parametri su unapred definisani i kada se skripta pokreće na kontrolnom serveru, ne treba ih specificirati.

client_args = APIClientArgs()

Ali kada radite na hostu treće strane, morate navesti barem IP adresu ili ime hosta API servera (poznatog i kao server za upravljanje). U donjem primjeru definiramo parametar veze sa serverom i dodjeljujemo mu IP adresu servera za upravljanje kao niz.

client_args = APIClientArgs(server='192.168.47.241')

Pogledajmo sve parametre i njihove zadane vrijednosti koji se mogu koristiti prilikom povezivanja na API server:

Argumenti metode __init__ klase 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

Vjerujem da su argumenti koji se mogu koristiti u instancama klase APIClientArgs intuitivni za Check Point administratore i ne zahtijevaju dodatne komentare.

Povezivanje preko APIClient-a i upravitelja konteksta

Класс APIClient Najprikladniji način da ga koristite je putem upravitelja konteksta. Sve što treba proslijediti instanci APIClient klase su parametri veze koji su definirani u prethodnom koraku.

with APIClient(client_args) as client:

Upravitelj konteksta neće automatski uputiti poziv za prijavu na API server, ali će izvršiti poziv za odjavu kada izađe iz njega. Ako iz nekog razloga odjava nije potrebna nakon završetka rada s API pozivima, morate započeti s radom bez korištenja upravitelja konteksta:

client = APIClient(clieng_args)

Provjera veze

Najlakši način da provjerite da li veza ispunjava navedene parametre je korištenje metode check_fingerprint. Ako provjera sha1 hash sume za otisak prsta API certifikata servera ne uspije (metoda je vraćena lažan), onda je to obično uzrokovano problemima veze i možemo zaustaviti izvršavanje programa (ili dati korisniku priliku da ispravi podatke o vezi):

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

Napominjemo da u budućnosti razred APIClient će provjeriti svaki API poziv (metode api_call и api_query, o njima ćemo malo dalje) sha1 certifikat otiska prsta na API serveru. Ali ako se prilikom provjere sha1 otiska prsta certifikata API servera otkrije greška (certifikat je nepoznat ili je promijenjen), metoda check_fingerprint će pružiti mogućnost da se automatski dodaju/promijene informacije o tome na lokalnom računalu. Ova provjera se može potpuno onemogućiti (ali ovo se može preporučiti samo ako se skripte pokreću na samom API serveru, kada se povezujete na 127.0.0.1), koristeći argument APIClientArgs - unsafe_auto_accept (pogledajte više o APIClientArgs ranije u “Definiranje parametara veze”).

client_args = APIClientArgs(unsafe_auto_accept=True)

Prijavite se na API server

У APIClient postoje čak 3 metode za prijavu na API server i svaki od njih razumije značenje sid(session-id), koji se automatski koristi u svakom sljedećem API pozivu u zaglavlju (ime u zaglavlju ovog parametra je X-chkp-sid), tako da nema potrebe za daljnjom obradom ovog parametra.

metoda prijave

Opcija koja koristi prijavu i lozinku (u primjeru, korisničko ime admin i lozinka 1q2w3e se prosljeđuju kao pozicioni argumenti):

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

Dodatni opcioni parametri su takođe dostupni u metodi prijave; evo njihovih imena i podrazumevanih vrednosti:

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

Metoda Login_with_api_key

Opcija pomoću api ključa (podržano počevši od upravljačke verzije R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" ovo je vrijednost API ključa za jednog od korisnika na serveru za upravljanje s metodom autorizacije API ključa):

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

U metodi login_with_api_key dostupni su isti opcioni parametri kao u metodi Ulogovati se.

login_as_root metoda

Opcija za prijavu na lokalnu mašinu sa API serverom:

     login = client.login_as_root()

Za ovu metodu su dostupna samo dva opciona parametra:

domain=None, payload=None

I konačno API poziva sebe

Imamo dvije opcije za upućivanje API poziva putem metoda api_call и api_query. Hajde da shvatimo koja je razlika između njih.

api_call

Ova metoda je primjenjiva za sve pozive. Moramo proći posljednji dio za API poziv i korisni teret u tijelu zahtjeva ako je potrebno. Ako je teret prazan, onda se uopće ne može prenijeti:

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

Izlaz za ovaj zahtjev ispod reza:

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

Izlaz za ovaj zahtjev ispod reza:

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

Odmah da rezervišem da je ovaj metod primenljiv samo za pozive čiji izlaz uključuje ofset. Takav zaključak se dešava kada sadrži ili može sadržavati veliku količinu informacija. Na primjer, ovo može biti zahtjev za listu svih kreiranih host objekata na poslužitelju upravljanja. Za takve zahtjeve API standardno vraća listu od 50 objekata (možete povećati ograničenje na 500 objekata u odgovoru). A da ne bi izvlačili informacije nekoliko puta, mijenjajući parametar pomaka u API zahtjevu, postoji metoda api_query koja to radi automatski. Primjeri poziva gdje je ova metoda potrebna: show-session, show-hosts, show-mreže, show-wildcards, show-group, show-address-ranges, show-simple-gateways, show-simple-clusters, show-access-uloge, show-pouzdani klijenti, show-paketi. U stvari, u nazivima ovih API poziva vidimo riječi u množini, tako da će se tim pozivima lakše rukovati api_query

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

Izlaz za ovaj zahtjev ispod reza:

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

Obrada rezultata API poziva

Nakon toga možete koristiti varijable i metode klase APIResponse(i unutar kontekstnog menadžera i izvan njega). Na času APIResponse 4 metode i 5 varijabli su unaprijed definirane, a na najvažnijim ćemo se detaljnije zadržati.

Pojednostavljivanje Check Point API-ja sa Python SDK-om

uspjeh

Za početak, bilo bi dobro da se uvjerite da je API poziv bio uspješan i da je vratio rezultat. Za to postoji metoda uspjeh:

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

Vraća True ako je API poziv bio uspješan (kod odgovora - 200) i False ako nije uspješan (bilo koji drugi kod odgovora). Pogodno je koristiti odmah nakon API poziva za prikaz različitih informacija ovisno o kodu odgovora.

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

statuscode

Vraća kod odgovora nakon što je obavljen API poziv.

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

Mogući kodovi odgovora: 200,400,401,403,404,409,500,501.

set_success_status

U tom slučaju može biti potrebno promijeniti vrijednost statusa uspješnosti. Tehnički, tamo možete staviti bilo šta, čak i običan niz. Ali pravi primjer bi bio resetiranje ovog parametra na False pod određenim pratećim uvjetima. U nastavku obratite pažnju na primjer kada se na upravljačkom serveru pokreću zadaci, ali ćemo ovaj zahtjev smatrati neuspješnim (podesit ćemo varijablu uspjeha na lažan, uprkos činjenici da je API poziv bio uspješan i vratio kod 200).

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

odgovor()

Metoda odgovora vam omogućava da vidite rječnik sa kodom odgovora (status_code) i tijelom odgovora (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']}}

podaci

Omogućava vam da vidite samo tijelo odgovora (tijelo) bez nepotrebnih informacija.

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

Ove informacije su dostupne samo kada je došlo do greške prilikom obrade API zahtjeva (kod odgovora ne 200). Primjer izlaza

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

Korisni primjeri

Slijede primjeri koji koriste API pozive koji su dodani u Management API 1.6.

Prvo, pogledajmo kako funkcionišu pozivi add-host и add-address-range. Recimo da treba da kreiramo sve IP adrese podmreže 192.168.0.0/24, čiji je poslednji oktet 5, kao objekte tipa host, a sve ostale IP adrese zapišemo kao objekte tipa opsega adresa. U tom slučaju isključite adresu podmreže i adresu emitiranja.

Dakle, ispod je skripta koja rješava ovaj problem i kreira 50 objekata tipa host i 51 objekat tipa raspona adresa. Da biste riješili problem, potreban je 101 API poziv (ne računajući konačni poziv za objavljivanje). Također, koristeći modul timeit, izračunavamo vrijeme potrebno za izvršavanje skripte do objave promjena.

Skripta koristeći add-host i 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')

U mom laboratorijskom okruženju, ovoj skripti je potrebno između 30 i 50 sekundi da se izvrši, u zavisnosti od opterećenja na serveru za upravljanje.

Sada da vidimo kako riješiti isti problem korištenjem API poziva add-objects-batch, podrška za koju je dodana u API verziji 1.6. Ovaj poziv vam omogućava da kreirate više objekata odjednom u jednom API zahtjevu. Štaviše, to mogu biti objekti različitih tipova (na primjer, hostovi, podmreže i rasponi adresa). Dakle, naš zadatak se može riješiti u okviru jednog API poziva.

Skripta koristeći 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')

A pokretanje ove skripte u mom laboratorijskom okruženju traje od 3 do 7 sekundi, u zavisnosti od opterećenja na serveru za upravljanje. To jest, u prosjeku, na 101 API objektu, poziv tipa serije radi 10 puta brže. Na većem broju objekata razlika će biti još impresivnija.

Sada da vidimo kako raditi sa set-objekti-batch. Koristeći ovaj API poziv, možemo grupno promijeniti bilo koji parametar. Postavimo prvu polovinu adresa iz prethodnog primjera (do .124 hosta, i rasponi također) na boju sijena, i dodijelimo boju kaki drugoj polovini adresa.

Promjena boje objekata kreiranih u prethodnom primjeru

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

Možete izbrisati više objekata u jednom API pozivu koristeći delete-objects-batch. Pogledajmo sada primjer koda koji briše sve hostove koji su prethodno kreirani putem add-objects-batch.

Brisanje objekata pomoću 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)

Sve funkcije koje se pojavljuju u novim izdanjima Check Point softvera odmah preuzimaju API pozive. Tako su se u R80.40 pojavile takve „funkcije“ kao što su Revert to revision i Smart Task, a odgovarajući API pozivi su odmah pripremljeni za njih. Štaviše, sve funkcionalnosti pri prelasku sa naslijeđenih konzola na Unified Policy način također dobivaju API podršku. Na primjer, dugo očekivano ažuriranje u verziji softvera R80.40 bilo je premještanje politike HTTPS inspekcije iz Legacy moda u Unified Policy mod, a ova funkcionalnost je odmah primila API pozive. Evo primjera koda koji dodaje pravilo na gornju poziciju politike HTTPS inspekcije koje isključuje 3 kategorije iz inspekcije (zdravstvo, finansije, državne usluge), koje su zabranjene za inspekciju u skladu sa zakonom u nizu zemalja.

Dodajte pravilo u politiku HTTPS inspekcije

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

Pokretanje Python skripti na Check Point serveru za upravljanje

Sve je isto README.md sadrži informacije o tome kako pokrenuti Python skripte direktno sa kontrolnog servera. Ovo može biti zgodno kada ne možete da se povežete na API server sa druge mašine. Snimio sam šestominutni video u kojem gledam kako instaliram modul cpapi i karakteristike pokretanja Python skripti na kontrolnom serveru. Kao primjer, pokreće se skripta koja automatizira konfiguraciju novog gateway-a za zadatak kao što je mrežna revizija Sigurnosna provjera. Među karakteristikama sa kojima sam morao da se pozabavim: funkcija se još nije pojavila u Pythonu 2.7 ulazni, pa se za obradu informacija koje korisnik unese koristi funkcija raw_input. Inače, kod je isti kao i za pokretanje sa drugih mašina, samo što je zgodnije koristiti funkciju login_as_root, kako ne biste ponovo naveli svoje korisničko ime, lozinku i IP adresu servera za upravljanje.

Skripta za brzo postavljanje Sigurnosne provjere

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

Primjer datoteke s rječnikom lozinki Additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

zaključak

Ovaj članak ispituje samo osnovne mogućnosti rada Python SDK i modul cpapi(kao što ste mogli pretpostaviti, ovo su zapravo sinonimi), a proučavanjem koda u ovom modulu otkrit ćete još više mogućnosti za rad s njim. Moguće je da ćete ga poželjeti dopuniti vlastitim klasama, funkcijama, metodama i varijablama. Uvijek možete podijeliti svoj rad i pogledati druge skripte za Check Point u odjeljku CodeHub u zajednici CheckMates, koji okuplja i programere proizvoda i korisnike.

Sretno kodiranje i hvala na čitanju do kraja!

izvor: www.habr.com

Dodajte komentar