Đơn giản hóa API điểm kiểm tra bằng SDK Python

Đơn giản hóa API điểm kiểm tra bằng SDK PythonToàn bộ sức mạnh của sự tương tác với API được bộc lộ khi được sử dụng cùng với mã chương trình, khi có thể tạo động các yêu cầu API và công cụ để phân tích phản hồi API. Tuy nhiên, nó vẫn không được chú ý Bộ công cụ phát triển phần mềm Python (sau đây gọi là SDK Python) cho API quản lý điểm kiểm tra, nhưng vô ích. Nó đơn giản hóa đáng kể cuộc sống của các nhà phát triển và những người đam mê tự động hóa. Python gần đây đã trở nên rất phổ biến và tôi quyết định lấp đầy khoảng trống và xem xét các tính năng chính. Bộ công cụ phát triển Python API điểm kiểm tra. Bài viết này phục vụ như một sự bổ sung tuyệt vời cho một bài viết khác về Habré Kiểm tra điểm R80.10 API. Quản lý thông qua CLI, tập lệnh và hơn thế nữa. Chúng ta sẽ xem cách viết tập lệnh bằng SDK Python và xem xét kỹ hơn chức năng API quản lý mới trong phiên bản 1.6 (được hỗ trợ bắt đầu từ R80.40). Để hiểu bài viết, bạn sẽ cần có kiến ​​thức cơ bản khi làm việc với API và Python.

Check Point đang tích cực phát triển API và hiện tại các API sau đã được phát hành:

SDK Python hiện chỉ hỗ trợ tương tác với API quản lý và API Gaia. Chúng ta sẽ xem xét các lớp, phương thức và biến quan trọng nhất trong mô-đun này.

Đơn giản hóa API điểm kiểm tra bằng SDK Python

Cài đặt mô-đun

Mô-đun cpapi cài đặt nhanh chóng và dễ dàng từ kho lưu trữ Điểm kiểm tra chính thức trên github thông qua đánh rớt. Hướng dẫn cài đặt chi tiết có sẵn trong README.md. Mô-đun này được điều chỉnh để hoạt động với Python phiên bản 2.7 và 3.7. Trong bài viết này, các ví dụ sẽ được đưa ra bằng cách sử dụng Python 3.7. Tuy nhiên, SDK Python có thể chạy trực tiếp từ Máy chủ quản lý điểm kiểm tra (Quản lý thông minh) nhưng chúng chỉ hỗ trợ Python 2.7 nên phần cuối cùng sẽ cung cấp mã cho phiên bản 2.7. Ngay sau khi cài đặt mô-đun, tôi khuyên bạn nên xem các ví dụ trong thư mục ví dụ_python2 и ví dụ_python3.

Bắt đầu

Để chúng ta có thể làm việc với các thành phần của module cpapi, chúng ta cần import từ module cpapi ít nhất hai lớp bắt buộc:

APIKhách hàng и APIClientArgs

from cpapi import APIClient, APIClientArgs

lớp APIClientArgs chịu trách nhiệm về các tham số kết nối đến máy chủ API và lớp APIKhách hàng chịu trách nhiệm tương tác với API.

Xác định thông số kết nối

Để xác định các tham số khác nhau để kết nối với API, bạn cần tạo một phiên bản của lớp APIClientArgs. Về nguyên tắc, các tham số của nó được xác định trước và khi chạy tập lệnh trên máy chủ điều khiển, chúng không cần phải chỉ định.

client_args = APIClientArgs()

Nhưng khi chạy trên máy chủ của bên thứ ba, bạn cần chỉ định ít nhất địa chỉ IP hoặc tên máy chủ của máy chủ API (còn được gọi là máy chủ quản lý). Trong ví dụ bên dưới, chúng tôi xác định tham số kết nối máy chủ và gán cho nó địa chỉ IP của máy chủ quản lý dưới dạng chuỗi.

