Check Point APIa sinplifikatzea Python SDK-rekin

Check Point APIa sinplifikatzea Python SDK-rekinAPIekin elkarrekintzaren ahalmen osoa programa-kodearekin batera erabiltzen denean agerian geratzen da, API eskaerak eta API erantzunak aztertzeko tresnak dinamikoki sortzea posible denean. Hala ere, oraindik nabaritu gabe jarraitzen du Python Software Garapenerako Kita (aurrerantzean Python SDK deitzen zaio). Check Point Management APIa, baina alferrik. Garatzaileen eta automatizazio zaleen bizitza nabarmen errazten du. Python-ek ospe handia lortu du azkenaldian eta hutsunea betetzea eta ezaugarri nagusiak berrikustea erabaki nuen. Check Point API Python Garapen Kit. Artikulu honek HabrΓ©-ri buruzko beste artikulu baten osagarri bikaina da Check Point R80.10 APIa. Kudeaketa CLI, script eta gehiagoren bidez. Python SDK erabiliz script-ak nola idazten diren aztertuko dugu eta 1.6 bertsioko Kudeaketa APIaren funtzionalitate berria aztertuko dugu (R80.40tik aurrera onartzen da). Artikulua ulertzeko, APIekin eta Pythonekin lan egiteko oinarrizko ezagutzak beharko dituzu.

Check Point APIa aktiboki garatzen ari da eta momentuz honako hauek kaleratu dira:

Python SDK-k Kudeaketa APIarekin eta elkarrekintza soilik onartzen du Gaia APIa. Modulu honetan klase, metodo eta aldagai garrantzitsuenak aztertuko ditugu.

Check Point APIa sinplifikatzea Python SDK-rekin

Modulua instalatzea

Modulua cpapi azkar eta erraz instalatzen da Check Point-en biltegi ofiziala github-en laguntzarekin PIP. Instalazio argibide zehatzak hemen daude eskuragarri IRAKURRI.md. Modulu hau Python 2.7 eta 3.7 bertsioekin lan egiteko egokituta dago. Artikulu honetan, Python 3.7 erabiliz adibideak emango dira. Hala ere, Python SDK zuzenean exekutatu daiteke Check Point Management Server-tik (Smart Management), baina Python 2.7 bakarrik onartzen dute, beraz, azken atalean 2.7 bertsiorako kodea emango du. Modulua instalatu eta berehala, direktorioetako adibideak ikustea gomendatzen dut adibideak_python2 ΠΈ adibideak_python3.

Pizten

cpapi moduluaren osagaiekin lan egin ahal izateko, modulutik inportatu behar dugu cpapi gutxienez beharrezkoak diren bi klase:

APIClient ΠΈ APIClientArgs

from cpapi import APIClient, APIClientArgs

Class APIClientArgs API zerbitzarirako konexio-parametroez eta klaseaz arduratzen da APIClient APIarekin interakzioaz arduratzen da.

Konexio-parametroak zehaztea

APIra konektatzeko hainbat parametro definitzeko, klasearen instantzia bat sortu behar duzu APIClientArgs. Printzipioz, bere parametroak aurrez definituta daude eta script-a kontrol-zerbitzarian exekutatzen denean, ez dira zehaztu beharrik.

client_args = APIClientArgs()

Baina hirugarrenen ostalari batean exekutatzen ari zarenean, gutxienez API zerbitzariaren IP helbidea edo ostalari-izena zehaztu behar duzu (kudeaketa zerbitzari gisa ere ezaguna). Beheko adibidean, zerbitzariaren konexio-parametroa definitzen dugu eta kudeaketa-zerbitzariaren IP helbidea esleitzen diogu kate gisa.

client_args = APIClientArgs(server='192.168.47.241')

Ikus ditzagun API zerbitzariarekin konektatzean erabil daitezkeen parametro guztiak eta balio lehenetsiak:

APIClientArgs klaseko __init__ metodoaren argudioak

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

Uste dut APIClientArgs klaseko instantzietan erabil daitezkeen argudioak intuitiboak direla Check Pointeko administratzaileentzat eta ez dutela iruzkin gehigarririk behar.

APIClient eta testuinguru-kudeatzailearen bidez konektatzea

Class APIClient Erabiltzeko modurik erosoena testuinguru-kudeatzailea da. APIClient klaseko instantzia batera pasatu behar dena aurreko urratsean definitu ziren konexio-parametroak dira.

with APIClient(client_args) as client:

