Python SDK менен Check Point API жөнөкөйлөтүү

Python SDK менен Check Point API жөнөкөйлөтүүAPI менен өз ара аракеттенүүнүн толук күчү программалык код менен бирге колдонулганда, API сурамдарын жана API жоопторун талдоо куралдарын динамикалык түрдө түзүү мүмкүн болгондо ачылат. Бирок, ал дагы эле байкалбаган бойдон калууда Python Software Development Kit (мындан ары Python SDK деп аталат) үчүн Check Point Management API, бирок бекер. Бул иштеп чыгуучулардын жана автоматташтыруу ышкыбоздорунун жашоосун бир топ жеңилдетет. Python акыркы убакта эбегейсиз популярдуулукка ээ болду жана мен боштукту толтуруп, негизги өзгөчөлүктөрүн карап чыгууну чечтим. Check Point API Python Development Kit. Бул макала Habré боюнча башка макалага сонун кошумча катары кызмат кылат Check Point R80.10 API. CLI, сценарийлер жана башкалар аркылуу башкаруу. Биз Python SDK аркылуу скрипттерди кантип жазууну карап чыгабыз жана 1.6 версиясында (R80.40 баштап колдоого алынат) жаңы Management API функционалдуулугуна кылдат карап чыгабыз. Макаланы түшүнүү үчүн сизге API жана Python менен иштөө боюнча негизги билим керек болот.

Check Point APIди активдүү иштеп чыгууда жана учурда төмөнкүлөр чыгарылды:

Python SDK учурда башкаруу API жана менен өз ара аракеттенүүнү гана колдойт Gaia API. Биз бул модулда эң маанилүү класстарды, методдорду жана өзгөрмөлөрдү карап чыгабыз.

Python SDK менен Check Point API жөнөкөйлөтүү

Модулду орнотуу

Модуль cpapi тартып тез жана оңой орнотот github боюнча расмий Check Point репозиторий жардамы менен Жооп жазуу. Толук орнотуу нускамалары бар README.md. Бул модуль Python 2.7 жана 3.7 версиялары менен иштөөгө ылайыкташтырылган. Бул макалада мисалдар Python 3.7 аркылуу берилет. Бирок, Python SDK түздөн-түз Check Point Management Server'ден (Smart Management) иштетилиши мүмкүн, бирок алар Python 2.7ди гана колдойт, ошондуктан акыркы бөлүмдө 2.7 версиясынын коду берилет. Модулду орноткондон кийин дароо каталогдордогу мисалдарды карап чыгууну сунуштайм examples_python2 и examples_python3.

баштоо

Биз cpapi модулунун компоненттери менен иштей алышыбыз үчүн, модулдан импорттообуз керек. cpapi жок дегенде эки талап кылынган класстар:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

тап APIClientArgs API серверине жана класска туташуу параметрлери үчүн жооптуу APIClient API менен өз ара аракеттенүү үчүн жооптуу.

Туташуу параметрлерин аныктоо

API'ге туташуу үчүн ар кандай параметрлерди аныктоо үчүн класстын үлгүсүн түзүшүңүз керек APIClientArgs. Негизи, анын параметрлери алдын ала аныкталган жана башкаруу серверинде скрипт иштеткенде, аларды көрсөтүүнүн кереги жок.

client_args = APIClientArgs()

Бирок үчүнчү тараптын хостунда иштеп жатканда, сиз жок дегенде IP дарегин же API серверинин хост атын (башкаруу сервери катары да белгилүү) көрсөтүшүңүз керек. Төмөндөгү мисалда биз сервердин туташуу параметрин аныктайбыз жана ага башкаруу серверинин IP дарегин сап катары ыйгарабыз.

client_args = APIClientArgs(server='192.168.47.241')

Келгиле, API серверине туташууда колдонула турган бардык параметрлерди жана алардын демейки маанилерин карап көрөлү:

APIClientArgs классынын __init__ методунун аргументтери

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

APIClientArgs классынын инстанцияларында колдонулушу мүмкүн болгон аргументтер Check Point администраторлору үчүн интуитивдик жана кошумча комментарийлерди талап кылбайт деп ишенем.

APIClient жана контекст менеджери аркылуу туташуу

тап APIClient Аны колдонуунун эң ыңгайлуу жолу контекст менеджери аркылуу. APIClient классынын инстанциясына өтүшү керек болгон нерсе - бул мурунку кадамда аныкталган байланыш параметрлери.

with APIClient(client_args) as client:

