Einföldun Check Point API með Python SDK

Einföldun Check Point API með Python SDKFullur kraftur samskipta við API kemur í ljós þegar það er notað ásamt forritskóða, þegar það verður hægt að búa til API beiðnir og verkfæri til að greina API svör. Hins vegar er það enn ómerkjanlegt Python hugbúnaðarþróunarsett (hér eftir nefnt Python SDK) fyrir Check Point Management API, en til einskis. Það einfaldar verulega líf þróunaraðila og sjálfvirkniáhugamanna. Python hefur náð gífurlegum vinsældum undanfarið og ég ákvað að fylla í skarðið og rifja upp helstu eiginleikana. Check Point API Python þróunarsett. Þessi grein þjónar sem frábær viðbót við aðra grein um Habré Check Point R80.10 API. Stjórnun í gegnum CLI, forskriftir og fleira. Við munum skoða hvernig á að skrifa forskriftir með Python SDK og skoða nánar nýju stjórnunar API virknina í útgáfu 1.6 (studd frá R80.40). Til að skilja greinina þarftu grunnþekkingu á að vinna með API og Python.

Check Point er að þróa API virkan og í augnablikinu hefur eftirfarandi verið gefið út:

Python SDK styður sem stendur aðeins samskipti við stjórnunarforritaskil og Gaia API. Við munum skoða mikilvægustu flokka, aðferðir og breytur í þessari einingu.

Einföldun Check Point API með Python SDK

Að setja upp eininguna

Module cpapi setur fljótt og auðveldlega frá opinber Check Point geymsla á github með hjálpinni Pip. Ítarlegar uppsetningarleiðbeiningar eru fáanlegar í README.md. Þessi eining er aðlöguð til að vinna með Python útgáfum 2.7 og 3.7. Í þessari grein verða dæmi um notkun Python 3.7. Hins vegar er hægt að keyra Python SDK beint frá Check Point Management Server (Smart Management), en þeir styðja aðeins Python 2.7, svo síðasti hluti mun veita kóða fyrir útgáfu 2.7. Strax eftir að einingin hefur verið sett upp mæli ég með að skoða dæmin í möppunum examples_python2 и examples_python3.

getting Started

Til þess að við getum unnið með íhluti cpapi einingarinnar þurfum við að flytja inn úr einingunni cpapi að minnsta kosti tveir nauðsynlegir flokkar:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Class APIClientArgs er ábyrgur fyrir tengibreytum við API netþjóninn og bekkinn APIClient ber ábyrgð á samskiptum við API.

Ákvörðun tengibreytur

Til að skilgreina ýmsar breytur fyrir tengingu við API þarftu að búa til tilvik af bekknum APIClientArgs. Í grundvallaratriðum eru færibreytur þess fyrirfram skilgreindar og þegar handritið er keyrt á stjórnþjóninum þarf ekki að tilgreina þær.

client_args = APIClientArgs()

En þegar þú keyrir á þriðja aðila gestgjafa þarftu að tilgreina að minnsta kosti IP tölu eða hýsilheiti API netþjónsins (einnig þekktur sem stjórnunarþjónn). Í dæminu hér að neðan skilgreinum við færibreytu miðlaratengingar og úthlutum henni IP tölu stjórnunarþjónsins sem streng.

client_args = APIClientArgs(server='192.168.47.241')

Við skulum skoða allar breytur og sjálfgefin gildi þeirra sem hægt er að nota þegar tengst er við API netþjóninn:

Rök fyrir __init__ aðferð APIClientArgs flokksins

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

Ég tel að rökin sem hægt er að nota í tilfellum af APIClientArgs bekknum séu leiðandi fyrir Check Point stjórnendur og krefjist ekki frekari athugasemda.

Tengist í gegnum APIClient og samhengisstjóra

Class APIClient Þægilegasta leiðin til að nota það er í gegnum samhengisstjórann. Allt sem þarf að senda til tilviks af APIClient bekknum eru tengibreytur sem voru skilgreindar í fyrra skrefi.

with APIClient(client_args) as client:

Samhengisstjórinn hringir ekki sjálfkrafa innskráningarsímtal til API-þjónsins, heldur hringir hann út þegar hann hættir. Ef af einhverjum ástæðum er ekki krafist útskráningar eftir að hafa unnið með API símtöl, þarftu að byrja að vinna án þess að nota samhengisstjórann:

