Nyederhanakake Check Point API karo Python SDK

Nyederhanakake Check Point API karo Python SDKKekuwatan lengkap interaksi karo API dicethakaké nalika digunakake bebarengan karo kode program, nalika ana kesempatan kanggo mbosenke mbentuk panjalukan API lan alat kanggo nganalisa respon API. Nanging, isih tetep ora digatekake Kit Pangembangan Piranti Lunak Python (saiki diarani Python SDK) kanggo Priksa Point Management API, nanging muspra. Iki nggawe urip luwih gampang kanggo pangembang lan penggemar otomatisasi. Python wis entuk popularitas gedhe lan aku mutusake kanggo ngisi kesenjangan lan mriksa fitur utama Priksa Point API Python Development Kit. Artikel iki minangka pelengkap banget kanggo artikel liyane babagan Habr Priksa Point R80.10 API. Manajemen liwat CLI, script lan liyane. Kita bakal nimbang carane nulis script nggunakake Python SDK lan manggon ing liyane rinci ing fungsi anyar Manajemen API ing versi 1.6 (didhukung wiwit R80.40). Kanggo mangerteni artikel kasebut, sampeyan butuh kawruh dhasar babagan nggarap API lan Python.

Check Point aktif ngembangake API lan saiki wis dirilis:

Python SDK saiki mung ndhukung interaksi karo Manajemen API lan Gaia APIKita bakal nyakup kelas, metode lan variabel sing paling penting ing modul iki.

Nyederhanakake Check Point API karo Python SDK

Nginstal modul

Modul cpapi Nginstal cepet lan gampang saka Repositori github resmi Check Point kanthi pitulung saka pip. Instruksi instalasi rinci kasedhiya ing README.md. Modul iki diadaptasi kanggo nggarap versi Python 2.7 lan 3.7. Ing artikel iki, conto bakal diwenehi nggunakake Python 3.7. Nanging, Python SDK bisa mbukak langsung saka server Manajemen Check Point (Smart Management), nanging mung Python 2.7 didhukung ing wong, supaya kode kanggo versi 2.7 bakal diwenehi ing bagean pungkasan. Sanalika sawise nginstal modul, aku nyaranake ndeleng conto ing direktori conto_python2 и conto_python3.

Miwiti

Supaya kita bisa nggarap komponen modul cpapi, kita kudu ngimpor saka modul kasebut cpapi paling ora rong kelas sing dibutuhake:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Класс APIClientArgs tanggung jawab kanggo paramèter sambungan kanggo server API, lan kelas APIClient Tanggung jawab kanggo interaksi karo API.

Kita nemtokake paramèter sambungan

Kanggo nemtokake macem-macem paramèter sambungan kanggo API, sampeyan kudu nggawe conto saka kelas APIClientArgsPrinsip, paramèter kasebut wis ditemtokake lan nalika mbukak skrip ing server manajemen, ora perlu ditemtokake.

client_args = APIClientArgs()

Nanging nalika mlaku ing host pihak katelu, sampeyan kudu nemtokake paling ora alamat IP utawa jeneng host server API (alias server manajemen). Ing conto ing ngisor iki, kita nemtokake parameter sambungan server lan nemtokake alamat IP server manajemen minangka senar.

client_args = APIClientArgs(server='192.168.47.241')

Ayo goleki kabeh parameter lan nilai standar sing bisa digunakake nalika nyambung menyang server API:

Argumen metode __init__ saka kelas 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

Aku percaya yen argumen sing bisa digunakake ing kelas APIClientArgs bisa dingerteni kanthi intuisi kanggo pangurus Check Point lan ora mbutuhake komentar tambahan.

Nyambung liwat APIClient lan manajer konteks

Класс APIClient Iku paling trep kanggo nggunakake liwat manager konteks. Kabeh sing kudu diterusake menyang conto kelas APIClient yaiku paramèter sambungan sing ditetepake ing langkah sadurunge.

with APIClient(client_args) as client:

Pangatur konteks ora bakal kanthi otomatis nindakake telpon mlebu menyang server API, nanging bakal nindakake telpon logout nalika metu saka iku. Yen sakperangan alesan logout ora dibutuhake sawise rampung nggarap panggilan API, sampeyan kudu miwiti nggarap tanpa nggunakake manajer konteks:

client = APIClient(clieng_args)

Priksa sambungan

Cara sing paling gampang kanggo mriksa manawa sambungan kasebut ditindakake miturut paramèter sing ditemtokake yaiku nggunakake metode kasebut mriksa_sidik jari. Yen mriksa hash sha1 kanggo sidik jari sertifikat server API gagal (metode kasebut bali palsu), banjur iki biasane disebabake masalah sambungan lan kita bisa mungkasi eksekusi program (utawa menehi pangguna kesempatan kanggo mbenerake data sambungan):

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

Elinga yen ing mangsa ngarep kelas APIClient bakal mriksa saben panggilan API (methods api_call и api_query, kita bakal pirembagan bab mau sethitik luwih) sha1 sidik jari saka certificate ing server API. Nanging yen kesalahan dideteksi nalika mriksa sidik jari sha1 sertifikat server API (sertifikat kasebut ora dingerteni utawa wis diganti), cara kasebut mriksa_sidik jari bakal menehi kemampuan kanggo nambah / ngganti informasi babagan ing mesin lokal kanthi otomatis. Priksa iki bisa dipateni rampung (nanging iki mung bisa dianjurake ing kasus mbukak script ing server API dhewe, nalika nyambung menyang 127.0.0.1), nggunakake argumen APIClientArgs - unsafe_auto_accept (ndeleng luwih akeh babagan APIClientArgs sadurungé ing "Nemtokake paramèter sambungan").

client_args = APIClientArgs(unsafe_auto_accept=True)

Mlebet menyang server API

У APIClient ana minangka akeh minangka 3 cara mlebu menyang server API, lan saben wong elinga Nilai sid(session-id), sing digunakake kanthi otomatis ing saben panggilan API sakteruse ing header (jeneng ing header kanggo parameter iki yaiku X-chkp-sid), dadi ora perlu ngolah parameter iki maneh.

Metode login

Opsi nggunakake login lan sandhi (ing conto, jeneng pangguna admin lan sandhi 1q2w3e diterusake minangka argumen posisi):

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

Cara mlebu uga duwe paramèter opsional tambahan sing kasedhiya, ing ngisor iki jeneng lan nilai standar:

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

Metode login_with_api_key

