ساده سازی Check Point API با Python SDK

ساده سازی Check Point API با Python SDKقدرت کامل تعامل با API ها زمانی آشکار می شود که همراه با کد برنامه استفاده شود، زمانی که تولید پویا درخواست های API و ابزارهایی برای تجزیه و تحلیل پاسخ های API ممکن می شود. با این حال، هنوز هم غیر قابل توجه است کیت توسعه نرم افزار پایتون (از این پس Python SDK نامیده می شود) برای بررسی Point Management API، اما بیهوده. این به طور قابل توجهی زندگی توسعه دهندگان و علاقه مندان به اتوماسیون را ساده می کند. Python اخیراً محبوبیت زیادی پیدا کرده است و من تصمیم گرفتم این شکاف را پر کنم و ویژگی های اصلی را بررسی کنم. Check Point API Python Development Kit. این مقاله به عنوان افزودنی عالی برای مقاله دیگری در Habré است Point R80.10 API را بررسی کنید. مدیریت از طریق CLI، اسکریپت ها و موارد دیگر. ما به نحوه نوشتن اسکریپت ها با استفاده از Python SDK نگاه خواهیم کرد و نگاهی دقیق تر به عملکرد مدیریت API جدید در نسخه 1.6 خواهیم داشت (از R80.40 پشتیبانی می شود). برای درک مقاله، به دانش اولیه کار با API و پایتون نیاز دارید.

Check Point به طور فعال در حال توسعه API است و در حال حاضر موارد زیر منتشر شده است:

Python SDK در حال حاضر فقط از تعامل با مدیریت API و Gaia API. ما در این ماژول به مهم ترین کلاس ها، متدها و متغیرها خواهیم پرداخت.

ساده سازی Check Point API با Python SDK

نصب ماژول

مدول cpapi نصب سریع و آسان از مخزن رسمی Check Point در github با کمک شکستن. دستورالعمل نصب دقیق در دسترس است README.md. این ماژول برای کار با پایتون نسخه های 2.7 و 3.7 سازگار شده است. در این مقاله با استفاده از Python 3.7 مثال هایی ارائه می شود. با این حال، Python SDK را می توان مستقیماً از سرور Check Point Management (مدیریت هوشمند) اجرا کرد، اما آنها فقط از Python 2.7 پشتیبانی می کنند، بنابراین بخش آخر کد نسخه 2.7 را ارائه می دهد. بلافاصله پس از نصب ماژول، توصیه می کنم به نمونه های موجود در دایرکتوری ها نگاه کنید examples_python2 и examples_python3.

شروع

برای اینکه بتوانیم با اجزای ماژول cpapi کار کنیم، باید از ماژول وارد کنیم cpapi حداقل دو کلاس مورد نیاز:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

کلاس APIClientArgs مسئول پارامترهای اتصال به سرور API و کلاس است APIClient مسئول تعامل با API است.

تعیین پارامترهای اتصال

برای تعریف پارامترهای مختلف برای اتصال به API، باید یک نمونه از کلاس ایجاد کنید APIClientArgs. اصولاً پارامترهای آن از پیش تعریف شده است و هنگام اجرای اسکریپت در سرور کنترل نیازی به تعیین آنها نیست.

client_args = APIClientArgs()

اما هنگام اجرا بر روی هاست شخص ثالث، باید حداقل آدرس IP یا نام میزبان سرور API (همچنین به عنوان سرور مدیریت شناخته می شود) را مشخص کنید. در مثال زیر، پارامتر اتصال سرور را تعریف کرده و آدرس IP سرور مدیریت را به عنوان یک رشته به آن اختصاص می دهیم.

client_args = APIClientArgs(server='192.168.47.241')

بیایید به تمام پارامترها و مقادیر پیش فرض آنها که می توان در هنگام اتصال به سرور API استفاده کرد نگاه کنیم:

آرگومان های متد __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:

مدیر زمینه به طور خودکار با سرور API تماس ورود برقرار نمی کند، اما هنگام خروج از آن یک تماس خروج برقرار می کند. اگر به دلایلی پس از پایان کار با تماس‌های API نیازی به خروج از سیستم نیست، باید بدون استفاده از مدیر زمینه شروع به کار کنید:

client = APIClient(clieng_args)

بررسی اتصال

