Check Point API:n yksinkertaistaminen Python SDK:lla

Check Point API:n yksinkertaistaminen Python SDK:llaAPI-vuorovaikutuksen täysi teho paljastuu, kun sitä käytetään yhdessä ohjelmakoodin kanssa, kun on mahdollista luoda dynaamisesti API-pyyntöjä ja työkaluja API-vastausten analysointiin. Se on kuitenkin edelleen huomaamaton Python Software Development Kit (jäljempänä Python SDK) varten Check Point Management API, mutta turhaan. Se yksinkertaistaa merkittävästi kehittäjien ja automaatioharrastajien elämää. Python on saavuttanut valtavan suosion viime aikoina ja päätin täyttää aukon ja käydä läpi tärkeimmät ominaisuudet. Check Point API Python Development Kit. Tämä artikkeli toimii erinomaisena lisäyksenä toiseen Habré-artikkeliin Check Point R80.10 API. Hallinta CLI:n, komentosarjojen ja muiden kautta. Tarkastellaan skriptien kirjoittamista Python SDK:n avulla ja tarkastellaan lähemmin uutta Management API -toimintoa versiossa 1.6 (tuettu R80.40:stä alkaen). Ymmärtääksesi artikkelin tarvitset perustiedot sovellusliittymien ja Pythonin kanssa työskentelystä.

Check Point kehittää aktiivisesti API:ta ja tällä hetkellä on julkaistu seuraavat:

Python SDK tukee tällä hetkellä vain vuorovaikutusta Management API:n ja Gaia API. Tässä moduulissa tarkastellaan tärkeimpiä luokkia, menetelmiä ja muuttujia.

Check Point API:n yksinkertaistaminen Python SDK:lla

Moduulin asennus

Moduuli cpapi asentaa nopeasti ja helposti osoitteesta virallinen Check Point -tietovarasto githubissa kautta pIP. Tarkemmat asennusohjeet löytyvät osoitteesta README.md. Tämä moduuli on mukautettu toimimaan Python-versioiden 2.7 ja 3.7 kanssa. Tässä artikkelissa annetaan esimerkkejä Python 3.7:n avulla. Python SDK:ta voidaan kuitenkin ajaa suoraan Check Point Management Serveristä (Smart Management), mutta ne tukevat vain Python 2.7:ää, joten viimeinen osa sisältää koodin versiolle 2.7. Heti moduulin asennuksen jälkeen suosittelen katsomaan esimerkkejä hakemistoista examples_python2 и examples_python3.

Aloittaminen

Jotta voimme työskennellä cpapi-moduulin komponenttien kanssa, meidän on tuotava moduulista cpapi vähintään kaksi pakollista luokkaa:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Luokka APIClientArgs vastaa yhteysparametreista API-palvelimeen ja luokkaan APIClient on vastuussa vuorovaikutuksesta API:n kanssa.

Yhteysparametrien määrittäminen

Jotta voit määrittää erilaisia ​​parametreja API-yhteyden muodostamista varten, sinun on luotava luokan esiintymä APIClientArgs. Periaatteessa sen parametrit ovat ennalta määritettyjä, eikä niitä tarvitse määrittää ajettaessa komentosarjaa ohjauspalvelimella.

client_args = APIClientArgs()

Mutta kun käytät kolmannen osapuolen isäntäkonetta, sinun on määritettävä ainakin API-palvelimen (tunnetaan myös hallintapalvelimena) IP-osoite tai isäntänimi. Alla olevassa esimerkissä määritämme palvelinyhteysparametrin ja annamme sille hallintapalvelimen IP-osoitteen merkkijonona.

client_args = APIClientArgs(server='192.168.47.241')

Katsotaanpa kaikkia parametreja ja niiden oletusarvoja, joita voidaan käyttää muodostettaessa yhteyttä API-palvelimeen:

APIClientArgs-luokan __init__-metodin argumentit

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

Uskon, että argumentit, joita voidaan käyttää APIClientArgs-luokan tapauksissa, ovat intuitiivisia Check Pointin järjestelmänvalvojille eivätkä vaadi lisäkommentteja.

Yhteyden muodostaminen APIClientin ja kontekstinhallinnan kautta

Luokka APIClient Kätevin tapa käyttää sitä on kontekstinhallinnan kautta. APIClient-luokan ilmentymälle tarvitsee välittää vain edellisessä vaiheessa määritetyt yhteysparametrit.

with APIClient(client_args) as client:

