Python SDK yordamida Check Point API-ni soddalashtirish

Python SDK yordamida Check Point API-ni soddalashtirishAPI bilan o'zaro aloqaning to'liq kuchi dastur kodi bilan birgalikda ishlatilganda, API so'rovlarini va API javoblarini tahlil qilish vositalarini dinamik ravishda yaratish mumkin bo'lganda namoyon bo'ladi. Biroq, u hali ham sezilmaydigan bo'lib qolmoqda Python dasturiy ta'minot ishlab chiqish to'plami (keyingi o'rinlarda Python SDK deb yuritiladi) uchun Check Point Management API, lekin behuda. Bu ishlab chiquvchilar va avtomatlashtirish ixlosmandlarining hayotini sezilarli darajada osonlashtiradi. Python so'nggi paytlarda juda mashhur bo'ldi va men bo'shliqni to'ldirishga va asosiy xususiyatlarni ko'rib chiqishga qaror qildim. Check Point API Python Development Kit. Ushbu maqola Habré haqidagi boshqa maqolaga ajoyib qo'shimcha bo'lib xizmat qiladi Check Point R80.10 API. CLI, skriptlar va boshqalar orqali boshqarish. Biz Python SDK yordamida skriptlarni qanday yozishni ko‘rib chiqamiz va 1.6 versiyadagi yangi Management API funksiyasini (R80.40 dan boshlab qo‘llab-quvvatlanadi) batafsil ko‘rib chiqamiz. Maqolani tushunish uchun sizga API va Python bilan ishlash bo'yicha asosiy bilim kerak bo'ladi.

Check Point API-ni faol ravishda ishlab chiqmoqda va hozirda quyidagilar chiqarildi:

Python SDK hozirda faqat Management API bilan o'zaro aloqani qo'llab-quvvatlaydi va Gaia API. Biz ushbu modulda eng muhim sinflar, usullar va o'zgaruvchilarni ko'rib chiqamiz.

Python SDK yordamida Check Point API-ni soddalashtirish

Modulni o'rnatish

Modul cpapi dan tez va oson o'rnatiladi github-dagi rasmiy Check Point ombori yordamida pip. O'rnatish bo'yicha batafsil ko'rsatmalar mavjud README.md. Ushbu modul Python 2.7 va 3.7 versiyalari bilan ishlashga moslashtirilgan. Ushbu maqolada Python 3.7 yordamida misollar keltiriladi. Biroq, Python SDK to'g'ridan-to'g'ri Check Point Management Server (Smart Management) dan ishga tushirilishi mumkin, lekin ular faqat Python 2.7 ni qo'llab-quvvatlaydi, shuning uchun oxirgi bo'lim 2.7 versiyasi uchun kodni taqdim etadi. Modulni o'rnatgandan so'ng darhol kataloglardagi misollarni ko'rib chiqishni maslahat beraman misollar_python2 и misollar_python3.

Ishga kirishish

Biz cpapi modulining komponentlari bilan ishlashimiz uchun moduldan import qilishimiz kerak. cpapi kamida ikkita talab qilinadigan sinflar:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

sinf APIClientArgs API serveriga ulanish parametrlari va sinf uchun javobgardir APIClient API bilan o'zaro aloqa uchun javobgardir.

Ulanish parametrlarini aniqlash

API ga ulanish uchun turli parametrlarni aniqlash uchun siz sinfning namunasini yaratishingiz kerak APIClientArgs. Asosan, uning parametrlari oldindan belgilangan va boshqaruv serverida skriptni ishga tushirishda ularni ko'rsatish shart emas.

client_args = APIClientArgs()

Ammo uchinchi tomon hostida ishlayotganda, siz hech bo'lmaganda IP-manzilni yoki API serverining xost nomini (shuningdek, boshqaruv serveri sifatida ham tanilgan) ko'rsatishingiz kerak. Quyidagi misolda biz serverga ulanish parametrini aniqlaymiz va unga boshqaruv serverining IP-manzilini qator sifatida belgilaymiz.

client_args = APIClientArgs(server='192.168.47.241')

API serveriga ulanishda foydalanish mumkin bo'lgan barcha parametrlarni va ularning standart qiymatlarini ko'rib chiqaylik:

APIClientArgs sinfining __init__ usulining argumentlari

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

Menimcha, APIClientArgs klassi misollarida ishlatilishi mumkin bo'lgan argumentlar Check Point ma'murlari uchun intuitivdir va qo'shimcha izohlarni talab qilmaydi.

APIClient va kontekst menejeri orqali ulanish

sinf APIClient Uni ishlatishning eng qulay usuli - kontekst menejeri. APIClient klassi namunasiga o'tkazilishi kerak bo'lgan barcha narsa oldingi bosqichda aniqlangan ulanish parametrlaridir.

with APIClient(client_args) as client:

Kontekst menejeri avtomatik ravishda API serveriga kirish qo'ng'irog'ini amalga oshirmaydi, lekin undan chiqishda u chiqish qo'ng'irog'ini amalga oshiradi. Agar biron sababga ko'ra API qo'ng'iroqlari bilan ishlashni tugatgandan so'ng tizimdan chiqish talab qilinmasa, kontekst menejeridan foydalanmasdan ishlashni boshlashingiz kerak:

client = APIClient(clieng_args)

Ulanish testi

Ulanishning belgilangan parametrlarga mos kelishini tekshirishning eng oson usuli bu usuldan foydalanishdir barmoq izini tekshirish. Agar server API sertifikatining barmoq izi uchun sha1 xesh summasini tekshirish muvaffaqiyatsiz tugasa (usul qaytariladi) yolg'on), unda bu odatda ulanish muammolaridan kelib chiqadi va biz dasturning bajarilishini to'xtatishimiz mumkin (yoki foydalanuvchiga ulanish ma'lumotlarini tuzatish imkoniyatini beramiz):

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

E'tibor bering, kelajakda sinf APIClient har bir API chaqiruvini tekshiradi (metod api_call и api_query, biz ular haqida bir oz ko'proq gaplashamiz) API serverida sha1 barmoq izi sertifikati. Ammo agar API server sertifikatining sha1 barmoq izini tekshirishda xatolik aniqlansa (sertifikat noma'lum yoki o'zgartirilgan), usul barmoq izini tekshirish u haqida ma'lumotni mahalliy mashinaga avtomatik ravishda qo'shish/o'zgartirish imkoniyatini beradi. Ushbu tekshirishni butunlay o'chirib qo'yish mumkin (lekin buni faqat APIClientArgs argumentidan foydalanib, skriptlar API serverining o'zida, 127.0.0.1 ga ulanishda ishga tushirilganda tavsiya etiladi) - xavfsiz_avtomatik_qabul qilish (APIClientArgs haqida ko'proq "Ulanish parametrlarini aniqlash" bo'limiga qarang).

