Python SDK๋กœ Check Point API ๋‹จ์ˆœํ™”

Python SDK๋กœ Check Point API ๋‹จ์ˆœํ™”API ์‘๋‹ต ๋ถ„์„์„ ์œ„ํ•œ API ์š”์ฒญ ๋ฐ ๋„๊ตฌ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ API์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๊ด€์ฐฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. Python ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํ‚คํŠธ (์ดํ•˜ - Python SDK) ์ฒดํฌํฌ์ธํŠธ ๊ด€๋ฆฌ API,ํ•˜์ง€๋งŒ ํ—›๋œ. ๊ฐœ๋ฐœ์ž์™€ ์ž๋™ํ™” ์• ํ˜ธ๊ฐ€์˜ ์‚ถ์„ ํฌ๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. Python์€ ์ตœ๊ทผ ๋ช‡ ๋…„ ๋™์•ˆ ์—„์ฒญ๋‚œ ์ธ๊ธฐ๋ฅผ ์–ป์—ˆ๊ณ  ์ €๋Š” ๊ฒฉ์ฐจ๋ฅผ ์ขํžˆ๊ณ  ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๊ฒ€ํ† ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. Check Point API Python ๊ฐœ๋ฐœ ํ‚คํŠธ. ์ด ๊ธฐ์‚ฌ๋Š” Habrรฉ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ์— ํ›Œ๋ฅญํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฒดํฌ ํฌ์ธํŠธ R80.10 API. CLI, ์Šคํฌ๋ฆฝํŠธ ๋“ฑ์„ ํ†ตํ•œ ์ œ์–ด. Python SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ๋ฒ„์ „ 1.6(R80.40๋ถ€ํ„ฐ ์ง€์›๋จ)์˜ ๊ด€๋ฆฌ API์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด API ๋ฐ Python ์ž‘์—…์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์‹์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Check Point๋Š” API๋ฅผ ์ ๊ทน์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Python SDK๋Š” ํ˜„์žฌ ๊ด€๋ฆฌ API์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ๋งŒ ์ง€์›ํ•˜๊ณ  ๊ฐ€์ด์•„ API. ์ด ๋ชจ๋“ˆ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ ๋ฐ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Python SDK๋กœ Check Point API ๋‹จ์ˆœํ™”

๋ชจ๋“ˆ ์„ค์น˜

๊ธฐ์ค€ ์น˜์ˆ˜ CPAPI ์—์„œ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ์„ค์น˜ github์˜ Check Point ๊ณต์‹ ์ €์žฅ์†Œ ๋ฅผ ํ†ตํ•ด ์‚์•… ์‚์•… ์šธ๋‹ค. ์ž์„ธํ•œ ์„ค์น˜ ์ง€์นจ์€ README.md. ์ด ๋ชจ๋“ˆ์€ Python ๋ฒ„์ „ 2.7 ๋ฐ 3.7์—์„œ ์ž‘๋™ํ•˜๋„๋ก ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” Python 3.7์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, Python SDK๋Š” Check Point ๊ด€๋ฆฌ ์„œ๋ฒ„(Smart Management)์—์„œ ์ง์ ‘ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Python 2.7๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ ๋ฒ„์ „ 2.7์— ๋Œ€ํ•œ ์ฝ”๋“œ๋Š” ๋งˆ์ง€๋ง‰ ์„น์…˜์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•œ ์งํ›„ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. example_python2 ะธ example_python3.

์‹œ์ž‘ํ•˜๊ธฐ

cpapi ๋ชจ๋“ˆ์˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. CPAPI ์ตœ์†Œ ๋‘ ๊ฐœ์˜ ํ•„์ˆ˜ ํด๋ž˜์Šค:

APIํด๋ผ์ด์–ธํŠธ ะธ APIClientArgs

from cpapi import APIClient, APIClientArgs

ํด๋ž˜์Šค APIClientArgs API ์„œ๋ฒ„์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐ ํด๋ž˜์Šค๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. APIํด๋ผ์ด์–ธํŠธ API์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ •์˜

API์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. APIClientArgs. ์›์น™์ ์œผ๋กœ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ ์ œ์–ด ์„œ๋ฒ„์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

client_args = APIClientArgs()

๊ทธ๋Ÿฌ๋‚˜ ํƒ€์‚ฌ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์†Œํ•œ API ์„œ๋ฒ„(๊ด€๋ฆฌ ์„œ๋ฒ„๋ผ๊ณ ๋„ ํ•จ)์˜ IP ์ฃผ์†Œ ๋˜๋Š” ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์—์„œ๋Š” ์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์„œ๋ฒ„๋ฅผ ์ •์˜ํ•˜๊ณ  ์ด๋ฅผ ๊ด€๋ฆฌ ์„œ๋ฒ„์˜ 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 ๋ฐ ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ

ํด๋ž˜์Šค APIํด๋ผ์ด์–ธํŠธ ์ปจํ…์ŠคํŠธ ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. APIClient ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ ์ •์˜๋œ ์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.

