Check Point R80.10 API. Управління через CLI, скрипти і не тільки

Check Point R80.10 API. Управління через CLI, скрипти і не тільки

Упевнений, що у кожного, хто коли-небудь працював з Пункт контролю, виникала претензія щодо неможливості виправлення конфігурації з командного рядка. Це особливо дико для тих, хто раніше працював з Cisco ASA, де абсолютно все можна налаштувати в CLI. У Check Point-а все навпаки - всі налаштування безпеки виконувались виключно із графічного інтерфейсу. Однак деякі речі зовсім не зручно робити через GUI (навіть такий зручний як у Check Point). Наприклад завдання з додавання 100 нових хостів чи мереж перетворюється на довгу і нудну процедуру. Для кожного об'єкта доведеться кілька разів кликати мишкою і вбивати IP-адресу. Те саме стосується створення групи сайтів або масового включення/відключення IPS сигнатур. При цьому велика ймовірність припуститися помилки.

Відносно нещодавно сталося "диво". З виходом нової версії Gaia R80 було анонсовано можливість використання API, що відкриває широкі можливості автоматизації налаштувань, адміністрування, моніторингу і т.д. Тепер можна:

  • створювати об'єкти;
  • додавати чи правити access-list-и;
  • включати/вимикати блейди;
  • налаштовувати мережеві інтерфейси;
  • встановлювати політики;
  • і багато іншого.

Якщо чесно, не розумію як ця новина пройшла повз Хабра. У цій статті ми коротко опишемо як користуватися API і наведемо кілька практичних прикладів налаштування CheckPoint за допомогою скриптів.

Відразу хотів би обмовитися, API використовується тільки для Management Server. Тобто. керувати шлюзами без Management сервера як і раніше неможливо.

Кому в принципі може стати в нагоді цей API?

  1. Системні адміністратори, які хочуть спростити або автоматизувати рутинні завдання щодо налаштування Check Point;
  2. компанії, які хочуть інтегрувати Check Point з іншими рішеннями (системи віртуалізації, тикет-системи, системи керування конфігураціями тощо);
  3. Системні інтегратори, які хочуть стандартизувати налаштування або створити додаткові продукти, пов'язані з Check Point.

Типова схема

І так, представимо типову схему з Check Point:

Check Point R80.10 API. Управління через CLI, скрипти і не тільки

Як завжди у нас є шлюз (SG), сервер управління (SMS) та консоль адміністратора (SmartConsole). При цьому звичайний процес налаштування шлюзу виглядає так:

Check Point R80.10 API. Управління через CLI, скрипти і не тільки

Тобто. спочатку необхідно на комп'ютері адміністратора запустити SmartConsole, за допомогою якої ми підключаємося до Management-серверу (SMS). На SMS виконуються налаштування безпеки, а вже потім застосовуються (install policy) на шлюз (SG).

Під час використання API керування, ми в принципі можемо пропустити перший пункт (запуск SmartConsole) та застосовувати API-команди безпосередньо до Management-серверу (SMS).

Способи використання API

Для виправлення конфігурації за допомогою API є чотири основні способи:

1) За допомогою утиліти mgmt_cli

Приклад - # mgmt_cli add host name host1 ip-address 192.168.2.100
Ця команда запускається з командного рядка Management-сервера (SMS). Думаю, синтаксис команди зрозумілий — створюється host1 з адресою 192.168.2.100.

2) Вводити API команди через clish (у режимі expert)

По суті, все, що вам потрібно, це залогінитись у командному рядку (mgmt login) під обліковим записом, який використовується при підключенні через SmartConsole (або root-облік). Потім ви вже можете вводити API-команди (у цьому випадку немає необхідності використовувати перед кожною командою утиліту mgmt_cli). Можна створювати повноцінні BASH-скрипти. Приклад скрипта, який створює хост:

Bash-скрипт

#!/bin/bash