client_args = APIClientArgs(server='192.168.47.241')

Hãy xem tất cả các tham số và giá trị mặc định của chúng có thể được sử dụng khi kết nối với máy chủ API:

Các đối số của phương thức __init__ của lớp 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

Tôi tin rằng các đối số có thể được sử dụng trong các phiên bản của lớp APIClientArgs là trực quan đối với quản trị viên Check Point và không yêu cầu nhận xét bổ sung.

Kết nối qua APIClient và trình quản lý bối cảnh

lớp APIKhách hàng Cách thuận tiện nhất để sử dụng nó là thông qua trình quản lý bối cảnh. Tất cả những gì cần được chuyển đến một phiên bản của lớp APIClient là các tham số kết nối đã được xác định ở bước trước.

with APIClient(client_args) as client:

Trình quản lý bối cảnh sẽ không tự động thực hiện lệnh gọi đăng nhập vào máy chủ API nhưng sẽ thực hiện lệnh gọi đăng xuất khi thoát khỏi nó. Nếu vì lý do nào đó mà không cần đăng xuất sau khi kết thúc làm việc với lệnh gọi API, bạn cần bắt đầu làm việc mà không cần sử dụng trình quản lý bối cảnh:

client = APIClient(clieng_args)

Kiểm tra kết nối

Cách dễ nhất để kiểm tra xem kết nối có đáp ứng các tham số đã chỉ định hay không là sử dụng phương thức kiểm tra_vân tay. Nếu việc xác minh tổng băm sha1 cho dấu vân tay của chứng chỉ API máy chủ không thành công (phương thức được trả về Sai), thì điều này thường xảy ra do sự cố kết nối và chúng tôi có thể dừng việc thực thi chương trình (hoặc cho người dùng cơ hội sửa dữ liệu kết nối):

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

Xin lưu ý rằng trong tương lai lớp học APIKhách hàng sẽ kiểm tra mọi lệnh gọi API (các phương thức api_call и api_query, chúng ta sẽ nói thêm về chúng một chút) chứng chỉ vân tay sha1 trên máy chủ API. Nhưng nếu khi kiểm tra dấu vân tay sha1 của chứng chỉ máy chủ API, phát hiện lỗi (chứng chỉ không xác định hoặc đã bị thay đổi), phương pháp kiểm tra_vân tay sẽ cung cấp cơ hội tự động thêm/thay đổi thông tin về nó trên máy cục bộ. Việc kiểm tra này có thể bị vô hiệu hóa hoàn toàn (nhưng điều này chỉ có thể được khuyến nghị nếu các tập lệnh chạy trên chính máy chủ API khi kết nối với 127.0.0.1), sử dụng đối số APIClientArgs - không an toàn_auto_accept (xem thêm về APIClientArgs trước đó trong “Xác định tham số kết nối”).

client_args = APIClientArgs(unsafe_auto_accept=True)

Đăng nhập vào máy chủ API

У APIKhách hàng có tới 3 phương thức để đăng nhập vào máy chủ API và mỗi phương thức đều hiểu ý nghĩa sid(session-id), được sử dụng tự động trong mỗi lệnh gọi API tiếp theo trong tiêu đề (tên trong tiêu đề của tham số này là X-chkp-sid), do đó không cần xử lý thêm tham số này.

phương thức đăng nhập

Tùy chọn sử dụng thông tin đăng nhập và mật khẩu (trong ví dụ, tên người dùng quản trị viên và mật khẩu 1q2w3e được chuyển dưới dạng đối số vị trí):

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

Các tham số tùy chọn bổ sung cũng có sẵn trong phương thức đăng nhập; đây là tên và giá trị mặc định của chúng:

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

Phương thức đăng nhập_with_api_key