ساده ترین راه برای بررسی اینکه آیا اتصال با پارامترهای مشخص شده مطابقت دارد یا خیر، استفاده از روش است چک_اثرانگشت. اگر تأیید مجموع هش sha1 برای اثر انگشت گواهی API سرور ناموفق باشد (روش برگردانده شده است غلط، معمولاً به دلیل مشکلات اتصال ایجاد می شود و می توانیم اجرای برنامه را متوقف کنیم (یا به کاربر این فرصت را بدهیم که داده های اتصال را اصلاح کند):

    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 در سرور API. اما اگر هنگام بررسی اثر انگشت sha1 گواهی سرور API، خطایی تشخیص داده شود (گواهینامه ناشناخته است یا تغییر کرده است)، روش چک_اثرانگشت این فرصت را برای افزودن/تغییر اطلاعات در مورد آن در ماشین محلی به طور خودکار فراهم می کند. این بررسی را می توان به طور کامل غیرفعال کرد (اما این فقط در صورتی توصیه می شود که اسکریپت ها روی خود سرور API اجرا شوند، هنگام اتصال به 127.0.0.1)، با استفاده از آرگومان APIClientArgs - unsafe_auto_accept (درباره APIClientArgs در قسمت «تعریف پارامترهای اتصال» بیشتر ببینید).

client_args = APIClientArgs(unsafe_auto_accept=True)

وارد سرور API شوید

У APIClient 3 روش برای ورود به سرور API وجود دارد و هر یک از آنها معنی را درک می کند ضوابط و زمان اخذ رتبه علمی پژوهشی(sesion-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==') 

در روش 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 و 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

اجازه دهید فوراً رزرو کنم که این روش فقط برای تماس هایی که خروجی آنها شامل افست است قابل اجرا است. چنین استنباط زمانی رخ می دهد که حاوی یا ممکن است حاوی مقدار زیادی اطلاعات باشد. به عنوان مثال، این می تواند یک درخواست برای لیستی از تمام اشیاء میزبان ایجاد شده در سرور مدیریت باشد. برای چنین درخواست هایی، API لیستی از 50 شی را به طور پیش فرض برمی گرداند (شما می توانید محدودیت را به 500 شی در پاسخ افزایش دهید). و برای اینکه اطلاعات چندین بار کشیده نشود، با تغییر پارامتر offset در درخواست API، یک متد api_query وجود دارد که این کار را به صورت خودکار انجام می دهد. نمونه هایی از تماس هایی که در آنها به این روش نیاز است: جلسات نمایش، میزبانان نمایش، شبکه‌های نمایش، کارت‌های عام نمایش، گروه‌های نمایشی، محدوده‌های نشانی نمایش، دروازه‌های ساده، خوشه‌های نمایش ساده، نقش‌های دسترسی به نمایش، مشتریان مورد اعتماد، بسته های نمایشی. در واقع، ما در نام این تماس‌های API کلمات جمع می‌بینیم، بنابراین رسیدگی به این تماس‌ها آسان‌تر خواهد بود. api_query

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

خروجی این درخواست در زیر برش:

In [21]: show_hosts                                                             
Out[21]: 
APIResponse({
    "data": [
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "ipv4-address": "192.168.47.1",
            "name": "h_192.168.47.1",
            "type": "host",
            "uid": "5d7d7086-d70b-4995-971a-0583b15a2bfc"
        },
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "ipv4-address": "8.8.8.8",
            "name": "h_8.8.8.8",
            "type": "host",
            "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
        }
    ],
    "res_obj": {
        "data": {
            "from": 1,
            "objects": [
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "192.168.47.1",
                    "name": "h_192.168.47.1",
                    "type": "host",
                    "uid": "5d7d7086-d70b-4995-971a-0583b15a2bfc"
                },
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "8.8.8.8",
                    "name": "h_8.8.8.8",
                    "type": "host",
                    "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
                }
            ],
            "to": 2,
            "total": 2
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

پردازش نتایج تماس های API

پس از این می توانید از متغیرها و متدهای کلاس استفاده کنید APIRresponse(هم در داخل مدیر زمینه و هم در خارج). سر کلاس APIRresponse 4 روش و 5 متغیر از پیش تعریف شده است که در ادامه به مهمترین آنها خواهیم پرداخت.

ساده سازی Check Point API با Python SDK

موفقیت

برای شروع، بهتر است مطمئن شوید که فراخوانی API موفقیت آمیز بوده و به نتیجه رسیده است. روشی برای این کار وجود دارد موفقیت:

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

در صورت موفقیت آمیز بودن تماس API (کد پاسخ - 200) True و در صورت عدم موفقیت نادرست (هر کد پاسخ دیگری) را برمی گرداند. استفاده از آن بلافاصله پس از تماس 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'

مثال های مفید

موارد زیر نمونه‌هایی هستند که از تماس‌های API استفاده می‌کنند که در مدیریت API 1.6 اضافه شده‌اند.

ابتدا، بیایید نحوه عملکرد تماس ها را بررسی کنیم افزودن میزبان и افزودن آدرس-محدوده. فرض کنید باید تمام آدرس‌های IP زیرشبکه 192.168.0.0/24 را که آخرین اکتت آن 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 قرار دهیم و رنگ خاکی را به نیمه دوم آدرس‌ها اختصاص دهیم.

تغییر رنگ اشیاء ایجاد شده در مثال قبلی

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip_first = []
objects_list_range_first = []
objects_list_ip_second = []
objects_list_range_second = []

for ip in range(5,125,5):
    data = {"name": f'h_192.168.0.{ip}', "color": "sienna"}
    objects_list_ip_first.append(data)
    
for ip in range(125,255,5):
    data = {"name": f'h_192.168.0.{ip}', "color": "khaki"}
    objects_list_ip_second.append(data)
    
first_ip = 1
last_ip = 4
while last_ip < 125:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "color": "sienna"}
    objects_list_range_first.append(data)
    first_ip+=5
    last_ip+=5
    
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "color": "khaki"}
    objects_list_range_second.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch_first  = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip_first
}, {
    "type" : "address-range",
    "list" : objects_list_range_first
  }]
}