main() {
    clear

    #LOGIN (don't ask for username and password, user is already logged in to Management server as 'root' user)
    mgmt_cli login --root true > id_add_host.txt
    on_error_print_and_exit "Error: Failed to login, check that the server is up and running (run 'api status')"

    #READ HOST NAME
    printf "Enter host name:n"
    read -e host_name
    on_empty_input_print_and_exit "$host_name" "Error: The host's name cannot be empty."

    #READ IP ADDRESS
    printf "nEnter host IP address:n"
    read -e ip
    on_empty_input_print_and_exit "$ip" "Error: The host's IP address cannot be empty."

    #CREATE HOST
    printf "Creating new host: $host_name with IP address: $ipn"
    new_host_response=$(mgmt_cli add host name $host_name ip-address $ip -s id_add_host.txt 2> /dev/null)
    on_error_print_and_exit "Error: Failed to create host object. n$new_host_response"

    #PUBLISH THE CHANGES
    printf "nPublishing the changesn"
    mgmt_cli publish --root true -s id_add_host.txt &> /dev/null
    on_error_print_and_exit "Error: Failed to publish the changes."

    #LOGOUT
    logout
	
	printf "Done.n"
}

logout(){
	mgmt_cli logout --root true -s id_add_host.txt &> /dev/null
}

on_error_print_and_exit(){
    if [ $? -ne 0 ]; then
        handle_error "$1" 
	fi
}

handle_error(){
    printf "n$1n" #print error message
    mgmt_cli discard --root true -s id_add_host.txt &> /dev/null
    logout
    exit 1
}

on_empty_input_print_and_exit(){
	if [ -z "$1" ]; then
		printf "$2n" #print error message
		logout
		exit 0
	fi
}

# Script starts here. Call function "main".
main

Якщо цікаво, то можна переглянути відповідне відео:

3) Через SmartConsole, відкривши вікно CLI

Все, що потрібно зробити, це запустити віконце CLI прямо з SmartConsole, як це показано на малюнку нижче.

Check Point R80.10 API. Управління через CLI, скрипти і не тільки

У цьому вікні можна одразу починати вводити API-команди.

4) Web Services. Використовувати HTTPS Post request (REST API)

На наш погляд це один із найперспективніших способів, т.к. дозволяє "будувати" цілі програми по керування сервером управління (вибачаюся за тавтологію). Нижче ми розглянемо цей метод трохи докладніше.

Якщо резюмувати:

  1. API + cli більше підходить для людей, хто звик до Cisco;
  2. API + shell для застосування скриптів та виконання рутинних завдань;
  3. REST API для автоматизації.

Увімкнення API

За замовчуванням, API включений на управління серверами з об'ємом RAM більше 4Гб і standalone конфігураціях з RAM більше 8Гб. Перевірити статус можна за допомогою команди: api status

Якщо виявиться, що api вимкнений, його досить просто включити через SmartConsole: Manage & Settings > Blades > Management API > Advanced Settings

Check Point R80.10 API. Управління через CLI, скрипти і не тільки

Потім опублікувати (Публікувати) зміни та виконати команду api restart.

Web requests + Python

Для виконання API-команд можна використовувати Web-запити із застосуванням Python та бібліотек запитів, json. Загалом структура web-запиту складається з трьох частин:

1)Адреса

(https://<managemenet server>:<port>/web_api/<command>) 


2) HTTP Headers

content-Type: application/json
x-chkp-sid: <session ID token as returned by the login command>


3) Request payload

Text в JSON форматі містить різні параметри

Приклад виклику різних команд:


def api_call(ip_addr, port, command, json_payload, sid):
    url = 'https://' + ip_addr + ':' + str(port) + '/web_api/' + command
    if sid == “”:
        request_headers = {'Content-Type' : 'application/json'}
    else:
        request_headers = {'Content-Type' : 'application/json', 'X-chkp-sid' : sid}
    r = requests.post(url,data=json.dumps(json_payload), headers=request_headers,verify=False)
    return r.json()                                        
'xxx.xxx.xxx.xxx' -> Ip address GAIA

Наведемо кілька типових завдань, із якими найчастіше доводиться зіштовхуватися при адмініструванні Check Point.

1) Приклад функцій авторизації та логауту:

Сценарій


    payload = {‘user’: ‘your_user’, ‘password’ : ‘your_password’}
    response = api_call('xxx.xxx.xxx.xxx', 443, 'login',payload, '')
    return response["sid"]

    response = api_call('xxx.xxx.xxx.xxx', 443,'logout', {} ,sid)
    return response["message"]

2) Увімкнення блейдів та налаштування мережі:

Сценарій