with APIClient(client_args) as client:

์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋Š” API ์„œ๋ฒ„์— ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ ํ˜ธ์ถœ์„ ํ•˜์ง€ ์•Š์ง€๋งŒ ์ข…๋ฃŒํ•  ๋•Œ ๋กœ๊ทธ์•„์›ƒ ํ˜ธ์ถœ์„ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ด์œ ๋กœ API ํ˜ธ์ถœ ์ž‘์—…์„ ๋งˆ์ณค์„ ๋•Œ ๋กœ๊ทธ์•„์›ƒํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž‘์—…์„ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

client = APIClient(clieng_args)

์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ์—ฐ๊ฒฐ์ด ํ†ต๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ‘œ_์ง€๋ฌธ. ์„œ๋ฒ„ API ์ธ์ฆ์„œ์˜ ์ง€๋ฌธ์— ๋Œ€ํ•œ sha1 ํ•ด์‹œ ํ•ฉ๊ณ„ ํ™•์ธ์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ(๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋จ) ๊ฑฐ์ง“), ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์—ฐ๊ฒฐ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ฐ๊ฒฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๊ธฐํšŒ๋ฅผ ์ œ๊ณต).

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

์•ž์œผ๋กœ ์ˆ˜์—…์€ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š” APIํด๋ผ์ด์–ธํŠธ ๋ชจ๋“  API ํ˜ธ์ถœ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(๋ฉ”์†Œ๋“œ api_call ะธ api_query, ์กฐ๊ธˆ ๋” ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค) API ์„œ๋ฒ„์— ์žˆ๋Š” ์ธ์ฆ์„œ์˜ sha1 ์ง€๋ฌธ. ๋‹จ, ์„œ๋ฒ„ API ์ธ์ฆ์„œ์˜ sha1 ์ง€๋ฌธ ํ™•์ธ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์ง€๋œ ๊ฒฝ์šฐ(์ธ์ฆ์„œ๋ฅผ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ), ํ•ด๋‹น ๋ฐฉ๋ฒ•์€ ์ˆ˜ํ‘œ_์ง€๋ฌธ ์ž๋™ ๋ชจ๋“œ์—์„œ ๋กœ์ปฌ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€/๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒ€์‚ฌ๋Š” APIClientArgs ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋‘ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ 127.0.0.1์— ์—ฐ๊ฒฐํ•  ๋•Œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ API ์„œ๋ฒ„ ์ž์ฒด์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ถŒ์žฅ๋จ). unsafe_auto_accept (์•ž๋ถ€๋ถ„์˜ "์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ •์˜"์—์„œ APIClientArgs์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.)

client_args = APIClientArgs(unsafe_auto_accept=True)

API ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ

ะฃ APIํด๋ผ์ด์–ธํŠธ API ์„œ๋ฒ„์—๋Š” ์ตœ๋Œ€ 3๊ฐœ์˜ ๋กœ๊ทธ์ธ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ์˜ ๊ฐ’์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋“œ(session-id), ํ—ค๋”์˜ ๊ฐ ํ›„์† API ํ˜ธ์ถœ์—์„œ ์ž๋™์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค(์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ—ค๋”์— ์žˆ๋Š” ์ด๋ฆ„์€ X-chkp-sid), ๋”ฐ๋ผ์„œ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋” ์ด์ƒ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ ๋ฐฉ๋ฒ•

