Упевнений, що у кожного, хто коли-небудь працював з
Відносно нещодавно сталося "диво". З виходом нової версії Gaia R80 було анонсовано можливість використання API, що відкриває широкі можливості автоматизації налаштувань, адміністрування, моніторингу і т.д. Тепер можна:
- створювати об'єкти;
- додавати чи правити access-list-и;
- включати/вимикати блейди;
- налаштовувати мережеві інтерфейси;
- встановлювати політики;
- і багато іншого.
Якщо чесно, не розумію як ця новина пройшла повз Хабра. У цій статті ми коротко опишемо як користуватися API і наведемо кілька практичних прикладів налаштування CheckPoint за допомогою скриптів.
Відразу хотів би обмовитися, API використовується тільки для Management Server. Тобто. керувати шлюзами без Management сервера як і раніше неможливо.
Кому в принципі може стати в нагоді цей API?
- Системні адміністратори, які хочуть спростити або автоматизувати рутинні завдання щодо налаштування Check Point;
- компанії, які хочуть інтегрувати Check Point з іншими рішеннями (системи віртуалізації, тикет-системи, системи керування конфігураціями тощо);
- Системні інтегратори, які хочуть стандартизувати налаштування або створити додаткові продукти, пов'язані з Check Point.
Типова схема
І так, представимо типову схему з Check Point:
Як завжди у нас є шлюз (SG), сервер управління (SMS) та консоль адміністратора (SmartConsole). При цьому звичайний процес налаштування шлюзу виглядає так:
Тобто. спочатку необхідно на комп'ютері адміністратора запустити 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, як це показано на малюнку нижче.
У цьому вікні можна одразу починати вводити API-команди.
4) Web Services. Використовувати HTTPS Post request (REST API)
На наш погляд це один із найперспективніших способів, т.к. дозволяє "будувати" цілі програми по керування сервером управління (вибачаюся за тавтологію). Нижче ми розглянемо цей метод трохи докладніше.
Якщо резюмувати:
- API + cli більше підходить для людей, хто звик до Cisco;
- API + shell для застосування скриптів та виконання рутинних завдань;
- REST API для автоматизації.
Увімкнення API
За замовчуванням, API включений на управління серверами з об'ємом RAM більше 4Гб і standalone конфігураціях з RAM більше 8Гб. Перевірити статус можна за допомогою команди: api status
Якщо виявиться, що api вимкнений, його досить просто включити через SmartConsole: Manage & Settings > Blades > Management API > Advanced Settings
Потім опублікувати (Публікувати) зміни та виконати команду 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 у зв'язку з
За допомогою цієї утиліти ми зможемо формувати Web-запити до API Check Point. Щоб не запам'ятовувати всі API-команди, можна імпортувати так звані collection-и (шаблони), які вже містять усі необхідні команди:
На мою думку, це дуже зручно. Можна дуже швидко розпочати розробку програм з використанням Check Point API.
Check Point + Ansible
Також хотілося б відзначити, що існує Неможливо
Висновок
На цьому, мабуть, ми закінчимо наш невеликий огляд 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