new_gateway_data = {'name':'CPGleb','anti-bot':True,'anti-virus' : True,'application-control':True,'ips':True,'url-filtering':True,'interfaces':
                    [{'name':"eth0",'topology':'external','ipv4-address': 'xxx.xxx.xxx.xxx',"ipv4-network-mask": "255.255.255.0"},
                     {'name':"eth1",'topology':'internal','ipv4-address': 'xxx.xxx.xxx.xxx',"ipv4-network-mask": "255.255.255.0"}]}
new_gateway_result = api_call('xxx.xxx.xxx.xxx', 443,'set-simple-gateway', new_gateway_data ,sid)
print(json.dumps(new_gateway_result))

3) Зміна правил міжмережевого екрану:

Сценарій


new_access_data={'name':'Cleanup rule','layer':'Network','action':'Accept'}
new_access_result = api_call('xxx.xxx.xxx.xxx', 443,'set-access-rule', new_access_data ,sid)
print(json.dumps(new_access_result))

4) Додавання Application layer:

Сценарій


add_access_layer_application={ 'name' : 'application123',"applications-and-url-filtering" : True,"firewall" : False}
add_access_layer_application_result = api_call('xxx.xxx.xxx.xxx', 443,'add-access-layer', add_access_layer_application ,sid)
print(json.dumps(add_access_layer_application_result))

set_package_layer={"name" : "Standard","access":True,"access-layers" : {"add" : [ { "name" : "application123","position" :2}]} ,"installation-targets" : "CPGleb"}
set_package_layer_result = api_call('xxx.xxx.xxx.xxx', 443,'set-package', set_package_layer ,sid)
print(json.dumps(set_package_layer_result))

5) Publish та встановлення політики, перевірка виконання команди (task-id):

Сценарій


publish_result = api_call('xxx.xxx.xxx.xxx', 443,"publish", {},sid)
print("publish result: " + json.dumps(publish_result))
new_policy = {'policy-package':'Standard','access':True,'targets':['CPGleb']}
new_policy_result = api_call('xxx.xxx.xxx.xxx', 443,'install-policy', new_policy ,sid)
print(json.dumps(new_policy_result)

task_id=(json.dumps(new_policy_result ["task-id"]))
len_str=len(task_id)
task_id=task_id[1:(len_str-1)]
show_task_id ={'task-id':(task_id)}
show_task=api_call('xxx.xxx.xxx.xxx',443,'show-task',show_task_id,sid)
print(json.dumps(show_task))

6) Додати хост:

Сценарій


new_host_data = {'name':'JohnDoePc', 'ip-address': '192.168.0.10'}
new_host_result = api_call('xxx.xxx.xxx.xxx', 443,'add-host', new_host_data ,sid)
print(json.dumps(new_host_result))

7) Додати поле Threat Prevention:

Сценарій


set_package_layer={'name':'Standard','threat-prevention' :True,'installation-targets':'CPGleb'}
set_package_layer_result = api_call('xxx.xxx.xxx.xxx', 443,'set-package',set_package_layer,sid)
print(json.dumps(set_package_layer_result))

8) Переглянути список сесій

Сценарій


new_session_data = {'limit':'50', 'offset':'0','details-level' : 'standard'}
new_session_result = api_call('xxx.xxx.xxx.xxx', 443,'show-sessions', new_session_data ,sid)
print(json.dumps(new_session_result))

9) Створити новий профіль:

Сценарій


add_threat_profile={'name':'Apeiron', "active-protections-performance-impact" : "low","active-protections-severity" : "low or above","confidence-level-medium" : "prevent",
  "confidence-level-high" : "prevent", "threat-emulation" : True,"anti-virus" : True,"anti-bot" : True,"ips" : True,
  "ips-settings" : { "newly-updated-protections" : "staging","exclude-protection-with-performance-impact" : True,"exclude-protection-with-performance-impact-mode" : "High or lower"},
  "overrides" : [ {"protection" : "3Com Network Supervisor Directory Traversal","capture-packets" : True,"action" : "Prevent","track" : "Log"},
                  {"protection" : "7-Zip ARJ Archive Handling Buffer Overflow", "capture-packets" : True,"action" : "Prevent","track" : "Log"} ]}
add_threat_profile_result=api_call('xxx.xxx.xxx.xxx',443,'add-threat-profile',add_threat_profile,sid)
print(json.dumps(add_threat_profile_result))  

10) Змінити дію для IPS сигнатури:

Сценарій


