Python SDK ашиглан Check Point API-г хялбарчлах

Python SDK ашиглан Check Point API-г хялбарчлахAPI-тай харилцах бүрэн хүч нь програмын кодтой хамт ашиглагдаж, API хүсэлт болон API хариултуудад дүн шинжилгээ хийх хэрэгслийг динамикаар үүсгэх боломжтой болсон үед илэрдэг. Гэсэн хэдий ч энэ нь анзаарагдахгүй хэвээр байна Python програм хангамж хөгжүүлэх багц (цаашид Python SDK гэх) нь Check Point Management API, гэхдээ дэмий хоосон. Энэ нь хөгжүүлэгчид болон автоматжуулалт сонирхогчдын амьдралыг ихээхэн хялбаршуулдаг. Python сүүлийн үед асар их нэр хүндтэй болсон тул би цоорхойг нөхөж, үндсэн шинж чанаруудыг нь авч үзэхээр шийдсэн. Check Point API Python хөгжүүлэлтийн хэрэгсэл. Энэ нийтлэл нь Хабрегийн талаархи өөр нийтлэлд маш сайн нэмэлт болж өгдөг Check Point R80.10 API. CLI, скрипт болон бусад зүйлсээр дамжуулан удирдах. Бид Python SDK ашиглан скрипт хэрхэн бичихийг судалж, 1.6 хувилбарын (R80.40-аас эхлэн дэмжигддэг) удирдлагын API-ийн шинэ функцийг нарийвчлан авч үзэх болно. Өгүүллийг ойлгохын тулд танд API болон Python-той ажиллах үндсэн мэдлэг хэрэгтэй болно.

Check Point нь API-г идэвхтэй хөгжүүлж байгаа бөгөөд одоогоор дараахь зүйлийг гаргасан байна.

Python SDK нь одоогоор зөвхөн Удирдлагын API болон Gaia API. Бид энэ модулийн хамгийн чухал анги, арга, хувьсагчдыг авч үзэх болно.

Python SDK ашиглан Check Point API-г хялбарчлах

Модулийг суулгаж байна

Модуль cpapi -аас хурдан бөгөөд хялбар суулгана github дээрх албан ёсны Check Point репозитор тусламжтайгаар PIP. Суурилуулалтын нарийвчилсан зааврыг эндээс авах боломжтой README.md. Энэ модуль нь Python 2.7 ба 3.7 хувилбаруудтай ажиллахад тохирсон. Энэ нийтлэлд жишээг Python 3.7 ашиглан өгөх болно. Гэсэн хэдий ч Python SDK-г Шалгах цэгийн удирдлагын серверээс (Ухаалаг удирдлага) шууд ажиллуулж болох боловч тэдгээр нь зөвхөн Python 2.7-г дэмждэг тул сүүлийн хэсэгт 2.7 хувилбарын кодыг өгөх болно. Модулийг суулгасны дараа би лавлах дээрх жишээг үзэхийг зөвлөж байна жишээ_питон2 и жишээ_питон3.

Эхлэл

Бид cpapi модулийн бүрэлдэхүүн хэсгүүдтэй ажиллах боломжтой байхын тулд модулиас импортлох хэрэгтэй. cpapi дор хаяж хоёр шаардлагатай анги:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Класс APIClientArgs API сервер болон ангиллын холболтын параметрүүдийг хариуцдаг APIClient 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 болон контекст менежерээр холбогдож байна

Класс APIClient Үүнийг ашиглах хамгийн тохиромжтой арга бол контекст менежерээр дамжуулан ашиглах явдал юм. 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)

Цаашид хичээл орохыг анхаарна уу APIClient API дуудлага бүрийг шалгах болно (арга api_call и api_query, бид тэдгээрийн талаар бага зэрэг ярих болно) API сервер дээрх sha1 хурууны хээний гэрчилгээ. Гэхдээ API серверийн сертификатын sha1 хурууны хээг шалгах үед алдаа илэрсэн (сертификат нь тодорхойгүй эсвэл өөрчлөгдсөн) бол арга хурууны хээг шалгах локал машин дээр энэ талаарх мэдээллийг автоматаар нэмэх/өөрчлөх боломжийг олгоно. APIClientArgs аргументыг ашиглан энэ шалгалтыг бүрэн идэвхгүй болгож болно (гэхдээ скриптүүдийг API сервер дээр өөрөө ажиллуулж, 127.0.0.1-д холбогдох үед л санал болгож болно) - аюултай_автоматаар_зөвшөөрөх ("Холболтын параметрүүдийг тодорхойлох" хэсгээс APIClientArgs-ийн талаар дэлгэрэнгүй үзнэ үү).