๋กœ๊ทธ์ธ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜(์˜ˆ์ œ์—์„œ ์‚ฌ์šฉ์ž ์ด๋ฆ„ 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/๊ด€๋ฆฌ 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 ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•œ ํ˜ธ์ถœ์˜ ์˜ˆ: 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, ํŒจํ‚ค์ง€ ํ‘œ์‹œ. ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ 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 ํ˜ธ์ถœ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ

๊ทธ๋Ÿฐ ๋‹ค์Œ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ์‘๋‹ต(์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž ๋‚ด๋ถ€์™€ ์™ธ๋ถ€ ๋ชจ๋‘). ์ˆ˜์—…์—์„œ API ์‘๋‹ต 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๋กœ ์žฌ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ด€๋ฆฌ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ์ž‘์—…์ด ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์˜ˆ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์‹ญ์‹œ์˜ค. ํ•˜์ง€๋งŒ ์ด ์š”์ฒญ์„ ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค(์„ฑ๊ณต ๋ณ€์ˆ˜๋ฅผ ๋‹ค์Œ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค). ๊ฑฐ์ง“, 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)์™€ ์‘๋‹ต ๋ณธ๋ฌธ(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']}}

๋ฐ์ดํ„ฐ

๋ถˆํ•„์š”ํ•œ ์ •๋ณด ์—†์ด ์‘๋‹ต์˜ ๋ณธ๋ฌธ(๋ณธ๋ฌธ)๋งŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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 ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฒŒ์‹œ๋  ๋•Œ๊นŒ์ง€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

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 ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด ์ถ”๊ฐ€ ๋ฐฐ์น˜, 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 ํ˜ธ์ŠคํŠธ ๋ฐ ๋ฒ”์œ„๋„ ํฌํ•จ)๋ฅผ 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๋กœ ๊ฐ์ฒด ์‚ญ์ œ

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์—์„œ๋Š” ๋ฆฌ๋น„์ „์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ธฐ, ์Šค๋งˆํŠธ ํƒœ์Šคํฌ์™€ ๊ฐ™์€ "๊ธฐ๋Šฅ"์ด ๋“ฑ์žฅํ–ˆ๊ณ  ์ด์— ๋Œ€ํ•œ API ํ˜ธ์ถœ์ด ์ฆ‰์‹œ ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ ˆ๊ฑฐ์‹œ ์ฝ˜์†”์—์„œ ํ†ตํ•ฉ ์ •์ฑ… ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•  ๋•Œ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ๋„ API ์ง€์›์„ ์–ป์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค๋žซ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์˜จ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „ R80.40์˜ ์—…๋ฐ์ดํŠธ๋Š” HTTPS ๊ฒ€์‚ฌ ์ •์ฑ…์„ ๋ ˆ๊ฑฐ์‹œ ๋ชจ๋“œ์—์„œ ํ†ตํ•ฉ ์ •์ฑ… ๋ชจ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๊ณ  ์ด ๊ธฐ๋Šฅ์€ ์ฆ‰์‹œ API ํ˜ธ์ถœ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์—ฌ๋Ÿฌ ๊ตญ๊ฐ€์˜ ๋ฒ•๋ฅ ์— ๋”ฐ๋ผ ๊ฒ€์‚ฌ๊ฐ€ ๊ธˆ์ง€๋œ 3๊ฐœ ๋ฒ”์ฃผ(Health, Finance, Public Services)๋ฅผ ๊ฒ€์‚ฌ์—์„œ ์ œ์™ธํ•˜๋Š” 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 Management Server์—์„œ Python ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰

๋ชจ๋‘ ๊ฐ™์€ README.md ๊ด€๋ฆฌ ์„œ๋ฒ„์—์„œ ์ง์ ‘ Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ API ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์„ ๋•Œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์„ค์น˜๋ฅผ ๊ณ ๋ คํ•œ XNUMX๋ถ„์งœ๋ฆฌ ๋น„๋””์˜ค๋ฅผ ๋…นํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. CPAPI ์ œ์–ด ์„œ๋ฒ„์—์„œ Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„คํŠธ์›Œํฌ ๊ฐ์‚ฌ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์œ„ํ•ด ์ƒˆ ๊ฒŒ์ดํŠธ์›จ์ด ๊ตฌ์„ฑ์„ ์ž๋™ํ™”ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ ๊ฒ€. ๋‚ด๊ฐ€ ๋‹ค๋ฃจ์–ด์•ผ ํ•  ๊ธฐ๋Šฅ ์ค‘ : Python 2.7 ๋ฒ„์ „์—์„œ๋Š” ์•„์ง ๊ธฐ๋Šฅ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. raw_input. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋ฉฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. login_as_root, ๊ด€๋ฆฌ ์„œ๋ฒ„์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ IP ์ฃผ์†Œ๋ฅผ ๋‹ค์‹œ ์ง€์ •ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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","ะฟะฐั€ะพะปัŒ","ะŸะฐั€ะพะปัŒ","ะšะปัŽั‡","ะบะปัŽั‡","ัˆะธั„ั€","ะจะธั„ั€"] }

๊ฒฐ๋ก 

์ด ๊ธฐ์‚ฌ๋Š” ์ž‘์—…์˜ ์ฃผ์š” ๊ธฐ๋Šฅ๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ SDK ๋ฐ ๋ชจ๋“ˆ CPAPI(์ถ”์ธกํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋™์˜์–ด์ž…๋‹ˆ๋‹ค.) ์ด ๋ชจ๋“ˆ์˜ ์ฝ”๋“œ๋ฅผ ํ•™์Šตํ•˜๋ฉด ๋” ๋งŽ์€ ์ž‘์—… ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ํด๋ž˜์Šค, ํ•จ์ˆ˜, ๋ฉ”์„œ๋“œ ๋ฐ ๋ณ€์ˆ˜๋กœ ์ด๋ฅผ ๋ณด์™„ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์„น์…˜์—์„œ ์–ธ์ œ๋“ ์ง€ ์ž‘์—…์„ ๊ณต์œ ํ•˜๊ณ  Check Point์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œํ—ˆ๋ธŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ฒดํฌ๋ฉ”์ดํŠธ, ์ œํ’ˆ ๊ฐœ๋ฐœ์ž์™€ ์‚ฌ์šฉ์ž๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋๊นŒ์ง€ ์ฝ์–ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€