Π£ΠΏΡ€ΠΎΡ‰Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Check Point API с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python SDK

Π£ΠΏΡ€ΠΎΡ‰Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Check Point API с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python SDKВся ΠΌΠΎΡ‰ΡŒ взаимодСйствия с API раскрываСтся ΠΏΡ€ΠΈ совмСстном использовании с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ возмоТности динамичСски Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ API запросы ΠΈ инструмСнты для Π°Π½Π°Π»ΠΈΠ·Π° API ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ². Однако, ΠΌΠ°Π»ΠΎΠ·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΌ Π΄ΠΎ сих ΠΏΠΎΡ€ остаётся Python Software Development Kit (Π΄Π°Π»Π΅Π΅ β€” Python SDK) для Check Point Management API, Π° зря. Он ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Тизнь Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΈ Π»ΡŽΠ±ΠΈΡ‚Π΅Π»ΡΠΌ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. Python ΠΏΡ€ΠΈΠΎΠ±Ρ€Ρ‘Π» ΠΎΠ³Ρ€ΠΎΠΌΠ½ΡƒΡŽ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Π² послСднСС врСмя ΠΈ я Ρ€Π΅ΡˆΠΈΠ» ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±Π·ΠΎΡ€ основных возмоностСй Check Point API Python Development Kit. Данная ΡΡ‚Π°Ρ‚ΡŒΡ слуТит ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ Π½Π° Π₯Π°Π±Ρ€Π΅ Check Point R80.10 API. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· CLI, скрипты ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ. ΠœΡ‹ ΠΆΠ΅ рассмотрим ΠΊΠ°ΠΊ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ скрипты с использованиСм Python SDK ΠΈ остановимся ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° Π½ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅ Management API Π² вСрсии 1.6(поддСрТиваСтся начиная с R80.40). Для понимания ΡΡ‚Π°Ρ‚ΡŒΠΈ понадобятся Π±Π°Π·ΠΎΠ²Ρ‹Π΅ знания ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с API ΠΈ Python.

Check Point Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π°Π΅Ρ‚ API ΠΈ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π° свСт появились:

Python SDK Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ взаимодСйствиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Management API ΠΈ Gaia API. ΠœΡ‹ рассмотрим самыС Π²Π°ΠΆΠ½Ρ‹Π΅ классы, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅.

Π£ΠΏΡ€ΠΎΡ‰Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Check Point API с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python SDK

Установка модуля