client_args = APIClientArgs(unsafe_auto_accept=True)

API serveriga kiring

У APIClient API serveriga kirish uchun 3 ta usul mavjud va ularning har biri ma'nosini tushunadi sid(sessiya identifikatori), bu sarlavhadagi har bir keyingi API chaqiruvida avtomatik ravishda ishlatiladi (ushbu parametrning sarlavhasidagi nom X-chkp-sid), shuning uchun ushbu parametrni qayta ishlashga hojat yo'q.

kirish usuli

Login va paroldan foydalangan holda variant (misolda, foydalanuvchi nomi admin va parol 1q2w3e pozitsion argumentlar sifatida berilgan):

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

Kirish usulida qo'shimcha ixtiyoriy parametrlar ham mavjud: ularning nomlari va standart qiymatlari:

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

Login_with_api_key usuli

Api kaliti yordamida variant (boshqaruv versiyasi R80.40/Management API v1.6 dan boshlab qo‘llab-quvvatlanadi, "3TsbPJ8ZKjaJGvFyoFqHFA==" bu API kaliti avtorizatsiya usuli bilan boshqaruv serveridagi foydalanuvchilardan biri uchun API kalit qiymati):

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

Usulda login_with_api_key usuldagi kabi bir xil ixtiyoriy parametrlar mavjud Kirish.

login_as_root usuli

API serveri bilan mahalliy mashinaga kirish imkoniyati:

     login = client.login_as_root()

Ushbu usul uchun faqat ikkita ixtiyoriy parametr mavjud:

domain=None, payload=None

Va nihoyat, API o'zlarini chaqiradi

Usullar orqali API qo'ng'iroqlarini amalga oshirishning ikkita varianti mavjud api_call и api_query. Keling, ular orasidagi farq nima ekanligini aniqlaylik.

api_call

Ushbu usul har qanday qo'ng'iroqlar uchun amal qiladi. Agar kerak bo'lsa, so'rov tanasida api chaqiruvi va foydali yuk uchun oxirgi qismni o'tkazishimiz kerak. Agar foydali yuk bo'sh bo'lsa, uni umuman uzatib bo'lmaydi:

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

Ushbu so'rov uchun kesma ostidagi chiqish:

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

Ushbu so'rov uchun kesma ostidagi chiqish:

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

Bu usul faqat chiqishi ofsetni o'z ichiga olgan qo'ng'iroqlar uchun qo'llanilishini darhol band qilishimga ruxsat bering. Bunday xulosa, agar u katta hajmdagi ma'lumotlarni o'z ichiga olgan yoki o'z ichiga olishi mumkin bo'lsa sodir bo'ladi. Masalan, bu boshqaruv serverida yaratilgan barcha xost ob'ektlari ro'yxati uchun so'rov bo'lishi mumkin. Bunday so'rovlar uchun API sukut bo'yicha 50 ta ob'ekt ro'yxatini qaytaradi (javobda cheklovni 500 ta ob'ektga oshirishingiz mumkin). Ma'lumotni bir necha marta tortib olmaslik uchun, API so'rovidagi ofset parametrini o'zgartirib, bu avtomatik ravishda ishlaydigan api_query usuli mavjud. Ushbu usul kerak bo'lgan qo'ng'iroqlarga misollar: shou-sessiyalar, shou-xostlar, shou-tarmoqlar, ko‘rsatuv-joker belgilar, shou-guruhlar, ko‘rsatuv-manzil diapazonlari, oddiy-shlyuzlar, shou-oddiy-klasterlar, kirish-roliklarni ko‘rsatish, ishonchli mijozlarni ko‘rsatish, ko'rgazmali paketlar. Aslida, biz ushbu API qo'ng'iroqlari nomida ko'plik so'zlarni ko'ramiz, shuning uchun bu qo'ng'iroqlarni boshqarish osonroq bo'ladi api_query

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

Ushbu so'rov uchun kesma ostidagi chiqish:

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 qo'ng'iroqlari natijalarini qayta ishlash

Shundan so'ng siz sinfning o'zgaruvchilari va usullaridan foydalanishingiz mumkin APIResponse(kontekst boshqaruvchisi ichida ham, tashqarisida ham). Sinfda APIResponse 4 ta usul va 5 ta o'zgaruvchi oldindan belgilangan;

Python SDK yordamida Check Point API-ni soddalashtirish

muvaffaqiyat

Boshlash uchun, API chaqiruvi muvaffaqiyatli bo'lganiga va natija berganiga ishonch hosil qilish yaxshi fikr bo'lar edi. Buning uchun bir usul mavjud muvaffaqiyat:

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

Agar API chaqiruvi muvaffaqiyatli bo'lsa, True (javob kodi - 200) va muvaffaqiyatsiz bo'lsa, False (boshqa javob kodi) qiymatini qaytaradi. Javob kodiga qarab turli xil ma'lumotlarni ko'rsatish uchun API chaqiruvidan so'ng darhol foydalanish qulay.

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

holat kodi

API chaqiruvi qilinganidan keyin javob kodini qaytaradi.

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

Mumkin javob kodlari: 200,400,401,403,404,409,500,501.

set_success_status

Bunday holda, muvaffaqiyat holatining qiymatini o'zgartirish kerak bo'lishi mumkin. Texnik jihatdan, siz u erda hamma narsani, hatto oddiy ipni ham qo'yishingiz mumkin. Biroq, haqiqiy misol, bu parametrni ma'lum bir shartlar ostida "False" ga qaytarishdir. Quyida boshqaruv serverida vazifalar bajarilayotgan misolga e'tibor bering, ammo biz bu so'rovni muvaffaqiyatsiz deb hisoblaymiz (muvaffaqiyat o'zgaruvchisini o'rnatamiz yolg'on, API chaqiruvi muvaffaqiyatli bo'lganiga va 200 kodini qaytarganiga qaramay).