client = APIClient(clieng_args)

Tengipróf

Auðveldasta leiðin til að athuga hvort tengingin uppfylli tilgreindar breytur er að nota aðferðina athuga_fingraför. Ef staðfesting á sha1 kjötkássa summu fyrir fingrafar API vottorðs netþjóns mistekst (aðferðin skilaði False), þá er þetta venjulega af völdum tengingarvandamála og við getum stöðvað keyrslu forritsins (eða gefið notandanum tækifæri til að leiðrétta tengingargögnin):

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

Athugið að í framtíðinni er bekkurinn APIClient mun athuga hvert API símtal (aðferðir api_call и api_query, við munum tala um þau aðeins lengra) sha1 fingrafaravottorð á API netþjóninum. En ef villa finnst (vottorðið er óþekkt eða hefur verið breytt), aðferð athuga_fingraför mun gefa tækifæri til að bæta við/breyta upplýsingum um það á staðbundinni vél sjálfkrafa. Hægt er að slökkva á þessari athugun alveg (en það er aðeins hægt að mæla með þessu ef forskriftir eru keyrðar á API þjóninum sjálfum, þegar tengst er við 127.0.0.1), með því að nota APIClientArgs rökin - unsafe_auto_accept (sjá meira um APIClientArgs fyrr í „Skilgreina tengingarfæribreytur“).

client_args = APIClientArgs(unsafe_auto_accept=True)

Skráðu þig inn á API netþjón

У APIClient það eru allt að 3 aðferðir til að skrá þig inn á API netþjóninn og hver þeirra skilur merkinguna SID(session-id), sem er notað sjálfkrafa í hverju síðari API símtali í hausnum (nafnið í haus þessarar færibreytu er X-chkp-síðu), svo það er engin þörf á að vinna þessa færibreytu frekar.

innskráningaraðferð

Valkostur með því að nota innskráningu og lykilorð (í dæminu eru notandanafnið admin og lykilorðið 1q2w3e send sem staðsetningarrök):

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

Viðbótar valfrjálsar færibreytur eru einnig fáanlegar í innskráningaraðferðinni; hér eru nöfn þeirra og sjálfgefin gildi:

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

Login_with_api_key aðferð