ΠœΠΎΠ΄ΡƒΠ»ΡŒ cpapi устанавливаСтся быстро ΠΈ просто ΠΈΠ· ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ рСпозитария Check Point Π½Π° github с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip. ΠŸΠΎΠ΄Π±Ρ€ΠΎΠ±Π½Π°Ρ инструкция ΠΏΠΎ установкС Π΅ΡΡ‚ΡŒ Π² README.md. Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с вСрсиями Python 2.7 ΠΈ 3.7. Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ с использованиСм Python 3.7. Однако, Python SDK ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ прямо с сСрвСра управлСния Check Point (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 сСрвСра(ΠΎΠ½ ΠΆΠ΅ сСрвСр управлСния). Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ ΠΌΡ‹ опрСдСляСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ server ΠΈ присваиваСм Π΅ΠΌΡƒ Π² Π²ΠΈΠ΄Π΅ строки IP адрСс сСрвСра управлСния.

client_args = APIClientArgs(server='192.168.47.241')

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° всС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΈ ΠΈΡ… значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊ API сСрвСру:

АргумСнты ΠΌΠ΅Ρ‚ΠΎΠ΄Π° __init__ класса 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

Полагаю, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² экзСмплярах класса APIClientArgs, ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятны администраторам Check Point ΠΈ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… коммСнтариях Π½Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ.

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ Ρ‡Π΅Ρ€Π΅Π· APIClient ΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ контСкста

Класс APIClient ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ контСкста. Всё, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ экзСмпляру класса APIClient это ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ шагС.

with APIClient(client_args) as client:

ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ контСкста Π½Π΅ станСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ автоматичСски login Π²Ρ‹Π·ΠΎΠ² Π½Π° API сСрвСр, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ Π²Ρ‹Π·ΠΎΠ² logout ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ. Если ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ logout ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с API Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ Π½Π΅ трСбуСтся, Π½ΡƒΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π±Π΅Π· использования ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° контСкста:

client = APIClient(clieng_args)

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° соСдинСния

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ соСдинСниС ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ ΠΏΡ€ΠΎΡ‰Π΅ всСго с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° check_fingerprint. Если ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ…Π΅Ρˆ-суммы sha1 для fingerprint сСртификата API сСрвСра Π½Π΅ ΠΏΡ€ΠΎΡˆΠ»Π°(ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π΅Ρ€Π½ΡƒΠ» 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, ΠΎ Π½ΠΈΡ… Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ‡ΡƒΡ‚ΡŒ дальшС) sha1 fingerprint сСртификата Π½Π° API сСрвСрС. А Π²ΠΎΡ‚ Ссли ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ sha1 fingerprint сСртификата API сСрвСра Π±ΡƒΠ΄Π΅Ρ‚ выявлСна ошибка (сСртификат нСизвСстСн ΠΈΠ»ΠΈ Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½), ΠΌΠ΅Ρ‚ΠΎΠ΄ check_fingerprint прСдоставит Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ/ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π½Ρ‘ΠΌ Π½Π° локальной машинС Π² автоматичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π”Π°Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ вовсС (Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² случаС запуска скриптов Π½Π° самом API сСрвСрС, ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΊ 127.0.0.1), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ APIClientArgs β€” unsafe_auto_accept (см. ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎ APIClientArgs Ρ€Π°Π½Π΅Π΅ Π² Β«ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΒ»).

client_args = APIClientArgs(unsafe_auto_accept=True)

Login Π½Π° API сСрвСр

Π£ APIClient Π΅ΡΡ‚ΡŒ Ρ†Π΅Π»Ρ‹Ρ… 3 ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π»ΠΎΠ³ΠΈΠ½Π° Π½Π° API сСрвСр, ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ… Π·Π°ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ sid(session-id), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ автоматичСски Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ API Π²Ρ‹Π·ΠΎΠ²Π΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅(имя Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Ρƒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° β€” X-chkp-sid), Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

ΠœΠ΅Ρ‚ΠΎΠ΄ login

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ с использованиСм Π»ΠΎΠ³ΠΈΠ½Π° ΠΈ пароля(Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ admin ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ 1q2w3e ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ ΠΊΠ°ΠΊ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹):

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

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ login доступны Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ ΠΈΡ… ΠΈΠΌΠ΅Π½Π° ΠΈ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

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 key):

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

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ login_with_api_key доступны Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΠ°ΠΊ ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ login.

ΠœΠ΅Ρ‚ΠΎΠ΄ login_as_root

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ login’а Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ с API сСрвСром:

     login = client.login_as_root()

Для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° доступны всСго Π΄Π²Π° ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

domain=None, payload=None

И Π½Π°ΠΊΠΎΠ½Π΅Ρ† сами API Π²Ρ‹Π·ΠΎΠ²Ρ‹

Π£ нас Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π΄Π΅Π»Π°Ρ‚ΡŒ API Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ api_call ΠΈ api_query. Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся Π² Ρ‡Ρ‘ΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Ρ€Π°Π·Π½ΠΈΡ†Π°.

api_call

Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ для Π»ΡŽΠ±Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Нам Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ послСднюю Ρ‡Π°ΡΡ‚ΡŒ для api Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ payload Π² Ρ‚Π΅Π»Π΅ запроса ΠΏΡ€ΠΈ нСобходимости. Если payload пустой, Ρ‚ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ вовсС:

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

Π‘Ρ€Π°Π·Ρƒ ΠΎΠ³ΠΎΠ²ΠΎΡ€ΡŽΡΡŒ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ offset(сдвиг). Π’Π°ΠΊΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄ происходит Π² Ρ‚ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° Π² Π½Ρ‘ΠΌ содСрТится ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ содСрТатся большоС количСство ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. НапримСр, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ запрос списка всСх созданных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° хост Π½Π° сСрвСрС управлСния. Для Ρ‚Π°ΠΊΠΈΡ… запросов API Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список ΠΈΠ· 50 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ(ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π»ΠΈΠΌΠΈΡ‚ Π΄ΠΎ 500 ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅). И для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄Ρ‘Ρ€Π³Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΏΠΎ нСсколько Ρ€Π°Π·, мСняя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ offset Π² API запросС, Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ api_query, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Π½Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ автоматичСски. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π³Π΄Π΅ Π½ΡƒΠΆΠ΅Π½ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄: 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. По Ρ„Π°ΠΊΡ‚Ρƒ, Π² ΠΈΠΌΠ΅Π½ΠΈ этих 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 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½Π° самых Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΌΡ‹ остановимся ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