Testuinguru-kudeatzaileak ez du automatikoki saioa hasteko deirik egingo API zerbitzariari, baina amaitzeko deia egingo du bertatik irtetean. Arrazoiren batengatik ez bada saioa amaitu behar API deiekin lan egiten amaitu ondoren, lanean hasi behar duzu testuinguru-kudeatzailea erabili gabe:

client = APIClient(clieng_args)

Konexioa egiaztatzea

Konexioak zehaztutako parametroak betetzen dituen egiaztatzeko modurik errazena metodoa erabiltzea da egiaztatu_hatz-marka. Zerbitzariaren API ziurtagiriaren hash-markaren sha1 hash batura egiaztatzeak huts egiten badu (itzultzen den metodoa False), orduan konexio-arazoek eragiten dute normalean eta programaren exekuzioa geldiarazi dezakegu (edo erabiltzaileari konexio-datuak zuzentzeko aukera eman):

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

Kontuan izan etorkizunean klasea APIClient API dei guztiak (metodoak api_deitu ΠΈ api_query, haiei buruz pixka bat gehiago hitz egingo dugu) sha1 hatz-markaren ziurtagiria API zerbitzarian. Baina, API zerbitzariaren ziurtagiriaren sha1 hatz-marka egiaztatzean errore bat hautematen bada (ziurtagiria ezezaguna da edo aldatu egin da), metodoa egiaztatu_hatz-marka tokiko makinan horri buruzko informazioa automatikoki gehitzeko/aldatzeko aukera emango du. Egiaztapen hau guztiz desgaitu daiteke (baina hau bakarrik gomenda daiteke scriptak API zerbitzarian bertan exekutatzen badira, 127.0.0.1-era konektatzean), APIClientArgs argumentua erabiliz - unsafe_auto_onar (ikusi gehiago APIClientArgs-i buruz "Konexio-parametroak definitzen" atalean).

client_args = APIClientArgs(unsafe_auto_accept=True)

Hasi saioa API zerbitzarian

Π£ APIClient API zerbitzarian saioa hasteko 3 metodo daude, eta horietako bakoitzak esanahia ulertzen du sid(saio-id), goiburuko hurrengo API dei bakoitzean automatikoki erabiltzen dena (parametro honen goiburuko izena da X-chkp-sid), beraz, ez dago parametro hau gehiago prozesatu beharrik.

saioa hasteko metodoa

Saio-hasiera eta pasahitza erabiliz aukera (adibidean, admin erabiltzaile-izena eta 1q2w3e pasahitza posizio-argumentu gisa pasatzen dira):

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

Aukerako parametro gehigarriak ere eskuragarri daude saioa hasteko metodoan; hona hemen haien izenak eta balio lehenetsiak:

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

Login_with_api_key metodoa

