Уверен, что у каждого, кто когда-либо работал с Check Point, возникала претензия по поводу невозможности правки конфигурации из командной строки. Это особенно дико для тех, кто до этого работал с Cisco ASA, где абсолютно все можно настроить в CLI. У Check Point-а все наоборот — все настройки безопасности выполнялись исключительно из графического интерфейса. Однако, некоторые вещи совершенно не удобно делать через GUI (даже такой удобный как у Check Point). К примеру задача по добавлению 100 новых хостов или сетей превращается в долгую и нудную процедуру. Для каждого объекта придется несколько раз кликать мышкой и вбивать ip-адрес. То же самое касается создания группы сайтов или массового включения/отключения IPS сигнатур. При этом велика вероятность допустить ошибку.

Относительно недавно случилось “чудо”. С выходом новой версии Gaia R80 была анонсирована возможность использования API, что открывает широкие возможности по автоматизации настроек, администрированию, мониторингу и т.д. Теперь можно:

  • создавать объекты;
  • добавлять или править access-list-ы;
  • включать/отключать блейды;
  • настраивать сетевые интерфейсы;
  • инсталлировать политики;
  • и многое другое.

Если честно, не понимаю как эта новость прошла мимо Хабра. В данной статье мы вкратце опишем как пользоваться API и приведем несколько практических примеров настройки CheckPoint с помощью скриптов.

Сразу хотел бы оговориться, API используется только для Management сервера. Т.е. управлять шлюзами без Management сервера по прежнему невозможно.

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


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

Типовая схема


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



Как обычно у нас есть шлюз (SG), сервер управления (SMS) и консоль администратора (SmartConsole). При этом обычный процесс настройки шлюза выглядит следующим образом:



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

При использовании Management 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: $ip\n"
    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 changes\n"
    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$1\n" #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 "$2\n" #print error message
		logout
		exit 0
	fi
}

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


Если интересно, то можно посмотреть соответствующее видео:



3) Через SmartConsole, открыв окно CLI


Все что нужно сделать, это запустить окошко CLI прямо из SmartConsole, как это показано на картинке ниже.



В этом окне можно сразу начинать вводить 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



Затем опубликовать (Publish) изменения и выполнить команду api restart.

Web requests + Python


Для выполнения API-команд можно использовать Web-запросы с применением Python и библиотек requests, 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 in JSON format containing the different parameters

Пример для вызова различных команд:


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


Кроме того, с помощью Web API вы можете добавлять и удалять сети, хосты, роли доступа и т.д. Есть возможность настройки блейдов Antivirus, Antibot, IPS, VPN. Возможна даже установка лицензий с помощью команды run-script. Со всеми API-командами Check Point можно ознакомиться здесь.

Check Point API + Postman


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



С помощью этой утилиты мы сможем формировать Web-запросы к API Check Point. Чтобы не запоминать все API-команды, есть возможность импортировать так называемые collection-ы (шаблоны), которые уже содержат все необходимые команды:



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



На мой взгляд, это очень удобно. Можно весьма быстро приступить к разработке приложений с использованием Check Point API.

Check Point + Ansible


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

Вывод


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

P.S. Больше статей о Check Point вы как всегда можете найти в нашем блоге Хабр или в блоге на сайте.

Комментарии (0)