Контекст башкаргычы API серверине автоматтык түрдө кирүү чалуу жасабайт, бирок андан чыкканда чыгуу чакырыгын жасайт. Эгерде кандайдыр бир себептерден улам API чалуулары менен иштөө аяктагандан кийин чыгуу талап кылынбаса, контекст менеджерин колдонбостон иштей башташыңыз керек:

client = APIClient(clieng_args)

Байланыш текшерилүүдө

Туташуу көрсөтүлгөн параметрлерге жооп берерин текшерүүнүн эң оңой жолу - бул ыкманы колдонуу манжа изин текшерүү. Server API сертификатынын манжа изи үчүн sha1 хэш суммасын текшерүү ишке ашпай калса (ыкма кайтарылды False), анда бул, адатта, туташуу көйгөйлөрүнөн улам келип чыгат жана биз программанын аткарылышын токтото алабыз (же колдонуучуга туташуу маалыматтарын оңдоо мүмкүнчүлүгүн бере алабыз):

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

Келечекте класс экенин белгилей кетүү керек APIClient ар бир API чалууларын текшерет (метод api_call и api_query, биз алар жөнүндө бир аз сүйлөшөбүз) API серверинде манжа изинин сертификаты. Бирок, API серверинин сертификатынын sha1 манжа изин текшерүүдө ката аныкталса (сертификат белгисиз же өзгөртүлгөн), ыкма манжа изин текшерүү жергиликтүү машинада ал тууралуу маалыматты автоматтык түрдө кошуу/өзгөртүү мүмкүнчүлүгүн берет. Бул текшерүүнү толугу менен өчүрүүгө болот (бирок бул скрипттер API серверинин өзүндө, 127.0.0.1ге туташып жатканда гана сунушталышы мүмкүн), APIClientArgs аргументин колдонуу менен - unsafe_auto_accept («Туташуу параметрлерин аныктоо» бөлүмүндө мурун APIClientArgs жөнүндө көбүрөөк караңыз).

client_args = APIClientArgs(unsafe_auto_accept=True)

API серверине кириңиз

У APIClient API серверине кирүү үчүн 3 ыкма бар жана алардын ар бири маанисин түшүнөт Сид(session-id), ал ар бир кийинки API чалууларында автоматтык түрдө колдонулат (бул параметрдин аталышындагы аталыш X-чкп-сид), ошондуктан бул параметрди андан ары иштетүүнүн кереги жок.

кирүү ыкмасы

Логин жана сырсөздү колдонуу менен опция (мисалы, колдонуучунун аты admin жана 1q2w3e сырсөзү позициялык аргумент катары берилген):

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

Кошумча кошумча параметрлер кирүү методунда да бар, алардын аттары жана демейки маанилери:

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

Login_with_api_key ыкмасы

api ачкычын колдонуу менен опция (башкаруу R80.40/Management API v1.6 версиясынан баштап колдоого алынат, "3TsbPJ8ZKjaJGvFyoFqHFA==" бул API ачкычынын авторизация ыкмасы менен башкаруу сервериндеги колдонуучулардын бири үчүн API ачкычынын мааниси):

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

Усулда login_with_api_key методдогудай эле кошумча параметрлер бар Кирүү.

login_as_root ыкмасы

API сервери менен жергиликтүү машинага кирүү опциясы:

     login = client.login_as_root()

Бул ыкма үчүн эки гана кошумча параметр бар:

domain=None, payload=None

Анан акыры API өздөрүн чакырат

методдор аркылуу API чалууларды жасоо үчүн бизде эки вариант бар api_call и api_query. Келгиле, алардын ортосунда кандай айырма бар экенин карап көрөлү.

api_call

Бул ыкма бардык чалуулар үчүн жарактуу. Зарыл болсо, өтүнмө органында api чалуу жана пайдалуу жүк үчүн акыркы бөлүктөн өтүшүбүз керек. Эгер пайдалуу жүк бош болсо, анда аны такыр өткөрүү мүмкүн эмес:

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

api_query