set_threat_protection={
  "name" : "3Com Network Supervisor Directory Traversal",
  "overrides" : [{ "profile" : "Apeiron","action" : "Detect","track" : "Log","capture-packets" : True},
    { "profile" : "Apeiron", "action" : "Detect", "track" : "Log", "capture-packets" : False} ]}
set_threat_protection_result=api_call('xxx.xxx.xxx.xxx',443,'set-threat-protection',set_threat_protection,sid)
print(json.dumps(set_threat_protection_result))

11) Додати свій сервіс:

Сценарій


add_service_udp={    "name" : "Dota2_udp", "port" : '27000-27030',
"keep-connections-open-after-policy-installation" : False,
"session-timeout" : 0, "match-for-any" : True,
"sync-connections-on-cluster" : True,
"aggressive-aging" : {"enable" : True, "timeout" : 360,"use-default-timeout" : False  },
"accept-replies" : False}
add_service_udp_results=api_call('xxx.xxx.xxx.xxx',443,"add-service-udp",add_service_udp,sid)
print(json.dumps(add_service_udp_results))

12) Додати категорію, сайт чи групу:

Сценарій


add_application_site_category={  "name" : "Valve","description" : "Valve Games"}
add_application_site_category_results=api_call('xxx.xxx.xxx.xxx',443,"add-application-site-category",add_application_site_category,sid)
print(json.dumps(add_application_site_category_results))

add_application_site={    "name" : "Dota2", "primary-category" : "Valve",  "description" : "Dotka",
  "url-list" : [ "www.dota2.ru" ], "urls-defined-as-regular-expression" : False}
add_application_site_results=api_call('xxx.xxx.xxx.xxx',443,"add-application-site " , 
add_application_site , sid)
print(json.dumps(add_application_site_results))

add_application_site_group={"name" : "Games","members" : [ "Dota2"]}
add_application_site_group_results=api_call('xxx.xxx.xxx.xxx',443,"add-application-site-group",add_application_site_group,sid)
print(json.dumps(add_application_site_group_results))

Крім того, за допомогою Веб-API ви можете додавати та видаляти мережі, хости, ролі доступу тощо. Є можливість налаштування блейдів Antivirus, Antibot, IPS, VPN. Можливе навіть встановлення ліцензій за допомогою команди запуск сценарію. З усіма API-командами Check Point можна ознайомитись тут.

Check Point API + Postman

Також зручно використовувати Check Point Web API у зв'язку з Листоноша. Postman має десктопні версії для Windows, Linux та MacOS. Крім того, є плагін для Google Chrome. Ним ми й скористаємося. Для початку необхідно знайти Postman у Google Chrome Store та встановити:

Check Point R80.10 API. Управління через CLI, скрипти і не тільки

За допомогою цієї утиліти ми зможемо формувати Web-запити до API Check Point. Щоб не запам'ятовувати всі API-команди, можна імпортувати так звані collection-и (шаблони), які вже містять усі необхідні команди:

Check Point R80.10 API. Управління через CLI, скрипти і не тільки

Тут ви знайдете збір для R80.10. Після імпорту нам будуть доступні шаблони API-команд:

Check Point R80.10 API. Управління через CLI, скрипти і не тільки

На мою думку, це дуже зручно. Можна дуже швидко розпочати розробку програм з використанням Check Point API.

Check Point + Ansible

Також хотілося б відзначити, що існує Неможливо модуль для API CheckPoint. Модуль дозволяє керувати конфігураціями, але він не такий зручний для вирішення екзотичних завдань. Написання скриптів будь-якою мовою програмування дає більш гнучкі та зручні рішення.

Висновок

На цьому, мабуть, ми закінчимо наш невеликий огляд Check Point API. На мій погляд, ця функція була дуже довгоочікуваною і необхідною. Поява API відкриває дуже широкі можливості як системних адміністраторів, так системних інтеграторів, які працюють із продуктами Check Point. Оркестрація, автоматизація, зворотний зв'язок із SIEM… все це тепер можливо.

PS Більше статей про Пункт контролю ви як завжди можете знайти у нашому блозі Хабр або в блозі на сайті.

PSS Задати технічні питання, пов'язані з налаштуванням Check Point, можна тут

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

Чи плануєте ви використовувати API?

  • 70,6%Так12

  • 23,5%Ні4

  • 5,9%Вже використовую1

Проголосували 17 користувачів. Утрималися 3 користувача.

Джерело: habr.com

Додати коментар або відгук