for task in task_result.data["tasks"]:
    if task["status"] == "failed" or task["status"] == "partially succeeded":
        task_result.set_success_status(False)
        break

javob()

Javob berish usuli sizga javob kodi (status_code) va javob tanasi (tanasi) bilan lug'atni ko'rish imkonini beradi.

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

ma'lumotlar

Keraksiz ma'lumotlarsiz faqat javobning tanasini (tanasini) ko'rish imkonini beradi.

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

xato_xabar

Ushbu ma'lumot faqat API so'rovini qayta ishlashda xatolik yuz berganda mavjud (javob kodi yo'q 200). Misol chiqarish

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

Foydali misollar

Quyida Management API 1.6 da qo'shilgan API qo'ng'iroqlarini ishlatadigan misollar keltirilgan.

Birinchidan, qo'ng'iroqlar qanday ishlashini ko'rib chiqaylik xost qo'shish и manzil oralig'ini qo'shish. Aytaylik, biz 192.168.0.0/24 pastki tarmoqning barcha IP manzillarini, oxirgi okteti 5 tani xost tipidagi ob'ektlar sifatida yaratishimiz va boshqa barcha IP manzillarni manzillar diapazoni tipidagi ob'ektlar sifatida yozishimiz kerak. Bunday holda, quyi tarmoq manzili va translyatsiya manzilini chiqarib tashlang.

Shunday qilib, quyida ushbu muammoni hal qiladigan va xost tipidagi 50 ta ob'ektni va manzil diapazoni turidagi 51 ta ob'ektni yaratadigan skript mavjud. Muammoni hal qilish uchun 101 ta API qo'ng'iroqlari talab qilinadi (yakuniy nashr chaqiruvini hisobga olmaganda). Bundan tashqari, timeit modulidan foydalanib, biz o'zgarishlar e'lon qilinmaguncha skriptni bajarish vaqtini hisoblaymiz.

Qo'shimcha xost va qo'shimcha manzil oralig'idan foydalangan holda skript

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

Mening laboratoriya muhitimda ushbu skript boshqaruv serveridagi yukga qarab 30 dan 50 soniyagacha bajarilishini oladi.

Endi API chaqiruvi yordamida bir xil muammoni qanday hal qilishni ko'rib chiqamiz qo'shish-ob'ektlar-to'plam, qo'llab-quvvatlash API 1.6 versiyasida qo'shilgan. Ushbu qo'ng'iroq sizga bitta API so'rovida bir vaqtning o'zida bir nechta ob'ektlarni yaratishga imkon beradi. Bundan tashqari, ular har xil turdagi ob'ektlar bo'lishi mumkin (masalan, xostlar, pastki tarmoqlar va manzillar diapazonlari). Shunday qilib, bizning vazifamiz bitta API chaqiruvi doirasida hal qilinishi mumkin.

Add-objects-batch yordamida skript

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

Va bu skriptni laboratoriya muhitida ishga tushirish boshqaruv serveridagi yukga qarab 3 dan 7 soniyagacha davom etadi. Ya'ni, o'rtacha 101 ta API ob'ektida ommaviy turdagi qo'ng'iroq 10 barobar tezroq ishlaydi. Ko'p sonli ob'ektlarda farq yanada ta'sirchan bo'ladi.

Endi u bilan qanday ishlashni ko'rib chiqaylik ob'ektlar to'plami. Ushbu API chaqiruvidan foydalanib, biz har qanday parametrni ommaviy ravishda o'zgartirishimiz mumkin. Oldingi misoldagi manzillarning birinchi yarmini (124 tagacha xost va diapazonlar) sienna rangiga o'rnatamiz va manzillarning ikkinchi yarmiga xaki rangini belgilaymiz.

Oldingi misolda yaratilgan ob'ektlar rangini o'zgartirish

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

Bitta API chaqiruvida bir nechta ob'ektlarni o'chirishingiz mumkin o'chirish-ob'ektlar-to'plam. Endi avval orqali yaratilgan barcha xostlarni o'chirib tashlaydigan kod misolini ko'rib chiqamiz qo'shish-ob'ektlar-to'plam.

Delete-objects-batch yordamida ob'ektlarni o'chirish

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 dasturining yangi versiyalarida paydo bo'ladigan barcha funktsiyalar darhol API qo'ng'iroqlarini oladi. Shunday qilib, R80.40 da qayta ko'rib chiqishga qaytish va Smart Task kabi "xususiyatlar" paydo bo'ldi va ular uchun darhol tegishli API qo'ng'iroqlari tayyorlandi. Bundan tashqari, eski konsollardan Yagona siyosat rejimiga o'tishda barcha funksiyalar API qo'llab-quvvatlashiga ham ega bo'ladi. Misol uchun, dasturiy ta'minotning R80.40 versiyasida uzoq kutilgan yangilanish HTTPS tekshiruvi siyosatini Legacy rejimidan Yagona siyosat rejimiga o'tkazish edi va bu funksiya darhol API qo'ng'iroqlarini qabul qildi. Bu erda bir qator mamlakatlarda qonunlarga muvofiq tekshirish taqiqlangan 3 toifani (Sog'liqni saqlash, Moliya, Davlat xizmatlari) tekshirishdan istisno qiluvchi HTTPS Tekshirish siyosatining yuqori pozitsiyasiga qoida qo'shadigan kod misoli keltirilgan.

HTTPS tekshiruvi siyosatiga qoida qo'shing

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 boshqaruv serverida Python skriptlarini ishga tushirish

Hammasi bir xil README.md to'g'ridan-to'g'ri boshqaruv serveridan Python skriptlarini qanday ishga tushirish haqida ma'lumotni o'z ichiga oladi. Boshqa mashinadan API serveriga ulana olmaganingizda bu qulay bo'lishi mumkin. Men olti daqiqalik videoni yozib oldim, unda modulni o'rnatishni ko'rib chiqaman cpapi va boshqaruv serverida Python skriptlarini ishga tushirish xususiyatlari. Misol tariqasida, tarmoq tekshiruvi kabi vazifa uchun yangi shlyuz konfiguratsiyasini avtomatlashtiradigan skript ishga tushirildi. Xavfsizlik tekshiruvi. Men hal qilishim kerak bo'lgan xususiyatlar orasida: funktsiya hali Python 2.7 da paydo bo'lmagan kirish, shuning uchun foydalanuvchi kiritgan ma'lumotni qayta ishlash uchun funktsiyadan foydalaniladi raw_input. Aks holda, kod boshqa mashinalardan ishga tushirish bilan bir xil, faqat funktsiyadan foydalanish qulayroqdir login_as_root, o'z foydalanuvchi nomingiz, parolingiz va boshqaruv serverining IP manzilini yana ko'rsatmaslik uchun.

Videoni ijro etish

Xavfsizlik tekshiruvini tez sozlash uchun skript

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

Ek_pass.conf parol lug'atiga ega misol fayl
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"]
}

xulosa

Ushbu maqola faqat ishning asosiy imkoniyatlarini ko'rib chiqadi Python SDK va modul cpapi(siz taxmin qilganingizdek, bular aslida sinonimlar) va ushbu moduldagi kodni o'rganish orqali siz u bilan ishlash uchun yanada ko'proq imkoniyatlarni kashf etasiz. Siz uni o'z sinflaringiz, funktsiyalaringiz, usullaringiz va o'zgaruvchilaringiz bilan to'ldirishni xohlashingiz mumkin. Siz har doim bo'limda ishingizni baham ko'rishingiz va Check Point uchun boshqa skriptlarni ko'rishingiz mumkin CodeHub jamiyatda CheckMates, bu ham mahsulotni ishlab chiquvchilarni, ham foydalanuvchilarni birlashtiradi.

Baxtli kodlash va oxirigacha o'qiganingiz uchun tashakkur!

Manba: www.habr.com

DDoS himoyasi, VPS VDS serverlari bo'lgan saytlar uchun ishonchli hosting sotib oling 🔥 DDoS himoyasi, VPS VDS serverlari bilan ishonchli veb-sayt xostingini sotib oling | ProHoster