Мага дароо эскертип коеюн, бул ыкма офсетти камтыган чалуулар үчүн гана колдонулат. Мындай тыянак ал маалыматтын чоң көлөмүн камтыса же камтышы мүмкүн болгондо пайда болот. Мисалы, бул башкаруу серверинде түзүлгөн бардык хост объекттеринин тизмесин суроо болушу мүмкүн. Мындай суроо-талаптар үчүн API демейки боюнча 50 объектинин тизмесин кайтарат (жоопто чекти 500 объектке чейин көбөйтө аласыз). Жана API сурамындагы офсет параметрин өзгөртүү менен маалыматты бир нече жолу тартпоо үчүн, бул автоматтык түрдө иштей турган api_query ыкмасы бар. Бул ыкма керек болгон чалуулардын мисалдары: шоу-сессиялар, шоу-алып баруучулар, шоу-тармактар, шоу-жок белгилери, шоу-группалар, шоу-даректер-диапазондор, шоу-жөнөкөй-шлюздар, шоу-жөнөкөй-кластерлер, шоу-кирүү-ролдор, шоу-ишенимдүү кардарлар, шоу-пакеттер. Чынында, биз бул API чалууларынын атынан көптүк сөздөрдү көрөбүз, андыктан бул чалууларды башкаруу оңой болот api_query

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

API чалууларынын натыйжаларын иштетүү

Андан кийин сиз класстын өзгөрмөлөрүн жана ыкмаларын колдоно аласыз APIResponse(контекст менеджеринин ичинде да, сыртында да). Класста APIResponse 4 ыкма жана 5 өзгөрмөлөр алдын ала аныкталган;

Python SDK менен Check Point API жөнөкөйлөтүү

ийгилик

Баштоо үчүн, API чалуу ийгиликтүү болуп, натыйжа бергенине ынануу жакшы болмок. Бул үчүн бир ыкма бар ийгилик:

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

API чалуу ийгиликтүү болсо, True (жооп коду - 200) жана ийгиликтүү болбосо, False (башка жооп коду) кайтарат. Жооп кодуна жараша ар кандай маалыматты көрсөтүү үчүн API чалуудан кийин дароо колдонуу ыңгайлуу.

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

статус коду

API чалуу жасалгандан кийин жооп кодун кайтарат.

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

Мүмкүн болгон жооп коддору: 200,400,401,403,404,409,500,501.

set_success_status

Бул учурда, ийгилик статусунун маанисин өзгөртүү зарыл болушу мүмкүн. Техникалык жактан ал жерге каалаган нерсени, жада калса кадимки жипти да салса болот. Бирок чыныгы мисал, бул параметрди белгилүү бир коштоо шарттарында False абалына кайтаруу болот. Төмөндө, башкаруу серверинде тапшырмалар иштеп жаткан мисалга көңүл буруңуз, бирок биз бул өтүнүчтү ийгиликсиз деп эсептейбиз (ийгиликтин өзгөрмөсүн False, API чалуу ийгиликтүү болгонуна жана 200 коду кайтарылганына карабастан).

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

жооп()

Жооп берүү ыкмасы сөздүктү жооп коду (status_code) жана жооп органы (денеси) менен көрүүгө мүмкүндүк берет.

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

ката_билдирүү

Бул маалымат API сурамын иштеп жатканда ката чыкканда гана жеткиликтүү болот (жооп коду жок 200). Мисал чыгаруу

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

Пайдалуу мисалдар

Төмөндө Management API 1.6га кошулган API чалууларын колдонгон мисалдар келтирилген.

Биринчиден, чалуулар кантип иштээрин карап көрөлү кошуу хост и дарек диапазону кошуу. 192.168.0.0/24 ички тармактын бардык IP даректерин, акыркы октети 5, хост түрүнүн объектилери катары түзүшүбүз керек жана башка бардык IP даректерди дарек диапазонунун объектилери катары жазышыбыз керек дейли. Бул учурда, ички тармак дарегин жана уктуруу дарегин чыгарыңыз.

Ошентип, төмөндө бул көйгөйдү чечкен жана хост түрүндөгү 50 объектти жана дарек диапазонундагы 51 объектти түзгөн скрипт. Көйгөйдү чечүү үчүн 101 API чалуулары талап кылынат (акыркы жарыялоо чалуусун эсепке албаганда). Ошондой эле, timeit модулунун жардамы менен, биз өзгөртүүлөр жарыяланганга чейин скриптти аткарууга кеткен убакытты эсептейбиз.

Кошумча хост жана кошумча дарек диапазону аркылуу скрипт

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 секундга чейин аткарылат.

Эми ошол эле маселени API чалуу аркылуу кантип чечүүнү карап көрөлү кошуу-объект-партия, колдоо API 1.6 версиясында кошулган. Бул чакыруу бир эле API сурамында бир эле учурда көптөгөн объекттерди түзүүгө мүмкүндүк берет. Мындан тышкары, бул ар кандай типтеги объекттер болушу мүмкүн (мисалы, хосттор, ички тармактар ​​жана дарек диапазондору). Ошентип, биздин милдетти бир API чалуу алкагында чечсе болот.

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