Kontekstinhallinta ei soita automaattisesti sisäänkirjautumispuhelua API-palvelimelle, mutta se tekee uloskirjautumiskutsun poistuessaan siitä. Jos jostain syystä uloskirjautumista ei tarvita API-kutsujen työskentelyn jälkeen, sinun on aloitettava työskentely ilman kontekstinhallintaa:

client = APIClient(clieng_args)

Tarkistaa yhteyttä

Helpoin tapa tarkistaa, täyttääkö yhteys määritetyt parametrit, on käyttää menetelmää tarkista_sormenjälki. Jos palvelimen API-varmenteen sormenjäljen sha1-hajasumman vahvistus epäonnistuu (palautti menetelmän Väärä), tämä johtuu yleensä yhteysongelmista ja voimme pysäyttää ohjelman suorittamisen (tai antaa käyttäjälle mahdollisuuden korjata yhteystiedot):

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

Huomaa, että tulevaisuudessa luokka APIClient tarkistaa jokaisen API-kutsun (menetelmät api_call и api_query, puhumme niistä hieman pidemmälle) sha1-sormenjälkisertifikaatti API-palvelimella. Mutta jos API-palvelimen varmenteen sha1-sormenjälkeä tarkistettaessa havaitaan virhe (varmenne on tuntematon tai sitä on muutettu), menetelmä tarkista_sormenjälki tarjoaa mahdollisuuden lisätä/muuttaa sitä koskevia tietoja automaattisesti paikallisella koneella. Tämä tarkistus voidaan poistaa kokonaan käytöstä (mutta tätä voidaan suositella vain, jos komentosarjat suoritetaan itse API-palvelimella, kun muodostetaan yhteys 127.0.0.1:een), käyttämällä APIClientArgs-argumenttia - unsafe_auto_accept (katso lisää APIClientArgsista aiemmin kohdassa "Yhteysparametrien määrittäminen").

client_args = APIClientArgs(unsafe_auto_accept=True)

Kirjaudu API-palvelimelle

У APIClient API-palvelimelle kirjautumiseen on jopa kolme tapaa, ja jokainen niistä ymmärtää merkityksen sid(session-id), jota käytetään automaattisesti jokaisessa myöhemmässä API-kutsussa otsikossa (tämän parametrin otsikossa oleva nimi on X-chkp-sid), joten tätä parametria ei tarvitse käsitellä enempää.

kirjautumismenetelmä

Vaihtoehto kirjautumistunnuksella ja salasanalla (esimerkissä käyttäjätunnus admin ja salasana 1q2w3e välitetään sijaintiargumentteina):

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

Muut valinnaiset parametrit ovat myös saatavilla kirjautumistavassa; tässä ovat niiden nimet ja oletusarvot:

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

Kirjaudu_api_avain-menetelmällä

Vaihtoehto api-avaimella (tuettu hallintaversiosta R80.40/Management API v1.6 alkaen, "3TsbPJ8ZKjaJGvFyoFqHFA==" tämä on API-avaimen arvo yhdelle käyttäjälle hallintapalvelimella, jolla on API-avaimen valtuutusmenetelmä):

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

Menetelmässä login_with_api_key samat valinnaiset parametrit ovat saatavilla kuin menetelmässä Kirjaudu sisään.

login_as_root-menetelmä

Mahdollisuus kirjautua sisään paikalliseen koneeseen API-palvelimella:

     login = client.login_as_root()

Tälle menetelmälle on käytettävissä vain kaksi valinnaista parametria:

domain=None, payload=None

Ja lopuksi API kutsuu itseään

Meillä on kaksi vaihtoehtoa tehdä API-kutsuja menetelmien kautta api_call и api_query. Selvitetään, mikä ero niillä on.

api_call

Tämä menetelmä soveltuu kaikkiin puheluihin. Meidän on tarvittaessa välitettävä api-kutsun ja hyötykuorman viimeinen osa pyynnön rungossa. Jos hyötykuorma on tyhjä, sitä ei voi lähettää ollenkaan:

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

Tämän pyynnön tulos leikkauksen alla:

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

Tämän pyynnön tulos leikkauksen alla:

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