Aukera api gako bat erabiliz (R80.40 kudeaketa bertsiotik hasita onartzen da/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" hau da API gakoaren baimen-metodoa duen kudeaketa zerbitzariko erabiltzaileetako baten API gakoaren balioa):

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

Metodoan login_with_api_key metodoaren aukerako parametro berberak daude eskuragarri saioa hasi.

login_as_root metodoa

API zerbitzari batekin tokiko makina batean saioa hasteko aukera:

     login = client.login_as_root()

Metodo honetarako aukerako bi parametro baino ez daude eskuragarri:

domain=None, payload=None

Eta azkenik, APIak bere buruari deitzen dio

Metodoen bidez API deiak egiteko bi aukera ditugu api_deitu ΠΈ api_query. Azter dezagun zein den haien arteko aldea.

api_deitu

Metodo hau edozein deitarako aplikagarria da. Beharrezkoa izanez gero, api deiaren eta kargaren azken zatia eskaeraren gorputzean pasatu behar dugu. Karga hutsik badago, ezin izango da batere transferitu:

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

Mozketaren azpian eskaera honen irteera:

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

Mozketaren azpian eskaera honen irteera:

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

Erreserba bat egin dezadan berehala metodo hau desplazamendua dakarten deietarako soilik aplikagarria dela. Inferentzia hori informazio kopuru handia eduki edo eduki dezakeenean gertatzen da. Adibidez, hau kudeaketa zerbitzarian sortutako ostalari-objektu guztien zerrenda eskaria izan daiteke. Halako eskaeretarako, APIak 50 objektuko zerrenda itzultzen du lehenespenez (erantzunean 500 objektura igo dezakezu muga). Eta informazioa hainbat aldiz ez ateratzeko, API eskaeran offset parametroa aldatuz, badago lan hau automatikoki egiten duen api_query metodo bat. Metodo hau behar den deien adibideak: erakutsi-saioak, erakutsi-ostalariak, erakutsi-sareak, erakutsi-komodinak, erakutsi-taldeak, erakutsi-helbide-barrutiak, erakutsi-simple-gateways, show-simple-clusters, erakutsi-sarbide-rolak, erakutsi-konfiantzazko-bezeroak, ikuskizun-paketeak. Izan ere, API dei horien izenean pluraleko hitzak ikusten ditugu, beraz, dei hauek errazago kudeatzeko aukera izango da. api_query

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

Mozketaren azpian eskaera honen irteera:

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 deien emaitzak prozesatzea

Honen ondoren klaseko aldagaiak eta metodoak erabil ditzakezu APIRerantzuna(testuinguruaren kudeatzailearen barruan zein kanpoan). Klasean APIRerantzuna 4 metodo eta 5 aldagai aurredefinituta daude; garrantzitsuenetan sakonduko dugu.

Check Point APIa sinplifikatzea Python SDK-rekin

arrakasta

Hasteko, komenigarria izango litzateke API deiak arrakasta izan duela eta emaitza bat itzuli duela ziurtatzea. Metodo bat dago horretarako arrakasta:

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

True itzultzen du API deiak arrakastatsua izan bada (erantzun-kodea - 200) eta False ez bada (beste edozein erantzun-kode). Erosoa da API dei baten ondoren berehala erabiltzea erantzun-kodearen arabera informazio ezberdina bistaratzeko.

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

egoera-kodea

Erantzun kodea itzultzen du API dei bat egin ondoren.

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

Erantzun-kode posibleak: 200,400,401,403,404,409,500,501.

ezarri_success_status

Kasu honetan, baliteke arrakasta egoeraren balioa aldatzea beharrezkoa izatea. Teknikoki, edozer jar dezakezu bertan, baita ohiko kate bat ere. Baina benetako adibide bat parametro hau False gisa berrezartzea izango litzateke, horrekin batera baldintza jakin batzuetan. Jarraian, erreparatu adibideari kudeaketa zerbitzarian zereginak exekutatzen direnean, baina eskaera hau arrakastatsutzat joko dugu (arrakasta aldagaia ezarriko dugu. False, API deiak arrakastatsua izan eta 200 kodea itzuli duen arren).

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

erantzuna()

Erantzun-metodoak hiztegia erantzun-kodearekin (egoera_kodea) eta erantzunaren gorputzarekin (gorputza) ikusteko aukera ematen du.

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

datuak

Erantzunaren (gorputza) soilik ikusteko aukera ematen du alferrikako informaziorik gabe.

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

Informazio hau API eskaera prozesatzen denean errore bat gertatu denean bakarrik dago eskuragarri (erantzun kodea ez 200). Irteera adibidea

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

Adibide erabilgarriak

Jarraian, Management API 1.6-n gehitu ziren API deiak erabiltzen dituzten adibideak dira.

Lehenik eta behin, ikus dezagun nola funtzionatzen duten deiak gehitu-ostalari ΠΈ gehitu-helbide-barrutia. Demagun 192.168.0.0/24 azpisareko IP helbide guztiak sortu behar ditugula, azken zortzikotea 5 izanik, ostalari motako objektu gisa, eta gainerako IP helbide guztiak helbide-barruti motako objektu gisa idatzi behar ditugula. Kasu honetan, baztertu azpisarearen helbidea eta difusio helbidea.

Beraz, behean arazo hau konpontzen duen script bat dago eta ostalari motako 50 objektu eta helbide-barruti motako 51 objektu sortzen ditu. Arazoa konpontzeko, 101 API dei behar dira (azken argitaratze-deia zenbatu gabe). Era berean, timeit modulua erabiliz, scripta exekutatzeko behar den denbora kalkulatzen dugu aldaketak argitaratu arte.

Add-host eta add-address-range erabiliz gidoia

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

Nire laborategiko ingurunean, script hau 30 eta 50 segundo artean exekutatzen da, kudeaketa zerbitzariaren kargaren arabera.

Orain ikus dezagun arazo bera nola konpondu API dei bat erabiliz gehitu-objektuak-batch, laguntza API 1.6 bertsioan gehitu zen. Dei honek objektu asko aldi berean sor ditzakezu API eskaera batean. Gainera, mota ezberdinetako objektuak izan daitezke (adibidez, ostalariak, azpisareak eta helbide-barrutiak). Horrela, gure zeregina API dei baten esparruan konpondu daiteke.

Add-objects-batch erabiliz gidoia

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

Eta script hau nire laborategiko ingurunean exekutatzen 3 eta 7 segundo irauten du, kudeaketa zerbitzariaren kargaren arabera. Hau da, batez beste, 101 API objektutan batch motako deia 10 aldiz azkarrago exekutatzen da. Objektu kopuru handiago batean aldea are ikusgarriagoa izango da.

Orain ikus dezagun nola lan egin multzo-objektu-sorta. API dei hau erabiliz, edozein parametro alda dezakegu masiboki. Ezar ditzagun aurreko adibideko helbideen lehen erdia (gehienez .124 ostalariak, eta barrutiak ere) koloreko sienna, eta esleitu kaki kolorea helbideen bigarren erdiari.

Aurreko adibidean sortutako objektuen kolorea aldatzea

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

Hainbat objektu ezaba ditzakezu API dei batean erabiliz ezabatu-objektuak-batch. Ikus dezagun orain aurretik sortutako ostalari guztiak ezabatzen dituen kode-adibide bat gehitu-objektuak-batch.

Objektuak ezabatzea delete-objects-batch erabiliz

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

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

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

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

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

print(delete_objects_batch.data)

Check Point softwarearen bertsio berrietan agertzen diren funtzio guztiek berehala eskuratzen dituzte API deiak. Horrela, R80.40-n Revert to revision eta Smart Task bezalako "ezaugarriak" agertu ziren, eta dagozkien API deiak berehala prestatu ziren. Gainera, Legacy kontsoletatik Politika bateratu modura pasatzen direnean funtzionalitate guztiek API laguntza ere eskuratzen dute. Esaterako, R80.40 software bertsioan aspaldi itxaroten den eguneraketa HTTPS Inspection politika Legacy modutik Unified Policy modura pasatzea izan zen, eta funtzionalitate honek berehala jaso zituen API deiak. Hona hemen HTTPS Ikuskapen-politikaren goiko posizioari arau bat gehitzen dion kode-adibide bat, 3 kategoria ikuskapenetik kanpo uzten dituena (Osasuna, Finantza, Gobernu Zerbitzuak), legediaren arabera ikuskatzea debekatuta daudenak.

Gehitu arau bat HTTPS Ikuskapen-politikari

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 scriptak exekutatzen Check Point kudeaketa zerbitzarian

Dena berdin IRAKURRI.md kontrol zerbitzaritik zuzenean Python scriptak exekutatzeko informazioa dauka. Hau erosoa izan daiteke beste makina batetik API zerbitzarira konektatu ezin zarenean. Sei minutuko bideo bat grabatu nuen eta bertan modulua instalatzen ikusten dudan cpapi eta kontrol zerbitzarian Python script-ak exekutatzeko ezaugarriak. Adibide gisa, sarearen auditoria bezalako ataza baterako atebide berri baten konfigurazioa automatizatzen duen script bat exekutatzen da. Segurtasun Egiaztapena. Landu behar izan ditudan ezaugarrien artean: funtzioa oraindik ez da agertu Python 2.7-n sarrera, beraz, erabiltzaileak sartzen duen informazioa prozesatzeko, funtzio bat erabiltzen da sarrera_gordina. Bestela, kodea beste makina batzuetatik abiarazteko berdina da, funtzioa erabiltzea erosoagoa da login_as_root, kudeaketa zerbitzariaren erabiltzaile-izena, pasahitza eta IP helbidea berriro ez zehazteko.

Segurtasun-egiaztapena azkar konfiguratzeko scripta

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

Adibide-fitxategi bat pasahitz hiztegi batekin addition_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","ΠΏΠ°Ρ€ΠΎΠ»ΡŒ","ΠŸΠ°Ρ€ΠΎΠ»ΡŒ","ΠšΠ»ΡŽΡ‡","ΠΊΠ»ΡŽΡ‡","ΡˆΠΈΡ„Ρ€","Π¨ΠΈΡ„Ρ€"] }

Ondorioa

Artikulu honek lanaren oinarrizko aukerak baino ez ditu aztertzen Python SDK eta modulua cpapi(Igarri zenuten bezala, hauek benetan sinonimoak dira), eta modulu honetako kodea aztertuz gero eta aukera gehiago aurkituko dituzu horrekin lan egiteko. Baliteke zure klase, funtzio, metodo eta aldagaiekin osatu nahi izatea. Beti parteka dezakezu zure lana eta Check Point-erako beste script batzuk ikus ditzakezu atalean CodeHub komunitatean CheckMates, produktuen garatzaileak zein erabiltzaileak biltzen dituena.

Zoriontsu kodeketa eta eskerrik asko amaiera arte irakurtzeagatik!

Iturria: www.habr.com

Gehitu iruzkin berria