Menyederhanakan Check Point API dengan Python SDK

Menyederhanakan Check Point API dengan Python SDKKekuatan penuh interaksi dengan API terungkap ketika digunakan bersama dengan kode program, ketika dimungkinkan untuk menghasilkan permintaan API secara dinamis dan alat untuk menganalisis respons API. Namun, hal itu masih belum terlalu terlihat Kit Pengembangan Perangkat Lunak Python (selanjutnya disebut sebagai Python SDK) untuk Periksa API Manajemen Titik, tapi sia-sia. Ini secara signifikan menyederhanakan kehidupan pengembang dan penggemar otomasi. Python telah mendapatkan popularitas yang luar biasa akhir-akhir ini dan saya memutuskan untuk mengisi kekosongan tersebut dan meninjau fitur-fitur utamanya. Kit Pengembangan Python API Titik Periksa. Artikel ini berfungsi sebagai tambahan yang bagus untuk artikel lain tentang Habré Periksa Titik API R80.10. Manajemen melalui CLI, skrip, dan lainnya. Kita akan melihat cara menulis skrip menggunakan Python SDK dan melihat lebih dekat fungsionalitas Management API baru di versi 1.6 (didukung mulai dari R80.40). Untuk memahami artikel ini, Anda memerlukan pengetahuan dasar tentang bekerja dengan API dan Python.

Check Point secara aktif mengembangkan API dan saat ini telah dirilis:

Python SDK saat ini hanya mendukung interaksi dengan Management API dan API Gaia. Kita akan melihat kelas, metode, dan variabel terpenting dalam modul ini.

Menyederhanakan Check Point API dengan Python SDK

Memasang modul

Modul cpapi menginstal dengan cepat dan mudah dari repositori resmi Check Point di github melalui biji. Petunjuk instalasi terperinci tersedia di README.md. Modul ini diadaptasi untuk bekerja dengan Python versi 2.7 dan 3.7. Pada artikel ini, contoh akan diberikan menggunakan Python 3.7. Namun, Python SDK dapat dijalankan langsung dari Server Manajemen Check Point (Smart Management), tetapi hanya mendukung Python 2.7, jadi bagian terakhir akan memberikan kode untuk versi 2.7. Segera setelah menginstal modul, saya sarankan melihat contoh di direktori contoh_python2 и contoh_python3.

Memulai

Agar kita dapat bekerja dengan komponen modul cpapi, kita perlu mengimpor dari modul cpapi setidaknya dua kelas wajib:

Klien API и APIClientArgs

from cpapi import APIClient, APIClientArgs

Kelas APIClientArgs bertanggung jawab atas parameter koneksi ke server API, dan kelas Klien API bertanggung jawab untuk interaksi dengan API.

Menentukan parameter koneksi

Untuk menentukan berbagai parameter untuk menghubungkan ke API, Anda perlu membuat sebuah instance dari kelas tersebut APIClientArgs. Pada prinsipnya, parameternya sudah ditentukan sebelumnya dan saat menjalankan skrip di server kontrol, parameter tersebut tidak perlu ditentukan.

client_args = APIClientArgs()

Namun saat berjalan di host pihak ketiga, Anda harus menentukan setidaknya alamat IP atau nama host server API (juga dikenal sebagai server manajemen). Pada contoh di bawah ini, kami mendefinisikan parameter koneksi server dan menetapkan alamat IP server manajemen sebagai string.

client_args = APIClientArgs(server='192.168.47.241')

Mari kita lihat semua parameter dan nilai defaultnya yang dapat digunakan saat menyambung ke server API:

Argumen metode __init__ dari kelas 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

Saya yakin argumen yang dapat digunakan dalam instance kelas APIClientArgs bersifat intuitif bagi administrator Check Point dan tidak memerlukan komentar tambahan.

Menghubungkan melalui APIClient dan manajer konteks

Kelas Klien API Cara paling mudah untuk menggunakannya adalah melalui pengelola konteks. Yang perlu diteruskan ke instance kelas APIClient adalah parameter koneksi yang ditentukan pada langkah sebelumnya.

with APIClient(client_args) as client:

Manajer konteks tidak akan secara otomatis membuat panggilan masuk ke server API, tetapi akan membuat panggilan keluar ketika keluar. Jika karena alasan tertentu logout tidak diperlukan setelah selesai bekerja dengan panggilan API, Anda harus mulai bekerja tanpa menggunakan pengelola konteks:

client = APIClient(clieng_args)

Memeriksa koneksi

Cara termudah untuk memeriksa apakah koneksi memenuhi parameter yang ditentukan adalah dengan menggunakan metode ini check_sidik jari. Jika verifikasi jumlah hash sha1 untuk sidik jari sertifikat API server gagal (metode dikembalikan Salah), maka hal ini biasanya disebabkan oleh masalah koneksi dan kita dapat menghentikan eksekusi program (atau memberikan kesempatan kepada pengguna untuk memperbaiki data koneksi):

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

Harap dicatat bahwa di masa depan kelas Klien API akan memeriksa setiap panggilan API (methods api_panggilan и api_query, kita akan membicarakannya lebih jauh) sertifikat sidik jari sha1 di server API. Tetapi jika, saat memeriksa sidik jari sha1 sertifikat server API, kesalahan terdeteksi (sertifikat tidak diketahui atau telah diubah), metodenya check_sidik jari akan memberikan kesempatan untuk menambah/mengubah informasi tentangnya di mesin lokal secara otomatis. Pemeriksaan ini dapat dinonaktifkan sepenuhnya (tetapi ini hanya dapat direkomendasikan jika skrip dijalankan di server API itu sendiri, saat menyambung ke 127.0.0.1), menggunakan argumen APIClientArgs - tidak aman_auto_accept (lihat selengkapnya tentang APIClientArgs sebelumnya di “Mendefinisikan parameter koneksi”).

client_args = APIClientArgs(unsafe_auto_accept=True)

Masuk ke server API

У Klien API ada 3 cara untuk login ke API server dan masing-masing sudah paham maksudnya sid(id-sesi), yang digunakan secara otomatis di setiap panggilan API berikutnya di header (nama di header parameter ini adalah X-chkp-sid), jadi tidak perlu memproses parameter ini lebih lanjut.

metode masuk

Opsi menggunakan login dan kata sandi (dalam contoh, nama pengguna admin dan kata sandi 1q2w3e diteruskan sebagai argumen posisi):

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

Parameter opsional tambahan juga tersedia dalam metode login; berikut adalah nama dan nilai defaultnya:

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

Metode login_with_api_key