Haluan tehdä varauksen heti, että tämä menetelmä soveltuu vain puheluille, joiden lähtö sisältää offsetin. Tällainen päätelmä syntyy, kun se sisältää tai voi sisältää suuren määrän tietoa. Tämä voi esimerkiksi olla pyyntö saada luettelo kaikista hallintapalvelimella luoduista isäntäobjekteista. Tällaisille pyynnöille API palauttaa oletusarvoisesti 50 objektin luettelon (voit nostaa rajan 500 objektiin vastauksessa). Ja jotta tietoja ei vedetä useita kertoja muuttamalla API-pyynnön offset-parametria, on api_query-menetelmä, joka toimii automaattisesti. Esimerkkejä puheluista, joissa tätä menetelmää tarvitaan: show-istunnot, show-isännät, show-verkostot, show-jokerimerkit, show-ryhmät, näytä-osoitealueet, show-simple-yhdyskäytävät, näytä-yksinkertaiset-klusterit, näytä-käyttöroolit, näytä-luotetut asiakkaat, show-paketit. Itse asiassa näemme näiden API-kutsujen nimissä monikkosanoja, joten nämä kutsut on helpompi käsitellä api_query

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

Tämän pyynnön tulos leikkauksen alla:

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

API-kutsujen tulosten käsittely

Tämän jälkeen voit käyttää luokan muuttujia ja menetelmiä APIResponse(sekä kontekstinhallinnan sisällä että sen ulkopuolella). Luokassa APIResponse 4 menetelmää ja 5 muuttujaa on ennalta määritetty, joista tärkeimpiä käsitellään tarkemmin.

Check Point API:n yksinkertaistaminen Python SDK:lla

menestys

Aluksi olisi hyvä varmistaa, että API-kutsu onnistui ja palautti tuloksen. Tähän on olemassa menetelmä menestys:

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

Palauttaa True, jos API-kutsu onnistui (vastauskoodi - 200), ja False, jos se ei onnistunut (mikä tahansa muu vastauskoodi). Sitä on kätevä käyttää heti API-kutsun jälkeen erilaisten tietojen näyttämiseen vastauskoodista riippuen.

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

tilakoodi

Palauttaa vastauskoodin API-kutsun jälkeen.

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

Mahdolliset vastauskoodit: 200,400,401,403,404,409,500,501.

set_success_status

Tässä tapauksessa onnistumistilan arvoa voi olla tarpeen muuttaa. Teknisesti voit laittaa sinne mitä tahansa, jopa tavallisen merkkijonon. Mutta todellinen esimerkki olisi tämän parametrin palauttaminen arvoon False tietyissä liitännäisolosuhteissa. Kiinnitä huomiota alla olevaan esimerkkiin, kun hallintapalvelimella on tehtäviä käynnissä, mutta pidämme tätä pyyntöä epäonnistuneena (asetamme menestysmuuttujaksi Väärä, huolimatta siitä, että API-kutsu onnistui ja palautti koodin 200).

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

vastaus()

Vastausmenetelmän avulla voit tarkastella sanakirjaa vastauskoodilla (status_code) ja vastauksen rungolla (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']}}

tiedot

Voit nähdä vain vastauksen rungon (runko) ilman tarpeettomia tietoja.

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

virheviesti

Nämä tiedot ovat saatavilla vain, kun API-pyyntöä käsiteltäessä tapahtui virhe (vastauskoodi ei 200). Esimerkkituloste

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

Hyödyllisiä esimerkkejä

Seuraavat ovat esimerkkejä, jotka käyttävät API-kutsuja, jotka on lisätty Management API 1.6:een.

Katsotaanpa ensin, miten puhelut toimivat add-isäntä и lisää-osoite-alue. Oletetaan, että meidän on luotava kaikki aliverkon 192.168.0.0/24 IP-osoitteet, joiden viimeinen oktetti on 5, isäntätyypin objekteiksi ja kirjoitettava kaikki muut IP-osoitteet osoitealueen tyypin objekteiksi. Jätä tässä tapauksessa pois aliverkon osoite ja lähetysosoite.

Alla on siis komentosarja, joka ratkaisee tämän ongelman ja luo 50 isäntätyyppistä ja 51 osoitealueen tyyppistä objektia. Ongelman ratkaisemiseksi tarvitaan 101 API-kutsua (lukuun ottamatta lopullista julkaisukutsua). Timeit-moduulin avulla laskemme myös ajan, joka kuluu skriptin suorittamiseen ennen kuin muutokset julkaistaan.

Komentosarja käyttämällä add-host ja 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')

Lab-ympäristössäni tämän skriptin suorittaminen kestää 30–50 sekuntia hallintapalvelimen kuormituksesta riippuen.

Katsotaan nyt kuinka ratkaista sama ongelma API-kutsulla add-objects-batch, jonka tuki lisättiin API-versioon 1.6. Tämän kutsun avulla voit luoda useita objekteja kerralla yhdessä API-pyynnössä. Lisäksi nämä voivat olla erityyppisiä objekteja (esimerkiksi isäntiä, aliverkkoja ja osoitealueita). Siten tehtävämme voidaan ratkaista yhden API-kutsun puitteissa.

Komentosarja käyttämällä 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')

Ja tämän komentosarjan suorittaminen laboratorioympäristössäni kestää 3–7 sekuntia hallintapalvelimen kuormituksesta riippuen. Eli keskimäärin 101 API-objektissa erätyyppinen kutsu suoritetaan 10 kertaa nopeammin. Suuremmalla määrällä kohteita ero on vieläkin vaikuttavampi.

Katsotaan nyt kuinka työskennellä set-objects-batch. Tämän API-kutsun avulla voimme joukkomuuttaa mitä tahansa parametria. Asetetaan edellisen esimerkin osoitteiden ensimmäinen puolisko (jopa 124 isäntä ja myös alueet) Sienna-väriksi ja määritetään khaki-väri osoitteiden toiselle puoliskolle.

Edellisessä esimerkissä luotujen objektien värin muuttaminen

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

Voit poistaa useita objekteja yhdessä API-kutsussa käyttämällä delete-objects-batch. Katsotaanpa nyt koodiesimerkkiä, joka poistaa kaikki aiemmin luodut isännät add-objects-batch.

Objektien poistaminen komennolla 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)