Tùy chọn sử dụng khóa api (được hỗ trợ bắt đầu từ phiên bản quản lý R80.40/API quản lý v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" đây là giá trị khóa API cho một trong những người dùng trên máy chủ quản lý bằng phương thức ủy quyền khóa API):

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

Trong phương pháp đăng nhập_with_api_key các tham số tùy chọn tương tự có sẵn như trong phương thức đăng nhập.

phương thức login_as_root

Tùy chọn đăng nhập vào máy cục bộ bằng máy chủ API:

     login = client.login_as_root()

Chỉ có hai tham số tùy chọn có sẵn cho phương pháp này:

domain=None, payload=None

Và cuối cùng API tự gọi

Chúng tôi có hai tùy chọn để thực hiện lệnh gọi API thông qua các phương thức api_call и api_query. Chúng ta hãy tìm hiểu sự khác biệt giữa chúng là gì.

api_call

Phương pháp này có thể áp dụng cho mọi cuộc gọi. Chúng tôi cần chuyển phần cuối cùng cho lệnh gọi api và tải trọng trong phần nội dung yêu cầu nếu cần. Nếu tải trọng trống thì nó hoàn toàn không thể được chuyển:

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

Đầu ra cho yêu cầu này bên dưới phần cắt:

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

Đầu ra cho yêu cầu này bên dưới phần cắt:

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

Hãy để tôi đặt trước ngay rằng phương pháp này chỉ áp dụng cho các cuộc gọi có đầu ra liên quan đến offset. Suy luận như vậy xảy ra khi nó chứa hoặc có thể chứa một lượng lớn thông tin. Ví dụ: đây có thể là yêu cầu danh sách tất cả các đối tượng máy chủ được tạo trên máy chủ quản lý. Đối với những yêu cầu như vậy, API trả về danh sách 50 đối tượng theo mặc định (bạn có thể tăng giới hạn lên 500 đối tượng trong phản hồi). Và để không lấy thông tin nhiều lần, thay đổi tham số offset trong yêu cầu API, có một phương thức api_query thực hiện công việc này một cách tự động. Ví dụ về các cuộc gọi cần có phương pháp này: hiển thị phiên, hiển thị máy chủ, hiển thị mạng, hiển thị ký tự đại diện, hiển thị nhóm, hiển thị phạm vi địa chỉ, hiển thị cổng đơn giản, hiển thị cụm đơn giản, hiển thị vai trò truy cập, hiển thị khách hàng đáng tin cậy, gói hiển thị. Trên thực tế, chúng tôi thấy các từ số nhiều trong tên của các lệnh gọi API này, vì vậy các lệnh gọi này sẽ dễ dàng xử lý hơn api_query

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

Đầu ra cho yêu cầu này bên dưới phần cắt:

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

Xử lý kết quả của lệnh gọi API

Sau này bạn có thể sử dụng các biến và phương thức của lớp APIPhản hồi(cả bên trong trình quản lý bối cảnh và bên ngoài). Tại lớp học APIPhản hồi 4 phương thức và 5 biến được xác định trước; chúng ta sẽ tập trung vào những phương thức quan trọng nhất một cách chi tiết hơn.

Đơn giản hóa API điểm kiểm tra bằng SDK Python

thành công

Để bắt đầu, bạn nên đảm bảo rằng lệnh gọi API thành công và trả về kết quả. Có một phương pháp cho việc này thành công:

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

Trả về Đúng nếu lệnh gọi API thành công (mã phản hồi - 200) và Sai nếu không thành công (bất kỳ mã phản hồi nào khác). Thật thuận tiện khi sử dụng ngay sau lệnh gọi API để hiển thị các thông tin khác nhau tùy thuộc vào mã phản hồi.

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

mã trạng thái

Trả về mã phản hồi sau khi lệnh gọi API được thực hiện.

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

Mã phản hồi có thể có: 200,400,401,403,404,409,500,501.

set_success_status

Trong trường hợp này, có thể cần phải thay đổi giá trị của trạng thái thành công. Về mặt kỹ thuật, bạn có thể đặt bất cứ thứ gì vào đó, ngay cả một chuỗi thông thường. Nhưng một ví dụ thực tế sẽ là đặt lại tham số này thành Sai trong một số điều kiện đi kèm nhất định. Dưới đây, hãy chú ý đến ví dụ khi có tác vụ đang chạy trên máy chủ quản lý, nhưng chúng tôi sẽ coi yêu cầu này không thành công (chúng tôi sẽ đặt biến thành công thành Sai, mặc dù lệnh gọi API đã thành công và trả về mã 200).

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

phản ứng()

Phương thức phản hồi cho phép bạn xem từ điển với mã phản hồi (status_code) và nội dung phản hồi (nội dung).

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

dữ liệu

Cho phép bạn chỉ xem nội dung của phản hồi (nội dung) mà không có thông tin không cần thiết.

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

thông báo lỗi

Thông tin này chỉ khả dụng khi xảy ra lỗi trong khi xử lý yêu cầu API (mã phản hồi không 200). Đầu ra ví dụ

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

Ví dụ hữu ích

Sau đây là các ví dụ sử dụng lệnh gọi API đã được thêm vào Management API 1.6.

Trước tiên, hãy xem cách hoạt động của cuộc gọi thêm máy chủ и thêm phạm vi địa chỉ. Giả sử chúng ta cần tạo tất cả các địa chỉ IP của mạng con 192.168.0.0/24, octet cuối cùng là 5, làm đối tượng của loại máy chủ và ghi tất cả các địa chỉ IP khác làm đối tượng của loại dải địa chỉ. Trong trường hợp này, loại trừ địa chỉ mạng con và địa chỉ quảng bá.

Vì vậy, bên dưới là tập lệnh giải quyết vấn đề này và tạo 50 đối tượng thuộc loại máy chủ và 51 đối tượng thuộc loại dải địa chỉ. Để giải quyết vấn đề, cần có 101 lệnh gọi API (không tính lệnh gọi xuất bản cuối cùng). Ngoài ra, bằng cách sử dụng mô-đun timeit, chúng tôi tính toán thời gian cần thiết để thực thi tập lệnh cho đến khi các thay đổi được xuất bản.

Tập lệnh sử dụng add-host và 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')

Trong môi trường phòng thí nghiệm của tôi, tập lệnh này mất từ ​​30 đến 50 giây để thực thi, tùy thuộc vào tải trên máy chủ quản lý.

Bây giờ hãy xem cách giải quyết vấn đề tương tự bằng cách sử dụng lệnh gọi API thêm đối tượng-đợt, hỗ trợ đã được thêm vào trong phiên bản API 1.6. Lệnh gọi này cho phép bạn tạo nhiều đối tượng cùng một lúc trong một yêu cầu API. Hơn nữa, đây có thể là các đối tượng thuộc nhiều loại khác nhau (ví dụ: máy chủ, mạng con và dải địa chỉ). Do đó, nhiệm vụ của chúng tôi có thể được giải quyết trong khuôn khổ một lệnh gọi API.

Tập lệnh sử dụng 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')

Và việc chạy tập lệnh này trong môi trường lab của tôi mất từ ​​3 đến 7 giây, tùy thuộc vào tải trên máy chủ quản lý. Nghĩa là, trung bình, trên 101 đối tượng API, lệnh gọi loại hàng loạt chạy nhanh hơn 10 lần. Trên số lượng đối tượng lớn hơn, sự khác biệt sẽ còn ấn tượng hơn.

Bây giờ hãy xem cách làm việc với đặt-đối tượng-lô. Bằng cách sử dụng lệnh gọi API này, chúng tôi có thể thay đổi hàng loạt bất kỳ tham số nào. Hãy đặt nửa địa chỉ đầu tiên từ ví dụ trước (tối đa 124 máy chủ và cả phạm vi) thành sienna màu và gán màu kaki cho nửa sau của địa chỉ.

Thay đổi màu của các đối tượng được tạo trong ví dụ trước

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

Bạn có thể xóa nhiều đối tượng trong một lệnh gọi API bằng cách sử dụng xóa-đối tượng-lô. Bây giờ hãy xem một ví dụ mã xóa tất cả các máy chủ được tạo trước đó thông qua thêm đối tượng-đợt.

Xóa các đối tượng bằng cách sử dụng 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)