Π£ΠΏΡ€ΠΎΡ‰Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Check Point API с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python SDK

success

Для Π½Π°Ρ‡Π°Π»Π° Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ API Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡˆΡ‘Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈ Π²Π΅Ρ€Π½ΡƒΠ» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Для этого Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ success:

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

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True Ссли API Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡˆΡ‘Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ(Код ΠΎΡ‚Π²Π΅Ρ‚Π° β€” 200) ΠΈ False Ссли Π½Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ(любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ΄ ΠΎΡ‚Π²Π΅Ρ‚Π°). Π£Π΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сразу послС API Π²Ρ‹Π·ΠΎΠ²Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ΄Π° ΠΎΡ‚Π²Π΅Ρ‚Π° вывСсти Ρ€Π°Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

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

statuscode

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ ΠΎΡ‚Π²Π΅Ρ‚Π° послС выполнСния API Π²Ρ‹Π·ΠΎΠ²Π°.

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

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²: 200,400,401,403,404,409,500,501.

set_success_status

ΠŸΡ€ΠΈ этом ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ статуса success. ВСхничСски, Ρ‚ΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ, Π΄Π°ΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ строку. Но Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сброс Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² False ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… условиях. НиТС ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ³Π΄Π° Π΅ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ, выполняСмыС Π½Π° сСрвСрС управлСния, Π½ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ этот запрос Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ(выставим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ success Π² 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

response()

ΠœΠ΅Ρ‚ΠΎΠ΄ response позволяСт ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π°(status_code) ΠΈ с Ρ‚Π΅Π»ΠΎΠΌ ΠΎΡ‚Π²Π΅Ρ‚Π°(body).

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

data

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅Π»ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°(body) Π±Π΅Π· излишнСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

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

error_message

Данная информация доступна, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ API запроса Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ошибка(ΠΊΠΎΠ΄ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π΅ 200). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π°

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

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

НиТС пСрСчислСны ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ API Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² Π²Π΅Ρ€ΡΠΈΡŽ Management API 1.6.

Для Π½Π°Ρ‡Π°Π»Π° рассмотрим Ρ€Π°Π±ΠΎΡ‚Ρƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² add-host ΠΈ add-address-range. Допустим, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² качСствС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° хост всС ip адрСса подсСти 192.168.0.0/24, послСдний ΠΎΠΊΡ‚Π΅Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π²Π΅Π½ 5, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ip адрСса Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² качСствС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‚ΠΈΠΏΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ адрСсов. ΠŸΡ€ΠΈ этом, адрСс подсСти ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ²Π΅Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ адрСс ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ.

Π˜Ρ‚Π°ΠΊ, Π½ΠΈΠΆΠ΅ прСдставлСн скрипт Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ данная Π·Π°Π΄Π°Ρ‡Π° ΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ 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')

Π’ ΠΌΠΎΠ΅ΠΉ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠΉ срСдС Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ скрипта ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚ 30 Π΄ΠΎ 50 сСкунд Π² зависимости ΠΎΡ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π° сСрвСр управлСния.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ API Π²Ρ‹Π·ΠΎΠ²Π° add-objects-batch, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π² Π²Π΅Ρ€ΡΠΈΡŽ 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 Π²Ρ‹Π·ΠΎΠ² Ρ‚ΠΈΠΏΠ° batch, ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π² 10 Ρ€Π°Π· быстрСС. На большСм количСствС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π°Π·Π½ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡŽΡ‰Π΅ΠΉ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с set-objects-batch. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π°Π½Π½ΠΎΠ³ΠΎ API Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ массово ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ любой ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€. Π”Π°Π²Π°ΠΉΡ‚Π΅ настроим ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ адрСсов ΠΈΠ· ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° (Π΄ΠΎ .124 хоста, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌ Ρ‚ΠΎΠΆΠ΅) Ρ†Π²Π΅Ρ‚ sienna, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ адрСсов Π½Π°Π·Π½Π°Ρ‡ΠΈΠΌ Ρ†Π²Π΅Ρ‚ khaki.

ИзмСнСниС Ρ†Π²Π΅Ρ‚Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², созданных Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡˆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅

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. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ посмотрим Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удаляСт всС хосты, созданныС Ρ€Π°Π½Π΅Π΅ Ρ‡Π΅Ρ€Π΅Π· add-objects-batch.

Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 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 revision ΠΈ Smart Task, ΠΈ для Π½ΠΈΡ… сразу ΠΆΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ API Π²Ρ‹Π·ΠΎΠ²Ρ‹. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, вСсь Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Legacy консолСй Π² Ρ€Π΅ΠΆΠΈΠΌ Unified Policy Ρ‚Π°ΠΊΠΆΠ΅ обрастаСт ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ API. НапримСр, Π΄ΠΎΠ»Π³ΠΎΠΆΠ΄Π°Π½Π½Ρ‹ΠΌ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ Π² вСрсии ПО R80.40 стал ΠΏΠ΅Ρ€Π΅Π΅Π·Π΄ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ HTTPS Inspection ΠΈΠ· Legacy Ρ€Π΅ΠΆΠΈΠΌΠ° Π² Ρ€Π΅ΠΆΠΈΠΌ Unified Policy, ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» сразу ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» API Π²Ρ‹Π·ΠΎΠ²Ρ‹. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСт Π½Π° Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ HTTPS Inspection policy ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ· инспСкции 3 ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ(Π—Π΄ΠΎΡ€ΠΎΠ²ΡŒΠ΅, Ѐинансы, ГосударствСнныС услуги), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΠΈΠ½ΡΠΏΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² соотвСтствии с Π·Π°ΠΊΠΎΠ½Π°Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎΠΌ Π² рядС стран.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π² ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ HTTPS Inspection

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

Всё Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ README.md содСрТится информация ΠΊΠ°ΠΊ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ скрипты Π½Π° Python прямо с сСрвСра управлСния. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π½Π΅Ρ‚ возмоТности ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ API сСрвСру с Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹. Π― записал ΡˆΠ΅ΡΡ‚ΠΈΠΌΠΈΠ½ΡƒΡ‚Π½ΠΎΠ΅ Π²ΠΈΠ΄Π΅ΠΎ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ установку модуля cpapi ΠΈ особСнности запуска Python скриптов Π½Π° сСрвСрС управлСния. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° запускаСтся скрипт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ шлюза для Ρ‚Π°ΠΊΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠ°ΠΊ Π°ΡƒΠ΄ΠΈΡ‚ сСти Security CheckUp. Из особСнностСй, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ: Π² вСрсии Python 2.7 Π΅Ρ‰Ρ‘ Π½Π΅ появилась функция input, поэтому для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция raw_input. Π’ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΌ, ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΊΠ°ΠΊ для запуска с Π΄Ρ€ΡƒΠ³ΠΈΡ… машин, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ login_as_root, Π΄Π°Π±Ρ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ свои ΠΆΠ΅ собствСнныС username, ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΈ IP адрСс сСрвСра управлСния Π΅Ρ‰Ρ‘ Ρ€Π°Π·.

Play video

Π‘ΠΊΡ€ΠΈΠΏΡ‚ для быстрой настройки Security CheckUp

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

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

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

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

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

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

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

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

main()

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° со словарём ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","ΠΏΠ°Ρ€ΠΎΠ»ΡŒ","ΠŸΠ°Ρ€ΠΎΠ»ΡŒ","ΠšΠ»ΡŽΡ‡","ΠΊΠ»ΡŽΡ‡","ΡˆΠΈΡ„Ρ€","Π¨ΠΈΡ„Ρ€"] }

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Данная ΡΡ‚Π°Ρ‚ΡŒΡ рассматриваСт лишь основныС возмоТности Ρ€Π°Π±ΠΎΡ‚Ρ‹ Python SDK ΠΈ модуля cpapi(ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, это фактичСски синонимы), ΠΈ ΠΈΠ·ΡƒΡ‡ΠΈΠ² ΠΊΠΎΠ΄ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ Π²Ρ‹ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅Ρ‚Π΅ для сСбя Π΅Ρ‰Ρ‘ большС возмоТностСй Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с Π½ΠΈΠΌ. НС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ вас появится ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ своими классами, функциями, ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Π’Ρ‹ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ дСлится своими Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°ΠΌΠΈ ΠΈ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ скрипты для Check Point Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ CodeHub Π² сообщСствС CheckMates, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π² сСбС ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

ΠŸΡ€ΠΈΡΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄ΠΈΠ½Π³Π° ΠΈ спасибо, Ρ‡Ρ‚ΠΎ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

author avatar
ProHoster ΠšΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Π½Ρ‚, ВСхничСский спСциалист
A technical specialist at ProHoster with over six years of experience in server administration, VPN solutions, and network security. I manage infrastructure setup and support, monitor service stability, and implement solutions to protect client data. I also contribute to performance optimization and compliance with modern security and privacy requirements.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