Kaikki Check Point -ohjelmiston uusissa julkaisuissa näkyvät toiminnot saavat välittömästi API-kutsuja. Siten R80.40:ssä ilmestyi sellaiset "ominaisuudet" kuin Revert to revision ja Smart Task, ja niitä varten valmisteltiin välittömästi vastaavat API-kutsut. Lisäksi kaikki toiminnot siirtyessä vanhoista konsoleista Unified Policy -tilaan saavat myös API-tuen. Esimerkiksi ohjelmistoversion R80.40 kauan odotettu päivitys oli HTTPS-tarkastuskäytännön siirtäminen Legacy-tilasta Unified Policy -tilaan, ja tämä toiminto sai välittömästi API-kutsuja. Tässä on esimerkki koodista, joka lisää HTTPS-tarkastuskäytännön ylimpään kohtaan säännön, joka sulkee tarkastuksen ulkopuolelle kolme luokkaa (terveys, talous, hallintopalvelut), joiden tarkastaminen on kielletty useissa maissa lain mukaan.

Lisää sääntö HTTPS-tarkastuskäytäntöön

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-komentosarjojen suorittaminen Check Pointin hallintapalvelimella

Kaikki on samaa README.md sisältää tietoja Python-komentosarjojen suorittamisesta suoraan ohjauspalvelimelta. Tämä voi olla kätevää, kun et pysty muodostamaan yhteyttä API-palvelimeen toisesta koneesta. Kuvasin kuuden minuutin videon, jossa katson moduulin asennusta cpapi ja Python-komentosarjojen suorittamisen ominaisuudet ohjauspalvelimella. Esimerkkinä suoritetaan komentosarja, joka automatisoi uuden yhdyskäytävän konfiguroinnin tehtävää, kuten verkon valvontaa varten. Turvatarkistus. Ominaisuuksista, joita jouduin käsittelemään: toimintoa ei ole vielä ilmestynyt Python 2.7: ssä panos, joten käyttäjän syöttämien tietojen käsittelemiseen käytetään toimintoa raaka_syöttö. Muuten koodi on sama kuin muista koneista käynnistettäessä, vain toimintoa on kätevämpi käyttää login_as_root, jotta et määritä enää omaa käyttäjätunnustasi, salasanaasi ja hallintapalvelimen IP-osoitettasi.

Komentosarja suojaustarkistuksen nopeaa käyttöönottoa varten

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

Esimerkkitiedosto, jossa on salasanasanakirja Additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

Johtopäätös

Tässä artikkelissa tarkastellaan vain työn perusmahdollisuuksia Python SDK ja moduuli cpapi(kuten olet ehkä arvannut, nämä ovat itse asiassa synonyymejä), ja tutkimalla tämän moduulin koodia löydät vielä enemmän mahdollisuuksia työskennellä sen kanssa. On mahdollista, että haluat täydentää sitä omilla luokillasi, funktioillasi, menetelmilläsi ja muuttujillasi. Voit aina jakaa työsi ja tarkastella muita Check Pointin skriptejä osiossa CodeHub yhteisössä CheckMates, joka kokoaa yhteen sekä tuotekehittäjät että käyttäjät.

Hyvää koodausta ja kiitos, että luit loppuun!

Lähde: will.com

Lisää kommentti