Symleiddio'r API Check Point gyda'r Python SDK

Symleiddio'r API Check Point gyda'r Python SDKDatgelir pŵer llawn rhyngweithio ag APIs pan gaiff ei ddefnyddio ynghyd â chod rhaglen, pan ddaw'n bosibl cynhyrchu ceisiadau API ac offer yn ddeinamig ar gyfer dadansoddi ymatebion API. Fodd bynnag, mae'n dal i fod yn ansylweddol Pecyn Datblygu Meddalwedd Python (y cyfeirir ati yma wedi hyn fel Python SDK) ar gyfer Check Point Management API, ond yn ofer. Mae'n symleiddio bywyd datblygwyr a selogion awtomeiddio yn sylweddol. Mae Python wedi ennill poblogrwydd aruthrol yn ddiweddar a phenderfynais lenwi'r bwlch ac adolygu'r prif nodweddion. Check Point API Python Development Kit. Mae'r erthygl hon yn ychwanegiad rhagorol at erthygl arall ar Habré Check Point R80.10 API. Rheolaeth trwy CLI, sgriptiau a mwy. Byddwn yn edrych ar sut i ysgrifennu sgriptiau gan ddefnyddio'r Python SDK ac yn edrych yn agosach ar ymarferoldeb Rheoli API newydd yn fersiwn 1.6 (gyda chefnogaeth gan ddechrau o R80.40). I ddeall yr erthygl, bydd angen gwybodaeth sylfaenol arnoch am weithio gydag APIs a Python.

Mae Check Point wrthi'n datblygu'r API ac ar hyn o bryd mae'r canlynol wedi'u rhyddhau:

Ar hyn o bryd mae'r Python SDK ond yn cefnogi rhyngweithio â'r API Rheoli a Gaia API. Byddwn yn edrych ar y dosbarthiadau, y dulliau a'r newidynnau pwysicaf yn y modiwl hwn.

Symleiddio'r API Check Point gyda'r Python SDK

Gosod y modiwl

Modiwl cpapi устанавливается быстро и просто из storfa swyddogol Check Point ar github gyda help pip. Mae cyfarwyddiadau gosod manwl ar gael yn DARLLENWCH.md. Mae'r modiwl hwn wedi'i addasu i weithio gyda fersiynau Python 2.7 a 3.7. Yn yr erthygl hon, rhoddir enghreifftiau gan ddefnyddio Python 3.7. Fodd bynnag, gellir rhedeg y Python SDK yn uniongyrchol o'r Gweinydd Rheoli Pwynt Gwirio (Rheoli Clyfar), ond dim ond Python 2.7 y maent yn ei gefnogi, felly bydd yr adran olaf yn darparu cod ar gyfer fersiwn 2.7. Yn syth ar ôl gosod y modiwl, rwy'n argymell edrych ar yr enghreifftiau yn y cyfeiriaduron enghreifftiau_python2 и enghreifftiau_python3.

Dechrau Arni

Er mwyn i ni allu gweithio gyda chydrannau'r modiwl cpapi, mae angen inni fewnforio o'r modiwl cpapi как минимум два необходимых класса:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Dosbarth APIClientArgs yn gyfrifol am baramedrau cysylltiad â'r gweinydd API, a'r dosbarth APIClient yn gyfrifol am ryngweithio â'r API.

Pennu paramedrau cysylltiad

Чтобы определить различные параметры подключения к API, нужно создать экземпляр класса APIClientArgs. Mewn egwyddor, mae ei baramedrau wedi'u diffinio ymlaen llaw ac wrth redeg y sgript ar y gweinydd rheoli, nid oes angen eu nodi.

client_args = APIClientArgs()

Ond wrth redeg ar westeiwr trydydd parti, mae angen i chi nodi o leiaf gyfeiriad IP neu enw gwesteiwr y gweinydd API (a elwir hefyd yn weinydd rheoli). Yn yr enghraifft isod, rydym yn diffinio paramedr cysylltiad y gweinydd ac yn rhoi cyfeiriad IP y gweinydd rheoli iddo fel llinyn.