Opsi nggunakake kunci API (didhukung wiwit saka versi manajemen R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA=" iki minangka nilai kunci API kanggo salah sawijining pangguna ing server manajemen kanthi metode wewenang kunci API):

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

Ing metode login_with_api_key paramèter opsional padha kasedhiya ing cara mlebu.

login_as_root method

Pilihan kanggo mlebu menyang mesin lokal kanthi server API:

     login = client.login_as_root()

Mung ana rong parameter opsional sing kasedhiya kanggo metode iki:

domain=None, payload=None

Lan pungkasanipun API nelpon piyambak

Kita duwe rong pilihan kanggo nelpon API liwat metode api_call и api_query. Ayo ngerteni apa bedane ing antarane.

api_call

Cara iki ditrapake kanggo telpon apa wae. We kudu pass bagean pungkasan kanggo telpon api lan payload ing awak request yen perlu. Yen muatan kosong, mula bisa diilangi kabeh:

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

Output kanggo panjalukan iki ing ngisor potong:

In [23]: api_versions                                                           
Out[23]: 
APIResponse({
    "data": {
        "current-version": "1.6",
        "supported-versions": [
            "1",
            "1.1",
            "1.2",
            "1.3",
            "1.4",
            "1.5",
            "1.6"
        ]
    },
    "res_obj": {
        "data": {
            "current-version": "1.6",
            "supported-versions": [
                "1",
                "1.1",
                "1.2",
                "1.3",
                "1.4",
                "1.5",
                "1.6"
            ]
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})
show_host = client.api_call('show-host', {'name' : 'h_8.8.8.8'})

Output kanggo panjalukan iki ing ngisor potong:

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

Ayo kula nggawe leladen langsung sing cara iki mung ditrapake kanggo telpon, output kang nganggep offset. Output kasebut kedadeyan nalika ngemot utawa bisa ngemot informasi sing akeh. Contone, iki bisa dadi panyuwunan kanggo dhaptar kabeh obyek jinis host sing digawe ing server manajemen. Kanggo panjalukan kasebut, API ngasilake dhaptar 50 obyek kanthi standar (sampeyan bisa nambah watesan kanggo 500 obyek ing respon). Lan supaya ora narik informasi kaping pirang-pirang, ngganti parameter offset ing panjalukan API, ana cara api_query, sing nindakake iki kanthi otomatis. Conto telpon ing ngendi cara iki dibutuhake: show-sessions, show-hosts, show-networks, show-wildcards, show-groups, show-address-ranges, show-simple-gateways, show-simple-cluster, show-access-roles, show-trusted-clients, show-packages. Nyatane, kanthi jeneng panggilan API iki, kita ndeleng tembung jamak, mula telpon kasebut bakal luwih gampang ditangani liwat api_query

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

Output kanggo panjalukan iki ing ngisor potong:

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

Ngolah asil panggilan API

Sawise iki, sampeyan bisa nggunakake variabel lan metode kelas. APIResponse(ing njero lan njaba manajer konteks). Kelas APIResponse Ana 4 metode sing wis ditemtokake lan 5 variabel, kita bakal ngrembug babagan sing paling penting kanthi luwih rinci.

Nyederhanakake Check Point API karo Python SDK

kasuksesan

Kaping pisanan, luwih becik mesthekake yen telpon API sukses lan ngasilake asil. Ana cara kanggo iki kasuksesan:

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

Ngasilake True yen telpon API sukses (Kode respon - 200) lan Palsu yen ora sukses (kode respon liyane). Trep kanggo nggunakake sanalika sawise telpon API kanggo nampilake informasi beda gumantung kode respon.

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

kode status

Ngasilake kode respon sawise nglakokake telpon API.

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

Kode respon sing bisa ditindakake: 200,400,401,403,404,409,500,501.

set_success_status

Ing kasus iki, bisa uga kudu ngganti nilai status sukses. Secara teknis, sampeyan bisa nyelehake apa wae, sanajan senar biasa. Nanging conto nyata bakal ngreset parameter iki menyang Palsu ing kahanan tartamtu. Ing ngisor iki, perhatikan conto nalika ana tugas sing mlaku ing server manajemen, nanging kita bakal nganggep panyuwunan iki ora kasil (kita bakal nyetel variabel sukses menyang palsu, senadyan kasunyatan sing telpon API sukses lan bali kode 200).

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

wangsulan ()

Cara nanggepi ngidini sampeyan ndeleng kamus kanthi kode respon (kode_status) lan awak tanggapan (awak).

In [94]: api_versions.response()                                                
Out[94]: 
{'status_code': 200,
 'data': {'current-version': '1.6',
  'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}}

data

Ngidini sampeyan ndeleng mung awak respon tanpa informasi sing ora perlu.

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

kesalahan_pesen

Informasi iki mung kasedhiya nalika ana kesalahan nalika ngolah panjalukan API (kode respon ora 200). Tuladha output

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

Conto migunani

Conto ing ngisor iki nggunakake panggilan API sing ditambahake ing Manajemen API versi 1.6.

Ayo diwiwiti kanthi ndeleng cara kerja telpon. nambah-host и nambah-alamat-rentang. Kita kudu nggawe kabeh alamat IP saka subnet 192.168.0.0/24, oktet pungkasan yaiku 5, minangka obyek jinis host, lan nulis kabeh alamat IP liyane minangka obyek jinis sawetara alamat. Ing kasus iki, ora kalebu alamat subnet lan alamat siaran.

Dadi, ing ngisor iki ana skrip sing ngrampungake masalah iki lan nggawe 50 obyek jinis host lan 51 obyek jinis sawetara alamat. Ngatasi masalah mbutuhake 101 panggilan API (ora ngetung panggilan nerbitake pungkasan). Uga, nggunakake modul timeit, kita ngetung wektu sing dibutuhake kanggo nglakokake naskah nganti owah-owahan diterbitake.

Skrip nggunakake add-host lan 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')

Ing lingkungan lab sandi, script iki njupuk antarane 30 lan 50 detik kanggo eksekusi, gumantung ing mbukak ing server Manajemen.

Saiki ayo ndeleng carane ngatasi masalah sing padha nggunakake telpon API nambah-obyek-batch, dhukungan sing ditambahake ing versi API 1.6. Telpon iki ngidini sampeyan nggawe macem-macem obyek bebarengan ing siji panjalukan API. Kajaba iku, iki bisa dadi obyek saka macem-macem jinis (contone, host, subnet lan kisaran alamat). Mangkono, tugas kita bisa ditanggulangi ing kerangka siji panggilan API.

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

Lan eksekusi skrip iki ing lingkungan labku njupuk saka 3 nganti 7 detik gumantung saka beban ing server manajemen. Yaiku, rata-rata, ing 101 obyek, panggilan API saka jinis batch bisa 10 kaping luwih cepet. Ing jumlah obyek sing luwih akeh, bedane bakal luwih nyengsemake.

Saiki ayo ndeleng carane nggarap set-obyek-batch. Kanthi telpon API iki, kita bisa ngganti parameter apa wae kanthi akeh. Ayo dadi nyetel setengah pisanan saka alamat saka conto sadurungé (nganti .124 sarwa dumadi, lan kisaran banget) kanggo werna sienna, lan nemtokake setengah kapindho alamat menyang werna khaki.

Ngganti warna obyek sing digawe ing conto sadurunge

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

Sampeyan bisa mbusak sawetara obyek ing siji telpon API nggunakake mbusak-obyek-batch. Saiki ayo goleki conto kode sing mbusak kabeh host sing digawe sadurunge nambah-obyek-batch.

Mbusak obyek kanthi 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)

Kabeh fungsi sing katon ing rilis piranti lunak Check Point anyar langsung entuk panggilan API. Mangkono, ing R80.40 "fitur" kaya Revert kanggo revisi lan Smart Task muncul, lan telpon API cocog langsung disiapake kanggo wong-wong mau. Kajaba iku, kabeh fungsi nalika ngalih saka konsol Warisan menyang mode Unified Policy uga entuk dhukungan API. Contone, nganyari dawa-ngenteni ing versi piranti lunak R80.40 ana pamindhahan kabijakan Inspeksi HTTPS saka mode Warisan kanggo mode Unified Policy, lan fungsi iki langsung nampa telpon API. Iki minangka conto kode sing nambahake aturan menyang posisi paling dhuwur saka kabijakan Inspeksi HTTPS sing ora kalebu 3 kategori saka pengawasan (Kesehatan, Keuangan, Layanan Pemerintah), sing dilarang kanggo mriksa miturut undang-undang ing sawetara negara.

Tambah aturan menyang kabijakan Inspeksi HTTPS

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

data = {
  "layer" : "Default Layer",
  "position" : "top",
  "name" : "Legal Requirements",
  "action": "bypass",
  "site-category": ["Health", "Government / Military", "Financial Services"]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_https_rule = client.api_call("add-https-rule", data)
     publish = client.api_call("publish")

Nganggo Script Python ing Server Manajemen Titik Priksa

Kabeh padha README.md ngandhut informasi carane mbukak script Python langsung saka server kontrol. Iki bisa migunani yen sampeyan ora bisa nyambung menyang server API saka mesin liyane. Aku ngrekam video enem menit kang katon ing nginstal modul cpapi lan fitur mlaku script Python ing server Manajemen. Contone, skrip diluncurake sing ngotomatisasi konfigurasi gateway anyar kanggo tugas kayata audit jaringan Priksa Keamanan. Salah sawijining fitur sing kudu dak lakoni: ing Python 2.7, fungsi kasebut durung katon input, saengga fungsi kasebut digunakake kanggo ngolah informasi sing dilebokake pangguna mentah_input. Yen ora, kode kasebut padha karo sing diluncurake saka mesin liyane, mung luwih trep kanggo nggunakake fungsi kasebut login_as_root, supaya ora nemtokake jeneng pangguna, sandhi lan alamat IP server kontrol maneh.

Muter video

Skrip kanggo persiyapan cepet Keamanan CheckUp

from __future__ import print_function
import getpass
import sys, os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from cpapi import APIClient, APIClientArgs

def main():
    with APIClient() as client:
       # if client.check_fingerprint() is False:
       #     print("Could not get the server's fingerprint - Check connectivity with the server.")
       #     exit(1)
        login_res = client.login_as_root()

        if login_res.success is False:
            print("Login failed:n{}".format(login_res.error_message))
            exit(1)

        gw_name = raw_input("Enter the gateway name:")
        gw_ip = raw_input("Enter the gateway IP address:")
        if sys.stdin.isatty():
            sic = getpass.getpass("Enter one-time password for the gateway(SIC): ")
        else:
            print("Attention! Your password will be shown on the screen!")
            sic = raw_input("Enter one-time password for the gateway(SIC): ")
        version = raw_input("Enter the gateway version(like RXX.YY):")
        add_gw = client.api_call("add-simple-gateway", {'name' : gw_name, 'ipv4-address' : gw_ip, 'one-time-password' : sic, 'version': version.capitalize(), 'application-control' : 'true', 'url-filtering' : 'true', 'ips' : 'true', 'anti-bot' : 'true', 'anti-virus' : 'true', 'threat-emulation' : 'true'})
        if add_gw.success and add_gw.data['sic-state'] != "communicating":
            print("Secure connection with the gateway hasn't established!")
            exit(1)
        elif add_gw.success:
            print("The gateway was added successfully.")
            gw_uid = add_gw.data['uid']
            gw_name = add_gw.data['name']
        else:
            print("Failed to add the gateway - {}".format(add_gw.error_message))
            exit(1)

        change_policy = client.api_call("set-access-layer", {"name" : "Network", "applications-and-url-filtering": "true", "content-awareness": "true"})
        if change_policy.success:
            print("The policy has been changed successfully")
        else:
            print("Failed to change the policy- {}".format(change_policy.error_message))
        change_rule = client.api_call("set-access-rule", {"name" : "Cleanup rule", "layer" : "Network", "action": "Accept", "track": {"type": "Detailed Log", "accounting": "true"}})
        if change_rule.success:
            print("The cleanup rule has been changed successfully")
        else:
            print("Failed to change the cleanup rule- {}".format(change_rule.error_message))

        # publish the result
        publish_res = client.api_call("publish", {})
        if publish_res.success:
            print("The changes were published successfully.")
        else:
                print("Failed to publish the changes - {}".format(install_tp_policy.error_message))

        install_access_policy = client.api_call("install-policy", {"policy-package" : "Standard", "access" : 'true',  "threat-prevention" : 'false', "targets" : gw_uid})
        if install_access_policy.success:
            print("The access policy has been installed")
        else:
                print("Failed to install access policy - {}".format(install_tp_policy.error_message))

        install_tp_policy = client.api_call("install-policy", {"policy-package" : "Standard", "access" : 'false',  "threat-prevention" : 'true', "targets" : gw_uid})
        if install_tp_policy.success:
            print("The threat prevention policy has been installed")
        else:
            print("Failed to install threat prevention policy - {}".format(install_tp_policy.error_message))
        
        # add passwords and passphrases to dictionary
        with open('additional_pass.conf') as f:
            line_num = 0
            for line in f:
                line_num += 1
                add_password_dictionary = client.api_call("run-script", {"script-name" : "Add passwords and passphrases", "script" : "printf "{}" >> $FWDIR/conf/additional_pass.conf".format(line), "targets" : gw_name})
                if add_password_dictionary.success:
                    print("The password dictionary line {} was added successfully".format(line_num))
                else:
                    print("Failed to add the dictionary - {}".format(add_password_dictionary.error_message))

main()

Conto file karo kamus sandi additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

kesimpulan

Artikel iki mung nyakup kemungkinan dhasar kerja Python SDK lan modul cpapi(Sampeyan bisa uga wis guessed, iki bener sinonim), lan wis sinau kode ing modul iki, sampeyan bakal nemokake malah liyane kemungkinan ing karya karo. Sampeyan bisa uga duwe kepinginan kanggo nambah kelas, fungsi, metode lan variabel sampeyan dhewe. Sampeyan bisa tansah nuduhake pangembangan lan ndeleng skrip liyane kanggo Check Point ing bagean kasebut CodeHub ing masyarakat CheckMates, sing nggabungake pangembang lan pangguna produk.

Sugeng coding lan matur nuwun kanggo maca nganti pungkasan!

Source: www.habr.com

Add a comment