Opsi menggunakan kunci api (didukung mulai dari versi manajemen R80.40/API Manajemen v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" ini adalah nilai kunci API untuk salah satu pengguna di server manajemen dengan metode otorisasi kunci API):

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

Dalam metode login_dengan_api_key parameter opsional yang sama tersedia seperti dalam metode ini masuk.

metode login_as_root

Opsi untuk masuk ke mesin lokal dengan server API:

     login = client.login_as_root()

Hanya ada dua parameter opsional yang tersedia untuk metode ini:

domain=None, payload=None

Dan akhirnya API memanggil dirinya sendiri

Kami memiliki dua opsi untuk melakukan panggilan API melalui metode api_panggilan и api_query. Mari kita cari tahu apa perbedaan di antara keduanya.

api_panggilan

Metode ini berlaku untuk panggilan apa pun. Kita perlu meneruskan bagian terakhir untuk panggilan api dan payload di badan permintaan jika perlu. Jika payload kosong, maka tidak dapat dikirimkan sama sekali:

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

Output untuk permintaan ini di bawah potongan:

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

Output untuk permintaan ini di bawah potongan:

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

Izinkan saya segera membuat reservasi bahwa metode ini hanya berlaku untuk panggilan yang outputnya melibatkan offset. Inferensi seperti itu terjadi ketika berisi atau mungkin berisi sejumlah besar informasi. Misalnya, ini bisa berupa permintaan daftar semua objek host yang dibuat di server manajemen. Untuk permintaan seperti itu, API mengembalikan daftar 50 objek secara default (Anda dapat meningkatkan batas menjadi 500 objek sebagai respons). Dan agar tidak menarik informasi beberapa kali, mengubah parameter offset dalam permintaan API, ada metode api_query yang melakukan ini secara otomatis. Contoh panggilan yang memerlukan metode ini: sesi pertunjukan, pembawa acara, jaringan pertunjukan, wildcard pertunjukan, grup pertunjukan, rentang alamat pertunjukan, gateway sederhana pertunjukan, kluster sederhana pertunjukan, peran akses pertunjukan, klien tepercaya pertunjukan, paket pertunjukan. Faktanya, kita melihat kata jamak dalam nama panggilan API ini, sehingga panggilan ini akan lebih mudah untuk ditangani api_query

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

Output untuk permintaan ini di bawah potongan:

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

Memproses hasil panggilan API

Setelah ini Anda dapat menggunakan variabel dan metode kelas Respon API(baik di dalam pengelola konteks maupun di luar). Di kelas Respon API 4 metode dan 5 variabel sudah ditentukan sebelumnya, kami akan membahas yang paling penting secara lebih rinci.

Menyederhanakan Check Point API dengan Python SDK

sukses

Untuk memulainya, sebaiknya pastikan panggilan API berhasil dan memberikan hasil. Ada metode untuk ini sukses:

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

Mengembalikan True jika panggilan API berhasil (kode respons - 200) dan False jika tidak berhasil (kode respons lainnya). Lebih mudah digunakan segera setelah panggilan API untuk menampilkan informasi berbeda bergantung pada kode respons.

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

Kode status

Mengembalikan kode respons setelah panggilan API dilakukan.

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

Kode respons yang mungkin: 200,400,401,403,404,409,500,501.

set_sukses_status

Dalam hal ini, mungkin perlu mengubah nilai status sukses. Secara teknis, Anda bisa meletakkan apa saja di sana, bahkan string biasa. Namun contoh nyatanya adalah menyetel ulang parameter ini ke False dalam kondisi tertentu yang menyertainya. Di bawah ini, perhatikan contoh ketika ada tugas yang berjalan di server manajemen, tetapi kami akan menganggap permintaan ini tidak berhasil (kami akan mengatur variabel sukses menjadi Salah, meskipun panggilan API berhasil dan mengembalikan kode 200).

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

tanggapan()

Metode respons memungkinkan Anda melihat kamus dengan kode respons (status_code) dan isi respons (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']}}

data

Memungkinkan Anda melihat hanya isi respons (body) tanpa informasi yang tidak perlu.

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

pesan eror

Informasi ini hanya tersedia ketika terjadi kesalahan saat memproses permintaan API (kode respons tidak 200). Contoh keluaran

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

Contoh yang berguna

Berikut ini adalah contoh yang menggunakan panggilan API yang ditambahkan di Management API 1.6.

Pertama, mari kita lihat cara kerja panggilan tambahkan-host и tambahkan-rentang alamat. Katakanlah kita perlu membuat semua alamat IP subnet 192.168.0.0/24, oktet terakhirnya adalah 5, sebagai objek bertipe host, dan menulis semua alamat IP lainnya sebagai objek bertipe rentang alamat. Dalam hal ini, kecualikan alamat subnet dan alamat siaran.

Jadi, di bawah ini adalah skrip yang memecahkan masalah ini dan membuat 50 objek bertipe host dan 51 objek bertipe rentang alamat. Untuk mengatasi masalah ini, diperlukan 101 panggilan API (tidak termasuk panggilan publikasi terakhir). Selain itu, dengan menggunakan modul timeit, kami menghitung waktu yang diperlukan untuk menjalankan skrip hingga perubahan dipublikasikan.

Skrip menggunakan add-host dan 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')

Di lingkungan lab saya, skrip ini memerlukan waktu antara 30 dan 50 detik untuk dijalankan, bergantung pada beban di server manajemen.

Sekarang mari kita lihat cara mengatasi masalah yang sama menggunakan panggilan API tambahkan-objek-batch, dukungan yang ditambahkan di API versi 1.6. Panggilan ini memungkinkan Anda membuat banyak objek sekaligus dalam satu permintaan API. Selain itu, ini dapat berupa objek dengan tipe berbeda (misalnya, host, subnet, dan rentang alamat). Dengan demikian, tugas kita dapat diselesaikan dalam satu panggilan API.

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

Dan menjalankan skrip ini di lingkungan lab saya membutuhkan waktu 3 hingga 7 detik, tergantung pada beban di server manajemen. Artinya, rata-rata, pada 101 objek API, panggilan tipe batch berjalan 10 kali lebih cepat. Pada jumlah objek yang lebih banyak, perbedaannya akan semakin mengesankan.

Sekarang mari kita lihat cara bekerja dengannya set-objek-batch. Dengan menggunakan panggilan API ini, kita dapat mengubah parameter apa pun secara massal. Mari kita atur paruh pertama alamat dari contoh sebelumnya (hingga 124 host, dan juga rentangnya) ke warna sienna, dan tetapkan warna khaki ke paruh kedua alamat.

Mengubah warna objek yang dibuat pada contoh sebelumnya

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

Anda dapat menghapus banyak objek dalam satu panggilan API menggunakan hapus-objek-batch. Sekarang mari kita lihat contoh kode yang menghapus semua host yang dibuat sebelumnya melalui tambahkan-objek-batch.

Menghapus objek menggunakan 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)

Semua fungsi yang muncul di rilis baru perangkat lunak Check Point segera memperoleh panggilan API. Jadi, di R80.40, “fitur” seperti Kembalikan ke revisi dan Tugas Cerdas muncul, dan panggilan API terkait segera disiapkan untuk fitur tersebut. Selain itu, semua fungsionalitas saat berpindah dari konsol Lama ke mode Kebijakan Terpadu juga memperoleh dukungan API. Misalnya, pembaruan yang telah lama ditunggu-tunggu dalam versi perangkat lunak R80.40 adalah perpindahan kebijakan Inspeksi HTTPS dari mode Lama ke mode Kebijakan Terpadu, dan fungsi ini segera menerima panggilan API. Berikut adalah contoh kode yang menambahkan aturan pada posisi teratas kebijakan Inspeksi HTTPS yang mengecualikan 3 kategori dari inspeksi (Kesehatan, Keuangan, Layanan Pemerintah), yang dilarang untuk dilakukan inspeksi sesuai dengan hukum di sejumlah negara.

Tambahkan aturan ke kebijakan Inspeksi 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")

Menjalankan skrip Python di server manajemen Check Point

semua sama README.md berisi informasi tentang cara menjalankan skrip Python langsung dari server kontrol. Ini bisa berguna ketika Anda tidak dapat terhubung ke server API dari komputer lain. Saya merekam video berdurasi enam menit di mana saya melihat pemasangan modul cpapi dan fitur menjalankan skrip Python di server kontrol. Sebagai contoh, skrip dijalankan yang mengotomatiskan konfigurasi gateway baru untuk tugas seperti audit jaringan Pemeriksaan Keamanan. Di antara fitur-fitur yang harus saya tangani: fungsinya belum muncul di Python 2.7 memasukkan, jadi untuk mengolah informasi yang dimasukkan pengguna digunakan suatu fungsi masukan_mentah. Jika tidak, kodenya sama dengan peluncuran dari mesin lain, hanya saja lebih nyaman menggunakan fungsinya login_as_root, agar tidak menentukan lagi nama pengguna, kata sandi, dan alamat IP server manajemen Anda sendiri.

Skrip untuk pengaturan cepat Pemeriksaan Keamanan

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

Contoh file dengan kamus kata sandi tambahan_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

Kesimpulan

Artikel ini hanya membahas kemungkinan dasar pekerjaan SDK Python dan modul cpapi(seperti yang sudah Anda duga, ini sebenarnya sinonim), dan dengan mempelajari kode dalam modul ini Anda akan menemukan lebih banyak peluang untuk bekerja dengannya. Mungkin saja Anda ingin melengkapinya dengan kelas, fungsi, metode, dan variabel Anda sendiri. Anda selalu dapat membagikan pekerjaan Anda dan melihat skrip lain untuk Check Point di bagian tersebut CodeHub di dalam komunitas Teman Skak, yang mempertemukan pengembang produk dan pengguna.

Selamat coding dan terima kasih telah membaca sampai akhir!

Sumber: www.habr.com

Tambah komentar