client_args = APIClientArgs(unsafe_auto_accept=True)

API сервер рүү нэвтэрнэ үү

У APIClient API серверт нэвтрэх гурван арга байдаг бөгөөд тус бүр нь утгыг нь ойлгодог sid(session-id), энэ нь толгой хэсэгт дараагийн API дуудлага бүрт автоматаар ашиглагддаг (энэ параметрийн толгой хэсэгт байгаа нэр нь X-chkp-sid), тиймээс энэ параметрийг цаашид боловсруулах шаардлагагүй болно.

нэвтрэх арга

Нэвтрэх болон нууц үг ашиглах сонголт (жишээлбэл, хэрэглэгчийн нэр админ болон нууц үг 1q2w3e нь байрлалын аргумент болгон дамжуулагдсан болно):

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

Нэмэлт нэмэлт параметрүүдийг нэвтрэх аргад ашиглах боломжтой; энд тэдний нэр болон үндсэн утгууд байна:

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

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_query. Тэдний хооронд ямар ялгаа байгааг олж мэдье.

api_call

Энэ аргыг ямар ч дуудлагад ашиглах боломжтой. Шаардлагатай бол хүсэлтийн биет дэх api дуудлагын сүүлчийн хэсгийг дамжуулах шаардлагатай. Хэрэв ачаалал хоосон бол түүнийг огт дамжуулах боломжгүй.

api_versions = client.api_call('show-api-versions') 

Зүсэлтийн доор энэ хүсэлтийн гаралт:

In [23]: api_versions                                                           
Out[23]: 
APIResponse({
    "data": {
        "current-version": "1.6",
        "supported-versions": [
            "1",
            "1.1",
            "1.2",
            "1.3",
            "1.4",
            "1.5",
            "1.6"
        ]
    },
    "res_obj": {
        "data": {
            "current-version": "1.6",
            "supported-versions": [
                "1",
                "1.1",
                "1.2",
                "1.3",
                "1.4",
                "1.5",
                "1.6"
            ]
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})
show_host = client.api_call('show-host', {'name' : 'h_8.8.8.8'})

Зүсэлтийн доор энэ хүсэлтийн гаралт:

In [25]: show_host                                                              
Out[25]: 
APIResponse({
    "data": {
        "color": "black",
        "comments": "",
        "domain": {
            "domain-type": "domain",
            "name": "SMC User",
            "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
        },
        "groups": [],
        "icon": "Objects/host",
        "interfaces": [],
        "ipv4-address": "8.8.8.8",
        "meta-info": {
            "creation-time": {
                "iso-8601": "2020-05-01T21:49+0300",
                "posix": 1588358973517
            },
            "creator": "admin",
            "last-modifier": "admin",
            "last-modify-time": {
                "iso-8601": "2020-05-01T21:49+0300",
                "posix": 1588358973517
            },
            "lock": "unlocked",
            "validation-state": "ok"
        },
        "name": "h_8.8.8.8",
        "nat-settings": {
            "auto-rule": false
        },
        "read-only": false,
        "tags": [],
        "type": "host",
        "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
    },
    "res_obj": {
        "data": {
            "color": "black",
            "comments": "",
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "groups": [],
            "icon": "Objects/host",
            "interfaces": [],
            "ipv4-address": "8.8.8.8",
            "meta-info": {
                "creation-time": {
                    "iso-8601": "2020-05-01T21:49+0300",
                    "posix": 1588358973517
                },
                "creator": "admin",
                "last-modifier": "admin",
                "last-modify-time": {
                    "iso-8601": "2020-05-01T21:49+0300",
                    "posix": 1588358973517
                },
                "lock": "unlocked",
                "validation-state": "ok"
            },
            "name": "h_8.8.8.8",
            "nat-settings": {
                "auto-rule": false
            },
            "read-only": false,
            "tags": [],
            "type": "host",
            "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

api_query

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

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

Зүсэлтийн доор энэ хүсэлтийн гаралт:

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

API дуудлагын үр дүнг боловсруулж байна

Үүний дараа та ангийн хувьсагч, аргуудыг ашиглаж болно APIResponse(контекст менежер дотор болон гадна талд). Анги дээр APIResponse 4 арга, 5 хувьсагчийг урьдчилан тодорхойлсон бөгөөд бид хамгийн чухал зүйл дээр илүү дэлгэрэнгүй ярих болно.

Python SDK ашиглан Check Point API-г хялбарчлах

амжилт

Эхлээд API дуудлага амжилттай болж, үр дүнд хүрсэн эсэхийг шалгах нь зүйтэй юм. Үүнд зориулсан арга бий амжилт:

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

Хэрэв API дуудлага амжилттай болсон бол Үнэн (хариултын код - 200), амжилтгүй бол Худал (бусад хариу код) буцаана. Хариултын кодоос хамааран өөр өөр мэдээллийг харуулахын тулд 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.

амжилтын_төлөв

Энэ тохиолдолд амжилтын статусын утгыг өөрчлөх шаардлагатай байж магадгүй юм. Техникийн хувьд та тэнд юу ч хийж болно, тэр ч байтугай ердийн мөр хүртэл. Гэхдээ бодит жишээ бол тодорхой дагалдах нөхцлөөр энэ параметрийг худал болгож дахин тохируулах явдал юм. Удирдлагын сервер дээр даалгавар ажиллаж байгаа жишээн дээр анхаарлаа хандуулаарай, гэхдээ бид энэ хүсэлтийг амжилтгүй гэж үзэх болно (бид амжилтын хувьсагчийг дараах байдлаар тохируулах болно. хуурамч, 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

хариу ()

Хариулах арга нь хариултын код (статус_код) болон хариултын хэсэг (бие) бүхий толь бичгийг үзэх боломжийг танд олгоно.

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 1.6-д нэмсэн API дуудлагуудыг ашигладаг жишээнүүдийг доор харуулав.

Эхлээд дуудлага хэрхэн ажилладагийг харцгаая нэмэлт хост и хаягийн муж нэмэх. Бид 192.168.0.0/24 дэд сүлжээний бүх IP хаягийг, сүүлийн октет нь 5-ыг хост төрлийн объект болгон үүсгэж, бусад бүх IP хаягийг хаягийн хүрээний төрлийн объект болгон бичих хэрэгтэй гэж бодъё. Энэ тохиолдолд дэд сүлжээний хаяг болон өргөн нэвтрүүлгийн хаягийг хас.

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

Нэмэлт хост болон нэмэх хаягийн мужийг ашиглан скрипт бичих

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

first_ip = 1
last_ip = 4

client_args = APIClientArgs(server="192.168.47.240")

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     for ip in range(5,255,5):
         add_host = client.api_call("add-host", {"name" : f"h_192.168.0.{ip}", "ip-address": f'192.168.0.{ip}'})
     while last_ip < 255:
         add_range = client.api_call("add-address-range", {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"})
         first_ip+=5
         last_ip+=5
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

Миний лабораторийн орчинд удирдлагын серверийн ачааллаас хамааран энэ скриптийг гүйцэтгэхэд 30-50 секунд зарцуулдаг.

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

Add-objects-batch ашиглан скрипт бичих

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}', "ip-address": f'192.168.0.{ip}'}
    objects_list_ip.append(data)
    
first_ip = 1
last_ip = 4


while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

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


with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_objects_batch = client.api_call("add-objects-batch", data_for_batch)
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

Энэ скриптийг миний лабораторийн орчинд ажиллуулахад удирдлагын серверийн ачааллаас хамааран 3-7 секунд зарцуулдаг. Энэ нь дунджаар 101 API объект дээр багц төрлийн дуудлага 10 дахин хурдан ажилладаг. Илүү олон тооны объектын ялгаа нь илүү гайхалтай байх болно.

Одоо яаж ажиллахаа харцгаая багц-объект-багц. Энэхүү API дуудлагыг ашигласнаар бид дурын параметрийг бөөнөөр нь өөрчлөх боломжтой. Өмнөх жишээн дэх хаягуудын эхний хагасыг (.124 хүртэлх хост, мөн хүрээ) сиенна өнгөт тохируулж, хаягуудын хоёрдугаар хагаст 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-д "Revert to Review", "Smart Task" зэрэг "онцлогууд" гарч ирсэн бөгөөд тэдгээрт тохирох API дуудлагуудыг нэн даруй бэлтгэсэн. Нэмж дурдахад, хуучин консолуудаас нэгдсэн бодлогын горимд шилжих үед бүх функцууд API-ийн дэмжлэгийг авдаг. Жишээлбэл, програм хангамжийн R80.40 хувилбарын удаан хүлээгдэж буй шинэчлэлт нь HTTPS шалгалтын бодлогыг хуучин горимоос нэгдсэн бодлогын горимд шилжүүлсэн бөгөөд энэ функц нь API дуудлагыг шууд хүлээн авсан. Хэд хэдэн улс оронд хууль тогтоомжийн дагуу шалгалт хийхийг хориглодог 3 ангиллыг (Эрүүл мэнд, Санхүү, Төрийн үйлчилгээ) шалгалтаас хассан HTTPS Хяналтын бодлогын дээд байрлалд дүрэм нэмсэн кодын жишээ энд байна.

HTTPS шалгалтын бодлогод дүрэм нэмнэ үү

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

data = {
  "layer" : "Default Layer",
  "position" : "top",
  "name" : "Legal Requirements",
  "action": "bypass",
  "site-category": ["Health", "Government / Military", "Financial Services"]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_https_rule = client.api_call("add-https-rule", data)
     publish = client.api_call("publish")

Check Point удирдлагын сервер дээр Python скриптүүдийг ажиллуулж байна

Бүх зүйл адилхан README.md Python скриптүүдийг удирдлагын серверээс шууд хэрхэн ажиллуулах талаарх мэдээллийг агуулсан. Та өөр машинаас API серверт холбогдох боломжгүй үед энэ нь тохиромжтой байж болно. Би модулийг суулгаж буй зургаан минутын видео бичлэг хийсэн cpapi хяналтын сервер дээр Python скриптүүдийг ажиллуулах онцлогууд. Жишээлбэл, сүлжээний аудит гэх мэт ажилд зориулж шинэ гарцын тохиргоог автоматжуулах скриптийг ажиллуулж байна. Аюулгүй байдлын шалгалт. Миний шийдэх ёстой шинж чанаруудын дунд: функц нь Python 2.7 дээр хараахан гарч ирээгүй байна оруулах, ингэснээр хэрэглэгчийн оруулсан мэдээллийг боловсруулахын тулд функцийг ашигладаг түүхий_оролт. Үгүй бол код нь бусад машинаас эхлүүлэхтэй адил бөгөөд зөвхөн функцийг ашиглахад илүү тохиромжтой root_ap_login, ингэснээр дахин өөрийн хэрэглэгчийн нэр, нууц үг, удирдлагын серверийн 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()

Нэмэлт_pass.conf нууц үгийн толь бичиг бүхий жишээ файл
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

дүгнэлт

Энэ нийтлэлд зөвхөн ажлын үндсэн боломжуудыг авч үзэх болно Питон SDK болон модуль cpapi(Таны таамаглаж байсанчлан эдгээр нь яг ижил утгатай) бөгөөд энэ модулийн кодыг судалснаар та түүнтэй ажиллах илүү олон боломжуудыг олж мэдэх болно. Та үүнийг өөрийн анги, функц, арга, хувьсагчаар нэмэхийг хүсч магадгүй юм. Та энэ хэсэгт үргэлж ажлаа хуваалцаж, Check Point-ын бусад скриптүүдийг үзэх боломжтой CodeHub нийгэмд CheckMates, энэ нь бүтээгдэхүүн хөгжүүлэгчид болон хэрэглэгчдийг нэгтгэдэг.

Аз жаргалтай код, дуустал уншсанд баярлалаа!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх