Поједностављивање Цхецк Поинт АПИ-ја са Питхон СДК-ом

Поједностављивање Цхецк Поинт АПИ-ја са Питхон СДК-омПуна моћ интеракције са АПИ-јима се открива када се користи заједно са програмским кодом, када постаје могуће динамички генерисати АПИ захтеве и алате за анализу АПИ одговора. Међутим, и даље остаје неприметно Питхон комплет за развој софтвера (у даљем тексту Питхон СДК) за Цхецк Поинт Манагемент АПИ, али узалуд. То значајно поједностављује живот програмера и ентузијаста аутоматизације. Питхон је у последње време стекао огромну популарност и одлучио сам да попуним празнину и прегледам главне карактеристике. Цхецк Поинт АПИ Питхон развојни комплет. Овај чланак служи као одличан додатак другом чланку на Хабреу Цхецк Поинт Р80.10 АПИ. Управљање преко ЦЛИ-а, скрипти и још много тога. Погледаћемо како писати скрипте користећи Питхон СДК и детаљније погледати нову функционалност АПИ-ја за управљање у верзији 1.6 (подржано од Р80.40). Да бисте разумели чланак, биће вам потребно основно знање о раду са АПИ-јем и Питхон-ом.

Цхецк Поинт активно развија АПИ и тренутно је објављено следеће:

Питхон СДК тренутно подржава само интеракцију са АПИ-јем за управљање и Гаиа АПИ. У овом модулу ћемо погледати најважније класе, методе и варијабле.

Поједностављивање Цхецк Поинт АПИ-ја са Питхон СДК-ом

Инсталација модула

Модул цпапи се брзо и лако инсталира са званично Цхецк Поинт складиште на гитхуб-у уз помоћ бод. Детаљна упутства за инсталацију су доступна у РЕАДМЕ.мд. Овај модул је прилагођен за рад са Питхон верзијама 2.7 и 3.7. У овом чланку ће бити дати примери користећи Питхон 3.7. Међутим, Питхон СДК се може покренути директно са Цхецк Поинт Манагемент Сервер-а (Смарт Манагемент), али подржава само Питхон 2.7, тако да ће последњи одељак пружити код за верзију 2.7. Одмах након инсталирања модула, препоручујем да погледате примере у директоријумима екамплес_питхон2 и екамплес_питхон3.

Први кораци

Да бисмо могли да радимо са компонентама цпапи модула, потребно је да увеземо из модула цпапи најмање две обавезне класе:

АПИЦлиент и АПИЦлиентАргс

from cpapi import APIClient, APIClientArgs

Класа АПИЦлиентАргс је одговоран за параметре везе са АПИ сервером и класом АПИЦлиент је одговоран за интеракцију са АПИ-јем.

Одређивање параметара везе

Да бисте дефинисали различите параметре за повезивање на АПИ, потребно је да креирате инстанцу класе АПИЦлиентАргс. У принципу, његови параметри су унапред дефинисани и када се скрипта покреће на контролном серверу, не треба их специфицирати.

client_args = APIClientArgs()

Али када радите на хосту треће стране, потребно је да наведете барем ИП адресу или име хоста АПИ сервера (познатог и као сервер за управљање). У примеру испод, дефинишемо параметар везе са сервером и додељујемо му ИП адресу сервера за управљање као стринг.

client_args = APIClientArgs(server='192.168.47.241')

Погледајмо све параметре и њихове подразумеване вредности које се могу користити приликом повезивања на АПИ сервер:

Аргументи методе __инит__ класе АПИЦлиентАргс

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

Верујем да су аргументи који се могу користити у инстанцама класе АПИЦлиентАргс интуитивни за Цхецк Поинт администраторе и да не захтевају додатне коментаре.

Повезивање преко АПИЦлиент-а и менаџера контекста

Класа АПИЦлиент Најпогоднији начин да га користите је преко контекстног менаџера. Све што треба да се проследи инстанци класе АПИЦлиент су параметри везе који су дефинисани у претходном кораку.

with APIClient(client_args) as client:

Менаџер контекста неће аутоматски упутити позив за пријаву на АПИ сервер, али ће извршити позив за одјаву када изађе из њега. Ако из неког разлога одјава није потребна након завршетка рада са АПИ позивима, морате да почнете да радите без коришћења контекстног менаџера:

client = APIClient(clieng_args)

Провера везе

Најлакши начин да проверите да ли веза испуњава наведене параметре је коришћење методе цхецк_фингерпринт. Ако верификација сха1 хеш суме за отисак прста АПИ сертификата сервера не успе (метод је враћен Лажан), онда је то обично узроковано проблемима везе и можемо зауставити извршавање програма (или дати кориснику прилику да исправи податке о вези):

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

