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

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

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

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

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

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

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

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

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

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

from cpapi import APIClient, APIClientArgs

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

์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค

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

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 ์ฟผ๋ฆฌ(์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค) API ์„œ๋ฒ„ ์ธ์ฆ์„œ์˜ sha1 ์ง€๋ฌธ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ API ์„œ๋ฒ„ ์ธ์ฆ์„œ์˜ sha1 ์ง€๋ฌธ์„ ํ™•์ธํ•˜๋Š” ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๊ฐ์ง€๋˜๋ฉด(์ธ์ฆ์„œ๋ฅผ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ), ์ด ๋ฐฉ๋ฒ•์€ ์ง€๋ฌธ ํ™•์ธ ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€/๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํ™•์ธ ๊ธฐ๋Šฅ์€ APIClientArgs ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํžˆ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹จ, 127.0.0.1์— ์—ฐ๊ฒฐํ•  ๋•Œ API ์„œ๋ฒ„ ์ž์ฒด์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ถŒ์žฅ). ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž๋™ ์ˆ˜๋ฝ (APIClientArgs์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•ž๋ถ€๋ถ„์˜ "์—ฐ๊ฒฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ •์˜"๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.)

client_args = APIClientArgs(unsafe_auto_accept=True)

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

ะฃ APIํด๋ผ์ด์–ธํŠธ API ์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ตœ๋Œ€ 3๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ ๋ฐฉ๋ฒ•์€ ๊ฐ’์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์‹œ๋“œ(์„ธ์…˜ 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/Management API v1.6๋ถ€ํ„ฐ ์ง€์›๋จ) "3TsbPJ8ZKjaJGvFyoFqHFA==" ์ด๋Š” API ํ‚ค ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๋ฆฌ ์„œ๋ฒ„์˜ ์‚ฌ์šฉ์ž ์ค‘ ํ•œ ๋ช…์— ๋Œ€ํ•œ API ํ‚ค ๊ฐ’์ž…๋‹ˆ๋‹ค.)

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

๋ฐฉ๋ฒ•์—์„œ API ํ‚ค๋กœ ๋กœ๊ทธ์ธ ๋ฉ”์„œ๋“œ์—์„œ์™€ ๋™์ผํ•œ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ.

login_as_root ๋ฉ”์„œ๋“œ

API ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•˜๊ธฐ ์œ„ํ•œ ์˜ต์…˜:

     login = client.login_as_root()

์ด ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€ ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

domain=None, payload=None

๋งˆ์ง€๋ง‰์œผ๋กœ API๋Š” ์ž์‹ ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

API ํ˜ธ์ถœ์„ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. api_call ะธ API ์ฟผ๋ฆฌ. ๋‘˜์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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 ์ฟผ๋ฆฌ

์ด ๋ฉ”์„œ๋“œ๋Š” ์ถœ๋ ฅ์— ์˜คํ”„์…‹์ด ๊ฐ€์ •๋˜๋Š” ํ˜ธ์ถœ์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์„ ๋ฏธ๋ฆฌ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถœ๋ ฅ์€ ๋งŽ์€ ์–‘์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ด€๋ฆฌ ์„œ๋ฒ„์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ํ˜ธ์ŠคํŠธ ์œ ํ˜• ๊ฐ์ฒด ๋ชฉ๋ก์„ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์ฒญ์˜ ๊ฒฝ์šฐ 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, show-packages์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ API ํ˜ธ์ถœ์˜ ์ด๋ฆ„์—๋Š” ๋ณต์ˆ˜ํ˜• ๋‹จ์–ด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ํ˜ธ์ถœ์€ ๋‹ค์Œ์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. API ์ฟผ๋ฆฌ

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.

์„ฑ๊ณต_์ƒํƒœ_์„ค์ •

์ด ๊ฒฝ์šฐ ์„ฑ๊ณต ์ƒํƒœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ์ผ๋ฐ˜ ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜์—ฌ ๋ฌด์—‡์ด๋“  ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ ์˜ˆ์‹œ๋กœ๋Š” ํŠน์ • ์กฐ๊ฑด์—์„œ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ False๋กœ ์žฌ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ด€๋ฆฌ ์„œ๋ฒ„์—์„œ ์ž‘์—…์ด ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ ์ด ์š”์ฒญ์ด ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(success ๋ณ€์ˆ˜๋ฅผ ๊ฑฐ์ง“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๋ฐฐ ๋” ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๊ฐ์ฒด์—์„œ๋Š” ๊ทธ ์ฐจ์ด๊ฐ€ ๋”์šฑ ๋‘๋“œ๋Ÿฌ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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 ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์„ ๋•Œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์„ค์น˜ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” 6๋ถ„ ๋ถ„๋Ÿ‰์˜ ์˜์ƒ์„ ๋…นํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. cpapi ๊ด€๋ฆฌ ์„œ๋ฒ„์—์„œ Python ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„คํŠธ์›Œํฌ ๊ฐ์‚ฌ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์œ„ํ•ด ์ƒˆ ๊ฒŒ์ดํŠธ์›จ์ด ๊ตฌ์„ฑ์„ ์ž๋™ํ™”ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ ๊ฒ€. ๋‚ด๊ฐ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ๋˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜: Python 2.7์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„์ง ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ๋”ฐ๋ผ์„œ ์ด ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์›์‹œ ์ž…๋ ฅ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋ฉฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ๋กœ ๋กœ๊ทธ์ธ, ๋‹ค์‹œ ์ œ์–ด ์„œ๋ฒ„์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ, 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

DDoS ๋ณดํ˜ธ, VPS VDS ์„œ๋ฒ„๊ฐ€ ์žˆ๋Š” ์‚ฌ์ดํŠธ๋ฅผ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ํ˜ธ์ŠคํŒ… ๊ตฌ์ž… ๐Ÿ”ฅ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ์•ˆ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…, VPS ๋ฐ VDS ์„œ๋ฒ„๋ฅผ ๊ตฌ๋งคํ•˜์„ธ์š” | ProHoster