Tất cả các chức năng xuất hiện trong các bản phát hành mới của phần mềm Check Point đều ngay lập tức nhận được lệnh gọi API. Do đó, trong R80.40, các “tính năng” như Hoàn nguyên về bản sửa đổi và Tác vụ thông minh đã xuất hiện và các lệnh gọi API tương ứng đã được chuẩn bị ngay lập tức cho chúng. Hơn nữa, tất cả chức năng khi chuyển từ bảng điều khiển Legacy sang chế độ Chính sách hợp nhất cũng nhận được hỗ trợ API. Ví dụ: bản cập nhật được chờ đợi từ lâu trong phiên bản phần mềm R80.40 là việc chuyển chính sách Kiểm tra HTTPS từ chế độ Kế thừa sang chế độ Chính sách Hợp nhất và chức năng này ngay lập tức nhận được lệnh gọi API. Dưới đây là ví dụ về mã bổ sung quy tắc vào vị trí trên cùng của chính sách Kiểm tra HTTPS loại trừ 3 danh mục khỏi kiểm tra (Y tế, Tài chính, Dịch vụ Chính phủ), bị cấm kiểm tra theo luật ở một số quốc gia.

Thêm quy tắc vào chính sách Kiểm tra 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")

Chạy tập lệnh Python trên máy chủ quản lý Check Point