Имајте на уму да ће у будућности разред АПИЦлиент ће проверити сваки АПИ позив (методе апи_цалл и апи_куери, причаћемо о њима мало даље) сха1 сертификат отиска прста на АПИ серверу. Али ако се приликом провере сха1 отиска прста сертификата АПИ сервера открије грешка (сертификат је непознат или је промењен), метод цхецк_фингерпринт пружиће могућност аутоматског додавања/промена информација о томе на локалној машини. Ова провера се може потпуно онемогућити (али ово се може препоручити само ако се скрипте покрећу на самом АПИ серверу, када се повезујете на 127.0.0.1), користећи аргумент АПИЦлиентАргс - унсафе_ауто_аццепт (погледајте више о АПИЦлиентАргс раније у одељку „Дефинисање параметара везе“).

client_args = APIClientArgs(unsafe_auto_accept=True)

Пријавите се на АПИ сервер

У АПИЦлиент постоје чак 3 методе за пријављивање на АПИ сервер и сваки од њих разуме значење сид(ид сесије), који се аутоматски користи у сваком следећем АПИ позиву у заглављу (име у заглављу овог параметра је Кс-цхкп-сид), тако да нема потребе за додатном обрадом овог параметра.

метод пријаве

Опција која користи логин и лозинку (у примеру, корисничко име админ и лозинка 1к2в3е се прослеђују као позициони аргументи):

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

Додатни опциони параметри су такође доступни у методи пријаве; ево њихових имена и подразумеваних вредности:

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

Метода Логин_витх_апи_кеи

Опција која користи АПИ кључ (подржано од верзије за управљање Р80.40/Манагемент АПИ в1.6, "3ТсбПЈ8ЗКјаЈГвФиоФкХФА==" ово је вредност АПИ кључа за једног од корисника на серверу за управљање са методом ауторизације АПИ кључа):

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

У методи логин_витх_апи_кеи доступни су исти опциони параметри као у методи prijava.

логин_ас_роот метод

Опција да се пријавите на локалну машину са АПИ сервером:

     login = client.login_as_root()

За овај метод су доступна само два опциона параметра:

domain=None, payload=None

И коначно АПИ позива себе

Имамо две опције за упућивање АПИ позива путем метода апи_цалл и апи_куери. Хајде да схватимо која је разлика између њих.

апи_цалл

Овај метод је применљив за све позиве. Морамо да проследимо последњи део за АПИ позив и корисни терет у телу захтева ако је потребно. Ако је терет празан, онда се уопште не може пренети:

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

Излаз за овај захтев испод реза:

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

Излаз за овај захтев испод реза:

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

апи_куери

Одмах да резервишем да је овај метод применљив само за позиве чији излаз укључује офсет. Такав закључак се дешава када садржи или може садржати велику количину информација. На пример, ово може бити захтев за листу свих креираних хост објеката на серверу за управљање. За такве захтеве, АПИ подразумевано враћа листу од 50 објеката (можете повећати ограничење на 500 објеката у одговору). А да не би извлачили информације неколико пута, мењајући параметар померања у АПИ захтеву, постоји апи_куери метод који ово ради аутоматски. Примери позива где је овај метод потребан: схов-сессионс, схов-хостс, схов-нетворкс, схов-вилдцардс, схов-гроуп, схов-аддресс-рангес, схов-симпле-гатеваис, схов-симпле-цлустерс, схов-аццесс-ролес, схов-трустед-цлиентс, схов-пацкагес. У ствари, у називима ових АПИ позива видимо речи у множини, тако да ће овим позивима бити лакше руковати апи_куери

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

Излаз за овај захтев испод реза:

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

Обрада резултата АПИ позива

Након тога можете користити променљиве и методе класе АПИРеспонсе(и унутар менаџера контекста и споља). На часу АПИРеспонсе 4 методе и 5 варијабли су унапред дефинисане, а на најважнијим ћемо се детаљније задржати.

Поједностављивање Цхецк Поинт АПИ-ја са Питхон СДК-ом

успех

За почетак, било би добро да се уверите да је АПИ позив успешан и да је вратио резултат. За ово постоји метод успех:

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

Враћа Тачно ако је АПИ позив био успешан (код одговора - 200) и Фалсе ако није успешан (било који други код одговора). Погодно је користити одмах након АПИ позива за приказ различитих информација у зависности од кода одговора.

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

статусцоде

Враћа код одговора након што је обављен АПИ позив.

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

Могући кодови одговора: 200,400,401,403,404,409,500,501.

сет_суццесс_статус

У овом случају, можда ће бити потребно променити вредност статуса успеха. Технички, тамо можете ставити било шта, чак и обичан низ. Али прави пример би био ресетовање овог параметра на Фалсе под одређеним пратећим условима. У наставку обратите пажњу на пример када се на серверу за управљање извршавају задаци, али ћемо овај захтев сматрати неуспелим (подесићемо променљиву успеха на Лажан, упркос чињеници да је АПИ позив био успешан и вратио код 200).

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

одговор()

Метод одговора вам омогућава да видите речник са кодом одговора (статус_цоде) и телом одговора (тело).

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

подаци

Омогућава вам да видите само тело одговора (тело) без непотребних информација.

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

порука о грешци

Ове информације су доступне само када је дошло до грешке током обраде АПИ захтева (код одговора не 200). Пример излаза

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