data_for_batch_second  = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip_second
}, {
    "type" : "address-range",
    "list" : objects_list_range_second
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') 
     set_objects_batch_first = client.api_call("set-objects-batch", data_for_batch_first)
     set_objects_batch_second = client.api_call("set-objects-batch", data_for_batch_second)
     publish = client.api_call("publish")

می توانید چندین شی را در یک تماس API با استفاده از آن حذف کنید حذف - اشیاء - دسته. حالا بیایید به مثال کدی نگاه کنیم که همه هاست های ایجاد شده قبلی از طریق حذف می کند افزودن-اشیاء-گروهی.

حذف اشیا با استفاده از delete-objects-batch

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}'}
    objects_list_ip.append(data)

first_ip = 1
last_ip = 4
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip
}, {
    "type" : "address-range",
    "list" : objects_list_range
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     delete_objects_batch = client.api_call("delete-objects-batch", data_for_batch)
     publish = client.api_call("publish")

print(delete_objects_batch.data)

همه عملکردهایی که در نسخه‌های جدید نرم‌افزار Check Point ظاهر می‌شوند، بلافاصله تماس‌های API را دریافت می‌کنند. بنابراین، در R80.40 "ویژگی هایی" مانند Revert to Revision و Smart Task ظاهر شد و تماس های API مربوطه بلافاصله برای آنها آماده شد. علاوه بر این، تمام عملکردها هنگام انتقال از کنسول های Legacy به حالت Unified Policy نیز از API پشتیبانی می کنند. به عنوان مثال، به‌روزرسانی مورد انتظار در نسخه نرم‌افزار R80.40 انتقال سیاست بازرسی HTTPS از حالت Legacy به حالت Unified Policy بود و این عملکرد بلافاصله تماس‌های 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

همه چیز یکسان است README.md حاوی اطلاعاتی در مورد نحوه اجرای اسکریپت های پایتون به طور مستقیم از سرور کنترل است. هنگامی که نمی توانید از دستگاه دیگری به سرور API متصل شوید، این می تواند راحت باشد. من یک ویدیوی شش دقیقه ای ضبط کردم که در آن به نصب ماژول نگاه می کنم cpapi و ویژگی های اجرای اسکریپت های پایتون بر روی سرور کنترل. به عنوان مثال، یک اسکریپت اجرا می شود که پیکربندی یک دروازه جدید را برای کاری مانند حسابرسی شبکه به طور خودکار انجام می دهد. بررسی امنیتی. از جمله ویژگی هایی که باید با آن سر و کار داشتم: این تابع هنوز در پایتون 2.7 ظاهر نشده است ورودی، بنابراین برای پردازش اطلاعاتی که کاربر وارد می کند، از یک تابع استفاده می شود ورودی خام. در غیر این صورت، کد مانند راه اندازی از سایر ماشین ها است، فقط استفاده از عملکرد راحت تر است login_as_root، تا دوباره نام کاربری، رمز عبور و آدرس IP سرور مدیریت خود را مشخص نکنید.

اسکریپت برای راه اندازی سریع بررسی امنیتی

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

یک فایل نمونه با فرهنگ لغت کلمه عبور add-pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

نتیجه

این مقاله تنها به بررسی امکانات اولیه کار می پردازد پایتون SDK و ماژول cpapi(همانطور که ممکن است حدس زده باشید، اینها در واقع مترادف هستند)، و با مطالعه کد موجود در این ماژول، احتمالات بیشتری را برای کار با آن کشف خواهید کرد. این امکان وجود دارد که بخواهید آن را با کلاس ها، توابع، متدها و متغیرهای خود تکمیل کنید. همیشه می توانید کار خود را به اشتراک بگذارید و اسکریپت های دیگر را برای Check Point در بخش مشاهده کنید کد هاب در جامعه CheckMates، که هم توسعه دهندگان محصول و هم کاربران را گرد هم می آورد.

کد نویسی مبارک و ممنون که تا آخر خواندید!

منبع: www.habr.com

اضافه کردن نظر