Tất cả mọi thứ là như nhau README.md chứa thông tin về cách chạy tập lệnh Python trực tiếp từ máy chủ điều khiển. Điều này có thể thuận tiện khi bạn không thể kết nối với máy chủ API từ một máy khác. Tôi đã quay một video dài sáu phút trong đó tôi xem cách cài đặt mô-đun cpapi và các tính năng chạy tập lệnh Python trên máy chủ điều khiển. Ví dụ: một tập lệnh được chạy để tự động hóa cấu hình của một cổng mới cho một tác vụ như kiểm tra mạng Kiểm tra bảo mật. Trong số các tính năng mà tôi phải xử lý: hàm này chưa xuất hiện trong Python 2.7 đầu vào, do đó để xử lý thông tin người dùng nhập vào sẽ sử dụng một hàm thô_input. Ngược lại, mã cũng giống như khi khởi chạy từ các máy khác, chỉ có điều việc sử dụng chức năng sẽ thuận tiện hơn đăng nhập_as_root, để không chỉ định lại tên người dùng, mật khẩu và địa chỉ IP của máy chủ quản lý.

Tập lệnh thiết lập nhanh Kiểm tra bảo mật

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

Một tệp ví dụ có từ điển mật khẩu bổ sung_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

Kết luận

Bài viết này chỉ xem xét những khả năng cơ bản của công việc SDK Python và mô-đun cpapi(như bạn có thể đoán, đây thực sự là những từ đồng nghĩa) và bằng cách nghiên cứu mã trong mô-đun này, bạn sẽ khám phá ra nhiều cơ hội hơn nữa để làm việc với nó. Có thể bạn sẽ muốn bổ sung nó bằng các lớp, hàm, phương thức và biến của riêng bạn. Bạn luôn có thể chia sẻ công việc của mình và xem các tập lệnh khác cho Check Point trong phần mãHub trong cộng đồng kiểm tra bạn bè, nơi tập hợp cả nhà phát triển sản phẩm và người dùng.

Chúc bạn viết mã vui vẻ và cảm ơn vì đã đọc đến cuối!

Nguồn: www.habr.com

Thêm một lời nhận xét