Корисни примери

Следе примери који користе АПИ позиве који су додати у Манагемент АПИ 1.6.

Прво, погледајмо како функционишу позиви адд-хост и адд-аддресс-ранге. Рецимо да треба да креирамо све ИП адресе подмреже 192.168.0.0/24, чији је последњи октет 5, као објекте типа хост, а све остале ИП адресе запишемо као објекте типа опсега адреса. У овом случају, искључите адресу подмреже и адресу емитовања.

Дакле, испод је скрипта која решава овај проблем и креира 50 објеката типа хост и 51 објекат типа опсега адреса. Да бисте решили проблем, потребан је 101 АПИ позив (не рачунајући последњи позив за објављивање). Такође, користећи модул тимеит, израчунавамо време које је потребно да се скрипта изврши до објаве промена.

Скрипта користећи адд-хост и адд-аддресс-ранге

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

У мом лабораторијском окружењу, овој скрипти је потребно између 30 и 50 секунди да се изврши, у зависности од оптерећења на серверу за управљање.

Сада да видимо како да решимо исти проблем користећи АПИ позив адд-објецтс-батцх, подршка за коју је додата у АПИ верзији 1.6. Овај позив вам омогућава да креирате више објеката одједном у једном АПИ захтеву. Штавише, то могу бити објекти различитих типова (на пример, хостови, подмреже и опсези адреса). Дакле, наш задатак се може решити у оквиру једног АПИ позива.

Скрипта користећи адд-објецтс-батцх

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 АПИ објекту, позив типа серије ради 10 пута брже. На већем броју објеката разлика ће бити још импресивнија.

Сада да видимо како да радимо са сет-објекти-батцх. Користећи овај АПИ позив, можемо групно да променимо било који параметар. Поставимо прву половину адреса из претходног примера (до .124 хоста, и опсеге такође) на боју сијена, и доделимо боју каки другој половини адреса.

Промена боје објеката креираних у претходном примеру

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

Можете да избришете више објеката у једном АПИ позиву користећи делете-објецтс-батцх. Сада погледајмо пример кода који брише све хостове који су претходно креирани путем адд-објецтс-батцх.

Брисање објеката помоћу делете-објецтс-батцх

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)

Све функције које се појављују у новим издањима Цхецк Поинт софтвера одмах добијају АПИ позиве. Тако су се у Р80.40 појавиле такве „функције“ као што су Реверт то ревисион и Смарт Таск, за које су одмах припремљени одговарајући АПИ позиви. Штавише, све функционалности при преласку са старијих конзола на режим обједињене политике такође добијају АПИ подршку. На пример, дуго очекивано ажурирање у верзији софтвера Р80.40 било је прелазак политике ХТТПС инспекције из Легаци режима у режим Унифиед Полици, и ова функционалност је одмах примила АПИ позиве. Ево примера кода који додаје правило на горњу позицију политике ХТТПС инспекције које искључује 3 категорије из инспекције (здравство, финансије, државне услуге), које су забрањене за инспекцију у складу са законом у одређеном броју земаља.

Додајте правило у политику ХТТПС инспекције

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

Покретање Питхон скрипти на Цхецк Поинт серверу за управљање

Све је исто РЕАДМЕ.мд садржи информације о томе како покренути Питхон скрипте директно са контролног сервера. Ово може бити згодно када не можете да се повежете на АПИ сервер са друге машине. Снимио сам шестоминутни видео у којем гледам како инсталирам модул цпапи и карактеристике покретања Питхон скрипти на контролном серверу. Као пример, покреће се скрипта која аутоматизује конфигурацију новог мрежног пролаза за задатак као што је ревизија мреже Сецурити ЦхецкУп. Међу карактеристикама са којима сам морао да се бавим: функција се још није појавила у Питхон-у 2.7 улазни, па се за обраду информација које корисник унесе користи функција рав_инпут. Иначе, код је исти као и за покретање са других машина, само што је згодније користити функцију логин_ас_роот, како не бисте поново навели своје корисничко име, лозинку и ИП адресу сервера за управљање.

Пусти видео

Скрипта за брзо подешавање безбедносне провере

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

Пример датотеке са речником лозинки Аддитионал_пасс.цонф
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"]
}

Закључак

Овај чланак испитује само основне могућности рада Питхон СДК и модул цпапи(као што сте можда претпоставили, ово су заправо синоними), а проучавањем кода у овом модулу открићете још више могућности у раду са њим. Могуће је да ћете желети да га допуните сопственим класама, функцијама, методама и варијаблама. Увек можете да делите свој рад и погледате друге скрипте за Цхецк Поинт у одељку ЦодеХуб у заједници ЦхецкМатес, који окупља и програмере производа и кориснике.

Срећно кодирање и хвала на читању до краја!

Извор: ввв.хабр.цом

Купите поуздан хостинг за сајтове са ДДоС заштитом, ВПС ВДС сервере 🔥 Купите поуздан веб хостинг са DDoS заштитом, VPS VDS сервере | ProHoster