client_args = APIClientArgs(server='192.168.47.241')

Edrychwn ar yr holl baramedrau a'u gwerthoedd rhagosodedig y gellir eu defnyddio wrth gysylltu â'r gweinydd API:

Dadleuon y dull __init__ o'r dosbarth 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

Credaf fod y dadleuon y gellir eu defnyddio mewn achosion o'r dosbarth APIClientArgs yn reddfol i weinyddwyr Check Point ac nad oes angen sylwadau ychwanegol arnynt.

Подключаемся через APIClient и менеджер контекста

Dosbarth APIClient Y ffordd fwyaf cyfleus i'w ddefnyddio yw trwy'r rheolwr cyd-destun. Y cyfan sydd angen ei drosglwyddo i enghraifft o'r dosbarth APIClient yw'r paramedrau cysylltiad a ddiffiniwyd yn y cam blaenorol.

with APIClient(client_args) as client:

Ni fydd y rheolwr cyd-destun yn gwneud galwad mewngofnodi yn awtomatig i'r gweinydd API, ond bydd yn gwneud galwad allgofnodi wrth ei adael. Os nad oes angen allgofnodi am ryw reswm ar ôl gorffen gweithio gyda galwadau API, mae angen i chi ddechrau gweithio heb ddefnyddio'r rheolwr cyd-destun:

client = APIClient(clieng_args)

Gwirio'r cysylltiad

Y ffordd hawsaf i wirio a yw'r cysylltiad yn cwrdd â'r paramedrau penodedig yw defnyddio'r dull siec_olion bysedd. Если проверка хеш-суммы sha1 для fingerprint сертификата API сервера не прошла(метод вернул Anghywir), yna mae hyn fel arfer yn cael ei achosi gan broblemau cysylltiad a gallwn atal gweithrediad y rhaglen (neu roi cyfle i'r defnyddiwr gywiro'r data cysylltiad):

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