Жана бул скриптти менин лабораториямда иштетүү башкаруу сервериндеги жүктөөгө жараша 3 секунддан 7 секундага чейин созулат. Башкача айтканда, орто эсеп менен 101 API объектисинде партия түрүндөгү чалуу 10 эсе ылдамыраак иштейт. Объекттердин көп санында айырма дагы таасирдүү болот.

Эми аны менен кантип иштөөнү карап көрөлү объекттердин топтому. Бул API чалуу аркылуу биз каалаган параметрди жапырт өзгөртө алабыз. Мурунку мисалдагы даректердин биринчи жарымын (.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")

Колдонуу менен бир API чалуусунда бир нече объектти жок кыла аласыз жок кылуу-объекттерди-топтом. Эми мурун аркылуу түзүлгөн бардык хостторду жок кылган коддун мисалын карап көрөлү кошуу-объект-партия.

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)

Check Point программасынын жаңы чыгарылыштарында пайда болгон бардык функциялар дароо API чалууларына ээ болот. Ошентип, R80.40да Revert to Review жана Smart Task сыяктуу "функциялар" пайда болуп, алар үчүн тиешелүү API чалуулары дароо даярдалган. Мындан тышкары, эски консолдордон Бирдиктүү саясат режимине өтүүдө бардык функциялар API колдоосуна ээ болот. Мисалы, R80.40 программалык версиясында көптөн күтүлгөн жаңыртуу HTTPS текшерүү саясатынын Эски режимден Бирдиктүү саясат режимине жылдырылышы жана бул функция дароо API чалууларын кабыл алды. Бул жерде бир катар өлкөлөрдүн мыйзамдарына ылайык текшерүүгө тыюу салынган 3 категорияны текшерүүдөн (Саламаттык сактоо, Финансы, Мамлекеттик Кызматтар) алып салган HTTPS Инспекция саясатынын жогорку позициясына эреже кошо турган коддун мисалы келтирилген.

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

Check Point башкаруу серверинде Python скрипттерин иштетүү

Баары бирдей README.md башкаруу серверинен түздөн-түз Python скрипттерин иштетүү боюнча маалыматты камтыйт. Бул башка машинадан API серверине туташа албай калганда ыңгайлуу болушу мүмкүн. Мен модулду орнотууну карап жаткан алты мүнөттүк видео жаздым cpapi жана башкаруу серверинде Python скрипттерин иштетүү өзгөчөлүктөрү. Мисал катары, тармактык аудит сыяктуу тапшырма үчүн жаңы шлюздун конфигурациясын автоматташтырган скрипт иштетилди. Коопсуздукту текшерүү. Мен чечишим керек болгон өзгөчөлүктөрдүн арасында: функция Python 2.7де пайда боло элек кирүү, ошондуктан колдонуучу киргизген маалыматты иштетүү үчүн функция колдонулат чийки_киргизүү. Болбосо, код башка машиналардан ишке киргизүү менен бирдей, бир гана функцияны колдонуу ыңгайлуу login_as_root, өзүңүздүн логиниңизди, сырсөзүңүздү жана башкаруу серверинин IP дарегин кайра көрсөтпөө үчүн.

Play Video

Коопсуздук текшерүүсүн тез орнотуу үчүн скрипт

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

Сырсөз сөздүгү менен мисал файлы additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"]
}

жыйынтыктоо

Бул макалада иштин негизги мүмкүнчүлүктөрү гана каралат Python SDK жана модулу cpapi(сиз ойлогондой, булар чындыгында синонимдер) жана бул модулдагы кодду изилдөө менен сиз аны менен иштөөдө дагы көбүрөөк мүмкүнчүлүктөрдү ачасыз. Мүмкүн, сиз аны өзүңүздүн класстарыңыз, функцияларыңыз, методдоруңуз жана өзгөрмөлөрүңүз менен толуктоону каалайсыз. Бөлүмдө сиз ар дайым ишиңизди бөлүшө аласыз жана Check Point үчүн башка скрипттерди көрө аласыз CodeHub коомчулук CheckMates, бул продукт иштеп чыгуучуларды жана колдонуучуларды бириктирет.

Бактылуу коддоо жана аягына чейин окуганыңыз үчүн рахмат!

Source: www.habr.com

DDoS коргоосу, VPS VDS серверлери бар сайттар үчүн ишенимдүү хостинг сатып алыңыз 🔥 DDoS коргоосу, VPS VDS серверлери бар ишенимдүү веб-сайт хостингин сатып алыңыз | ProHoster