Valkostur með því að nota API-lykil (studdur frá og með stjórnunarútgáfu R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" þetta er API lykilgildi fyrir einn af notendum á stjórnunarþjóninum með API lykilheimildaraðferðinni):

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

Í aðferð login_with_api_key sömu valfrjálsu færibreytur eru fáanlegar og í aðferðinni skrá inn.

login_as_root aðferð

Valkostur til að skrá þig inn á staðbundna vél með API netþjóni:

     login = client.login_as_root()

Það eru aðeins tvær valfrjálsar færibreytur í boði fyrir þessa aðferð:

domain=None, payload=None

Og að lokum kallar API sig

Við höfum tvo möguleika til að hringja í API með aðferðum api_call и api_query. Við skulum reikna út hver munurinn er á þeim.

api_call

Þessi aðferð á við fyrir öll símtöl. Við þurfum að fara framhjá síðasta hlutanum fyrir API-símtalið og hleðsluna í beiðninni ef þörf krefur. Ef farmur er tómur, þá er alls ekki hægt að senda það:

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

Úttak fyrir þessa beiðni fyrir neðan niðurskurð:

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

Úttak fyrir þessa beiðni fyrir neðan niðurskurð:

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

Leyfðu mér strax að taka fyrirvara um að þessi aðferð á aðeins við um símtöl þar sem framleiðsla felur í sér offset. Slík ályktun á sér stað þegar hún inniheldur eða getur innihaldið mikið magn upplýsinga. Til dæmis gæti þetta verið beiðni um lista yfir alla búna hýsilhluti á stjórnunarþjóninum. Fyrir slíkar beiðnir skilar API sjálfgefið lista yfir 50 hluti (þú getur aukið mörkin í 500 hluti í svarinu). Og til að draga ekki upplýsingarnar nokkrum sinnum, með því að breyta offset færibreytunni í API beiðninni, er til api_query aðferð sem gerir þetta sjálfkrafa. Dæmi um símtöl þar sem þessi aðferð er nauðsynleg: sýningarlotur, sýningargestgjafar, sýningarnet, sýningar-wildcards, sýningarhópar, sýningarheimilisfang, sýna-einfaldar-gáttir, sýna-einfaldar-þyrpingar, sýna-aðgangshlutverk, sýna-traust-viðskiptavini, sýningarpakkar. Reyndar sjáum við fleirtöluorð í nafni þessara API símtala, þannig að þessi símtöl verða auðveldari í gegnum api_query

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

Úttak fyrir þessa beiðni fyrir neðan niðurskurð:

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

Vinnur úr niðurstöðum API kalla

Eftir þetta er hægt að nota breytur og aðferðir bekkjarins APIResponse(bæði innan samhengisstjórans og utan). Á bekknum APIResponse 4 aðferðir og 5 breytur eru fyrirfram skilgreindar; við munum fjalla nánar um þær mikilvægustu.

Einföldun Check Point API með Python SDK

árangur

Til að byrja með væri gott að ganga úr skugga um að API símtalið heppnaðist og skilaði niðurstöðu. Það er til aðferð við þetta árangur:

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

Skilar True ef API símtalið heppnaðist (svarkóði - 200) og False ef ekki tókst (hver annar svarkóði). Það er þægilegt að nota strax eftir API símtal til að birta mismunandi upplýsingar eftir svarkóða.

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

stöðukóða

Skilar svarkóðanum eftir að API símtal hefur verið hringt.

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

Mögulegir svarkóðar: 200,400,401,403,404,409,500,501.

set_success_status

Í þessu tilviki gæti verið nauðsynlegt að breyta gildi árangursstöðunnar. Tæknilega séð geturðu sett hvað sem er þar, jafnvel venjulegan streng. En raunverulegt dæmi væri að endurstilla þessa færibreytu á False við ákveðnar meðfylgjandi aðstæður. Hér að neðan, gefðu gaum að dæminu þegar verkefni eru í gangi á stjórnunarþjóninum, en við munum telja þessa beiðni misheppnaða (við munum stilla árangursbreytuna á False, þrátt fyrir að API símtalið hafi gengið vel og skilað kóða 200).

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

svar()

Svaraðferðin gerir þér kleift að skoða orðabókina með svarkóðanum (status_code) og svarhlutanum (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']}}

gögn

Gerir þér kleift að sjá aðeins meginmál svarsins (body) án óþarfa upplýsinga.

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

villu skilaboð

Þessar upplýsingar eru aðeins tiltækar þegar villa kom upp við vinnslu API beiðninnar (svarkóði ekki 200). Dæmi framleiðsla

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

Gagnleg dæmi

Eftirfarandi eru dæmi sem nota API símtölin sem bætt var við í Management API 1.6.

Fyrst skulum við skoða hvernig símtöl virka add-host и add-address-range. Segjum að við þurfum að búa til allar IP tölur undirnetsins 192.168.0.0/24, síðasti áttundur þeirra er 5, sem hluti af hýsilgerðinni, og skrifa allar aðrar IP tölur sem hluti af vistfangasviðsgerðinni. Í þessu tilviki skaltu útiloka undirnetsfangið og útsendingarvistfangið.

Svo, hér að neðan er handrit sem leysir þetta vandamál og býr til 50 hluti af hýsilgerðinni og 51 hluti af veffangasviðsgerðinni. Til að leysa vandamálið þarf 101 API símtal (án lokaútgáfukallsins). Einnig, með því að nota timeit eininguna, reiknum við tímann sem það tekur að keyra handritið þar til breytingarnar eru birtar.

Forskrift með add-host og 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')

Í rannsóknarstofuumhverfinu mínu tekur þetta handrit á milli 30 og 50 sekúndur að keyra, allt eftir álagi á stjórnunarþjóninum.

Nú skulum við sjá hvernig á að leysa sama vandamál með því að nota API símtal bæta við-hlutum-lotu, stuðningi sem var bætt við í API útgáfu 1.6. Þetta símtal gerir þér kleift að búa til marga hluti í einu í einni API beiðni. Þar að auki geta þetta verið hlutir af mismunandi gerðum (til dæmis vélar, undirnet og vistfangasvið). Þannig er hægt að leysa verkefni okkar innan ramma eins API símtals.

Forskrift með 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')

Og að keyra þetta handrit í rannsóknarstofuumhverfinu mínu tekur frá 3 til 7 sekúndur, allt eftir álagi á stjórnunarþjóninum. Það er, að meðaltali, á 101 API hlutum, keyrir hópsímtal 10 sinnum hraðar. Á stærri fjölda hluta verður munurinn enn áhrifameiri.

Nú skulum við sjá hvernig á að vinna með setja-hlutir-lotu. Með því að nota þetta API símtal getum við breytt hvaða breytu sem er. Við skulum stilla fyrri helming heimilisfönganna frá fyrra dæmi (allt að .124 vélar og svið líka) á litinn sienna og úthluta khaki litnum á seinni helming heimilisfanganna.

Að breyta lit hlutanna sem voru búnir til í fyrra dæminu

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

Þú getur eytt mörgum hlutum í einu API símtali með því að nota eyða-hlutum-lotu. Nú skulum við skoða kóðadæmi sem eyðir öllum gestgjöfum sem áður voru búnir til í gegnum bæta við-hlutum-lotu.

Að eyða hlutum með því að nota 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)

Allar aðgerðir sem birtast í nýjum útgáfum af Check Point hugbúnaði fá strax API símtöl. Þannig birtust í R80.40 slíkir „eiginleikar“ eins og Revert to endurskoðun og Smart Task og samsvarandi API símtöl voru strax undirbúin fyrir þá. Þar að auki fær öll virkni þegar farið er úr eldri leikjatölvum yfir í samræmda stefnustillingu einnig API stuðning. Til dæmis var langþráða uppfærslan í hugbúnaðarútgáfu R80.40 flutningur HTTPS skoðunarstefnunnar úr Legacy-stillingu yfir í Unified Policy-ham, og þessi virkni fékk strax API símtöl. Hér er dæmi um kóða sem bætir reglu við efstu stöðu HTTPS skoðunarstefnunnar sem útilokar 3 flokka frá skoðun (Heilsa, Fjármál, Ríkisþjónusta), sem er bannað að skoða í samræmi við lög í fjölda landa.

Bættu reglu við HTTPS skoðunarstefnuna

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

Keyrir Python forskriftir á Check Point stjórnunarþjóninum

Allt er eins README.md inniheldur upplýsingar um hvernig á að keyra Python forskriftir beint frá stjórnunarþjóninum. Þetta getur verið þægilegt þegar þú getur ekki tengst API þjóninum frá annarri vél. Ég tók upp sex mínútna myndband þar sem ég skoða uppsetningu á einingunni cpapi og eiginleikar þess að keyra Python forskriftir á stjórnunarþjóninum. Sem dæmi er forskrift keyrð sem gerir sjálfvirkan uppsetningu nýrrar gáttar fyrir verkefni eins og netendurskoðun Öryggisskoðun. Meðal eiginleikanna sem ég þurfti að takast á við: aðgerðin hefur ekki enn birst í Python 2.7 inntak, þannig að til að vinna úr þeim upplýsingum sem notandinn slær inn er aðgerð notuð hrátt_inntak. Annars er kóðinn sá sami og fyrir ræsingu frá öðrum vélum, aðeins það er þægilegra að nota aðgerðina login_as_root, til að tilgreina eigið notandanafn, lykilorð og IP-tölu stjórnunarþjónsins aftur.

Forskrift fyrir fljótlega uppsetningu á öryggisskoðun

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

Dæmi um skrá með lykilorðaorðabók additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

Ályktun

Þessi grein fjallar aðeins um helstu möguleika vinnu Python SDK og mát cpapi(eins og þú gætir hafa giskað á, þá eru þetta í raun samheiti) og með því að kynna þér kóðann í þessari einingu muntu uppgötva enn fleiri möguleika í að vinna með hann. Það er mögulegt að þú viljir bæta við það með þínum eigin flokkum, aðgerðum, aðferðum og breytum. Þú getur alltaf deilt verkum þínum og skoðað önnur handrit fyrir Check Point í hlutanum CodeHub í samfélaginu CheckMates, sem sameinar bæði vöruhönnuði og notendur.

Til hamingju með kóðun og takk fyrir að lesa til enda!

Heimild: www.habr.com

Bæta við athugasemd