Sylwch fod y dosbarth yn y dyfodol APIClient yn gwirio pob galwad API (dulliau ap_galwad и ap_query, byddwn yn siarad amdanynt ychydig ymhellach) tystysgrif olion bysedd sha1 ar y gweinydd API. Ond os, wrth wirio olion bysedd sha1 y dystysgrif gweinydd API, canfyddir gwall (nid yw'r dystysgrif yn hysbys neu wedi'i newid), y dull siec_olion bysedd yn rhoi'r cyfle i ychwanegu/newid gwybodaeth amdano ar y peiriant lleol yn awtomatig. Gellir analluogi'r gwiriad hwn yn gyfan gwbl (ond dim ond os yw sgriptiau'n cael eu rhedeg ar y gweinydd API ei hun, wrth gysylltu â 127.0.0.1), gan ddefnyddio dadl APIClientArgs y gellir argymell hyn - anniogel_auto_derbyn (gweler mwy am APIClientArgs yn gynharach yn “Diffinio paramedrau cysylltiad”).

client_args = APIClientArgs(unsafe_auto_accept=True)

Mewngofnodi i'r gweinydd API

У APIClient есть целых 3 метода логина на API сервер, и каждый из них запонимает значение sid(session-id), a ddefnyddir yn awtomatig ym mhob galwad API dilynol yn y pennyn (yr enw ym mhennyn y paramedr hwn yw X-chkp-sid), felly nid oes angen prosesu'r paramedr hwn ymhellach.

dull mewngofnodi

Opsiwn gan ddefnyddio mewngofnodi a chyfrinair (yn yr enghraifft, mae'r enw defnyddiwr gweinyddwr a chyfrinair 1q2w3e yn cael eu pasio fel dadleuon lleoliad):

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

Mae paramedrau dewisol ychwanegol hefyd ar gael yn y dull mewngofnodi; dyma eu henwau a'u gwerthoedd rhagosodedig:

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

Login_with_api_key dull

Opsiwn gan ddefnyddio allwedd api (a gefnogir gan ddechrau o fersiwn rheoli R80.40 / Management API v1.6, " 3TsbPJ8ZKjaJGvFyoFqHFA==" dyma'r gwerth allweddol API ar gyfer un o'r defnyddwyr ar y gweinydd rheoli gyda'r dull awdurdodi allwedd API):

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

Mewn dull mewngofnodi_with_api_key mae'r un paramedrau dewisol ar gael ag yn y dull Mewngofnodi.

login_as_root dull

Opsiwn i fewngofnodi i beiriant lleol gyda gweinydd API:

     login = client.login_as_root()

Для данного метода доступны всего два опциональных параметра:

domain=None, payload=None

Ac yn olaf mae'r API yn galw eu hunain

Mae gennym ddau opsiwn i wneud galwadau API trwy ddulliau ap_galwad и ap_query. Gadewch i ni ddarganfod beth yw'r gwahaniaeth rhyngddynt.

ap_galwad

Mae'r dull hwn yn berthnasol ar gyfer unrhyw alwadau. Mae angen i ni basio'r rhan olaf ar gyfer yr alwad ap a'r llwyth tâl yn y corff cais os oes angen. Os yw'r llwyth tâl yn wag, yna ni ellir ei drosglwyddo o gwbl:

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

Allbwn ar gyfer y cais hwn o dan y toriad:

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

Allbwn ar gyfer y cais hwn o dan y toriad:

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

ap_query

Gadewch i mi wneud amheuaeth ar unwaith bod y dull hwn yn berthnasol dim ond ar gyfer galwadau y mae eu hallbwn yn cynnwys gwrthbwyso. Mae casgliad o'r fath yn digwydd pan fydd yn cynnwys neu y gall gynnwys llawer iawn o wybodaeth. Er enghraifft, gallai hwn fod yn gais am restr o'r holl wrthrychau gwesteiwr a grëwyd ar y gweinydd rheoli. Ar gyfer ceisiadau o'r fath, mae'r API yn dychwelyd rhestr o 50 gwrthrych yn ddiofyn (gallwch gynyddu'r terfyn i 500 o wrthrychau yn yr ymateb). Ac er mwyn peidio â thynnu'r wybodaeth sawl gwaith, gan newid y paramedr gwrthbwyso yn y cais API, mae yna ddull api_query sy'n gwneud y gwaith hwn yn awtomatig. Enghreifftiau o alwadau lle mae angen y dull hwn: show-sessions, show-hosts, show-networks, show-wildcards, show-groups, show-address-ranges, show-simple-gateways, show-simple-clusters, show-access-roles, show-trusted-clients, show-packages. Mewn gwirionedd, rydym yn gweld geiriau lluosog yn enw'r galwadau API hyn, felly bydd y galwadau hyn yn haws eu trin ap_query

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

Allbwn ar gyfer y cais hwn o dan y toriad:

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

Prosesu canlyniadau galwadau API

Ar ôl hyn gallwch ddefnyddio newidynnau a dulliau'r dosbarth Ymateb API(y tu mewn i'r rheolwr cyd-destun a'r tu allan). Yn y dosbarth Ymateb API Mae 4 dull a 5 newidyn wedi'u diffinio ymlaen llaw; byddwn yn canolbwyntio ar y rhai pwysicaf yn fwy manwl.

Symleiddio'r API Check Point gyda'r Python SDK

llwyddiant

I ddechrau, byddai'n syniad da sicrhau bod yr alwad API yn llwyddiannus ac yn dychwelyd canlyniad. Mae dull ar gyfer hyn llwyddiant:

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

Yn dychwelyd Gwir os oedd yr alwad API yn llwyddiannus (cod ymateb - 200) ac Anghywir os nad yn llwyddiannus (unrhyw god ymateb arall). Mae'n gyfleus i'w ddefnyddio yn syth ar ôl galwad API i arddangos gwybodaeth wahanol yn dibynnu ar y cod ymateb.

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

cod statws

Yn dychwelyd y cod ymateb ar ôl i alwad API gael ei wneud.

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

Codau ymateb posibl: 200,400,401,403,404,409,500,501.

gosod_statws_llwyddiant

Yn yr achos hwn, efallai y bydd angen newid gwerth y statws llwyddiant. Yn dechnegol, gallwch chi roi unrhyw beth yno, hyd yn oed llinyn rheolaidd. Ond enghraifft wirioneddol fyddai ailosod y paramedr hwn i Anwir o dan amodau penodol cysylltiedig. Isod, rhowch sylw i'r enghraifft pan fo tasgau'n rhedeg ar y gweinydd rheoli, ond byddwn yn ystyried y cais hwn yn aflwyddiannus (byddwn yn gosod y newidyn llwyddiant i Anghywir, er gwaethaf y ffaith bod yr alwad API yn llwyddiannus ac yn dychwelyd cod 200).

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

ymateb ()

Mae'r dull ymateb yn eich galluogi i weld y geiriadur gyda'r cod ymateb (status_code) a'r corff ymateb (corff).

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

Yn caniatáu ichi weld corff yr ymateb (corff) yn unig heb wybodaeth ddiangen.

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

gwall_neges

Mae'r wybodaeth hon ar gael dim ond pan ddigwyddodd gwall wrth brosesu'r cais API (cod ymateb dim 200). Allbwn enghreifftiol

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

Enghreifftiau defnyddiol

Mae'r canlynol yn enghreifftiau sy'n defnyddio'r galwadau API a ychwanegwyd yn API Rheolaeth 1.6.

Yn gyntaf, gadewch i ni edrych ar sut mae galwadau'n gweithio ychwanegu-host и ychwanegu-cyfeiriad-ystod. Gadewch i ni ddweud bod angen i ni greu holl gyfeiriadau IP yr is-rwydwaith 192.168.0.0/24, a'r wythawd olaf yw 5, fel gwrthrychau o'r math gwesteiwr, ac ysgrifennu pob cyfeiriad IP arall fel gwrthrychau o'r math ystod cyfeiriad. Yn yr achos hwn, peidiwch â chynnwys cyfeiriad yr is-rwydwaith a'r cyfeiriad darlledu.

Итак, ниже представлен скрипт в котором решается данная задача и создаются 50 объектов типа хост и 51 объект типа диапазон адресов. На решение задачи требуется 101 API вызов(не считая финального вызова publish). Также с помощью модуля timeit мы подсчитываем время на выполнение скрипта до момента публикации изменений.

Скрипт с использование add-host и 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')

Yn fy amgylchedd labordy, mae'r sgript hon yn cymryd rhwng 30 a 50 eiliad i'w gweithredu, yn dibynnu ar y llwyth ar y gweinydd rheoli.

Nawr, gadewch i ni weld sut i ddatrys yr un broblem gan ddefnyddio galwad API ychwanegu-gwrthrychau-swp, ychwanegwyd cefnogaeth ar ei gyfer yn fersiwn API 1.6. Mae'r alwad hon yn caniatáu ichi greu llawer o wrthrychau ar unwaith mewn un cais API. Ar ben hynny, gall y rhain fod yn wrthrychau o wahanol fathau (er enghraifft, gwesteiwyr, is-rwydweithiau ac ystodau cyfeiriadau). Felly, gellir datrys ein tasg o fewn fframwaith un alwad API.

Sgript gan ddefnyddio adio-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')

А на выполнение данного скрипта в моей лабораторной среде уходит от 3 до 7 секунд в зависимости от нагрузки на сервер управления. То есть, в среднем, на 101 объекте API вызов типа batch, отрабатывает в 10 раз быстрее. На большем количестве объектов разница будет ещё более впечатляющей.

Nawr gadewch i ni weld sut i weithio gyda set-gwrthrychau-swp. Gan ddefnyddio'r alwad API hwn, gallwn newid unrhyw baramedr mewn swmp. Gadewch i ni osod hanner cyntaf y cyfeiriadau o'r enghraifft flaenorol (hyd at .124 gwesteiwr, ac yn amrywio hefyd) i'r sienna lliw, a aseinio'r lliw khaki i ail hanner y cyfeiriadau.

Newid lliw y gwrthrychau a grëwyd yn yr enghraifft flaenorol

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

Gallwch ddileu gwrthrychau lluosog mewn un galwad API gan ddefnyddio dileu-gwrthrychau-swp. Nawr, gadewch i ni edrych ar enghraifft cod sy'n dileu'r holl westeion a grëwyd yn flaenorol trwy ychwanegu-gwrthrychau-swp.

Dileu gwrthrychau gan ddefnyddio dileu-gwrthrychau-swp

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)

Mae'r holl swyddogaethau sy'n ymddangos mewn datganiadau newydd o feddalwedd Check Point yn cael galwadau API ar unwaith. Felly, yn R80.40 ymddangosodd “nodweddion” fel Dychwelyd i adolygu a Smart Task, a pharatowyd galwadau API cyfatebol ar eu cyfer ar unwaith. Ar ben hynny, mae pob swyddogaeth wrth symud o gonsolau Legacy i'r modd Polisi Unedig hefyd yn cael cefnogaeth API. Er enghraifft, y diweddariad hir-ddisgwyliedig yn fersiwn meddalwedd R80.40 oedd symud y polisi Arolygu HTTPS o'r modd Etifeddiaeth i'r modd Polisi Unedig, a derbyniodd y swyddogaeth hon alwadau API ar unwaith. Dyma enghraifft o god sy'n ychwanegu rheol at safle uchaf polisi Arolygu HTTPS sy'n eithrio 3 chategori o arolygiad (Iechyd, Cyllid, Gwasanaethau Llywodraeth), sy'n cael eu gwahardd rhag archwilio yn unol â'r gyfraith mewn nifer o wledydd.

Ychwanegu rheol at bolisi Arolygu 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")

Запуск Python скриптов на сервере управления Check Point

Mae popeth yr un peth DARLLENWCH.md yn cynnwys gwybodaeth ar sut i redeg sgriptiau Python yn uniongyrchol o'r gweinydd rheoli. Gall hyn fod yn gyfleus pan na allwch gysylltu â'r gweinydd API o beiriant arall. Fe wnes i recordio fideo chwe munud lle rydw i'n edrych ar osod y modiwl cpapi a nodweddion rhedeg sgriptiau Python ar y gweinydd rheoli. Er enghraifft, mae sgript yn cael ei rhedeg sy'n awtomeiddio cyfluniad porth newydd ar gyfer tasg fel archwilio rhwydwaith Security CheckUp. Ymhlith y nodweddion y bu'n rhaid i mi ddelio â nhw: nid yw'r swyddogaeth wedi ymddangos eto yn Python 2.7 mewnbwn, felly i brosesu'r wybodaeth y mae'r defnyddiwr yn mynd i mewn, defnyddir swyddogaeth mewnbwn_amrwd. Fel arall, mae'r cod yr un fath ag ar gyfer lansio o beiriannau eraill, dim ond mae'n fwy cyfleus i ddefnyddio'r swyddogaeth mewngofnodi_as_root, er mwyn peidio â nodi eich enw defnyddiwr, cyfrinair a chyfeiriad IP eich hun y gweinydd rheoli eto.

Sgript ar gyfer sefydlu Gwiriad Diogelwch yn gyflym

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

Ffeil enghreifftiol gyda geiriadur cyfrinair additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

Casgliad

Mae'r erthygl hon yn archwilio posibiliadau sylfaenol gwaith yn unig SDK Python и модуля cpapi(fel y gallech fod wedi dyfalu, cyfystyron yw'r rhain mewn gwirionedd), a thrwy astudio'r cod yn y modiwl hwn byddwch yn darganfod hyd yn oed mwy o bosibiliadau wrth weithio ag ef. Mae'n bosibl y byddwch am ei ategu â'ch dosbarthiadau, swyddogaethau, dulliau a newidynnau eich hun. Gallwch chi bob amser rannu'ch gwaith a gweld sgriptiau eraill ar gyfer Check Point yn yr adran CodeHub yn y gymuned CheckMates, sy'n dod â datblygwyr cynnyrch a defnyddwyr ynghyd.

Codio hapus a diolch am ddarllen hyd y diwedd!

Ffynhonnell: hab.com

Ychwanegu sylw