Цялата мощ на взаимодействието с API се разкрива при съвместна работа с програмния код, когато се появяват възможности за динамично формиране на API заявки и инструменти за анализ на API отговори. Все пак, малко забележимо остава Python Software Development Kit (наричан по-нататък – Python SDK) за Check Point Management API, което е жалко. То значително улеснява живота на разработчиците и любителите на автоматизацията. Python придоби огромна популярност през последното време и реших да запълня пропуска и да направя преглед на основните възможности . Тази статия служи като отлично допълнение към друга статия на Хабра . Ние ще разгледаме как да напишем скриптове, използвайки Python SDK и ще се спрем по-подробно на новата функционалност на Management API в версия 1.6 (поддържа се от R80.40). За разбирането на статията са необходими основни познания по работа с API и Python.
Check Point активно развива API и към момента вече са налични:
- – работа с управляващия сървър чрез API (и възможност за изпълнение на скриптове на шлюзите, управлявани от управляващия сървър)
- – работа със защитни шлюзове
- – работа с пясъчника в облака на Check Point
- – работа с Identity Awareness blade на шлюзовете
- – работа с портала за управление на SMB шлюзове ()
- – взаимодействие с IoT контролерите
- – работа с (решение за сигурност на SD-WAN)
- – работа с
Python SDK в момента поддържа взаимодействие само с Management API и Gaia API. Ние ще разгледаме най-важните класове, методи и променливи в този модул.

Инсталация на модула
Модул cpapi се инсталира бързо и лесно от чрез pip. Подробна инструкция за инсталация има в . Този модул е адаптиран за работа с версиите Python 2.7 и 3.7. В тази статия примерите ще бъдат подадени с използване на Python 3.7. Въпреки това, Python SDK може да се стартира директно от управляващия сървър на Check Point (Smart Management), но там се поддържа само версия Python 2.7, затова в последния раздел ще бъде предоставен код за версия 2.7. Веднага след инсталацията на модула препоръчвам да погледнете примери в директориите examples_python2 и examples_python3.
Започване
За да имаме възможност за работа с компонентите на модула cpapi, е необходимо да импортираме от модула cpapi най-малко два необходими класа:
APIClient и APIClientArgs
от cpapi импорт APIClient, APIClientArgs
Клас APIClientArgs отговаря за параметрите за свързване с API сървъра, а класът APIClient отговаря за взаимодействието с API.
Определяме параметрите за свързване
За да определите различни параметри за свързване с API, трябва да създадете екземпляр на класа APIClientArgs. По принцип неговите параметри са предварително зададени и при стартиране на скрипта на управляващия сървър може да не ги посочвате.
client_args = APIClientArgs()Но при стартиране на външен хост е необходимо да посочите най-малко IP адрес или име на хоста на API сървъра (той също е управляващият сървър). В примера по-долу определяме параметъра за свързване server и му присвояваме IP адреса на управляващия сървър под формата на низ.
client_args = APIClientArgs(server='192.168.47.241')Нека да разгледаме всички параметри и техните стойности по подразбиране, които могат да се използват при свързване с API сървъра:
Аргументите на метода __init__ на класа APIClientArgs
class APIClientArgs:
"""
Този клас предоставя аргументи за конфигуриране на APIClient.
Всички аргументи са конфигурирани с техните стойности по подразбиране.
"""
# портът по подразбиране е None, но се заменя с 443, ако не е посочен
# възможни стойности за контекста - web_api (по подразбиране) или 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
# отпечатък на управляващия сървър
self.fingerprint = fingerprint
# session-id.
self.sid = sid
# име или IP-адрес на управляващия сървър
self.server = server
# ниво на отстраняване на грешки
self.http_debug_level = http_debug_level
# масив с всички API извиквания (за отстраняване на грешки)
self.api_calls = api_calls if api_calls else []
# име на файла за отстраняване на грешки. Ако е оставен празен, данните за отстраняване на грешки няма да се запазват на диска.
self.debug_file = debug_file
# адрес на HTTP прокси сървър (без "http://")
self.proxy_host = proxy_host
# порт на HTTP прокси
self.proxy_port = proxy_port
# версия на API на управляващия сървър
self.api_version = api_version
# указва, че клиентът не трябва да проверява сертификата на сървъра
self.unsafe = unsafe
# указва, че клиентът автоматично трябва да приемат и запази сертификата на сървъра
self.unsafe_auto_accept = unsafe_auto_accept
# контекст на използването на клиента - по подразбиране web_api
self.context = contextСмятам, че аргументите, които могат да се използват в екземплярите на класа APIClientArgs, са интуитивно понятни за администраторите на Check Point и не се нуждаят от допълнителни коментари.
Свързване чрез APIClient и мениджъра на контекста
Клас APIClient най-удобно е да се използва чрез мениджъра на контекста. Всичко, което трябва да предадете на екземпляра на класа APIClient, са параметрите за свързване, които бяха определени в предишната стъпка.
с APIClient(client_args) като клиент:
Мениджърът на контекста не ще извършва автоматично извикване на login на API сървъра, но ще извърши извикване на logout при изход от него. Ако по някакви причини logout след приключване на работата с API извиквания не е необходим, трябва да започнете работа без използване на мениджъра на контекста:
client = APIClient(clieng_args)Проверка на свързанostта
Най-лесно е да проверите дали свързаността преминава по зададените параметри с помощта на метода check_fingerprint. Ако проверката на SHA1 хеш сумата за fingerprint сертификата на API сървъра не е успешна (методът е върнал False), обикновено това е причинено от проблеми с свързаността и можем да спрем изпълнението на програмата (или да предоставим на потребителя възможност да коригира данните за свързване):
if client.check_fingerprint() is False:
print("Could not get the server's fingerprint - Check connectivity with the server.")
exit(1)
Имайте предвид, че впоследствие класът APIClient ще проверява при всяко API извикване (методите api_call и api_query, за тях ще говорим по-късно) SHA1 fingerprint сертификата на API сървъра. А ако при проверката на SHA1 fingerprint сертификата на API сървъра бъде установена грешка (сертификатът е неизвестен или е променен), методът check_fingerprint ще предостави възможност да добавите/промените информация за него на локалната машина в автоматичен режим. Тази проверка може да бъде напълно деактивирана (но такова нещо се препоръчва само в случай на стартиране на скриптове на самия API сървър, при свързване към 127.0.0.1), използвайки аргумента APIClientArgs — unsafe_auto_accept (вж. по-подробно за APIClientArgs по-рано в „Определяне на параметрите на връзката“).
client_args = APIClientArgs(unsafe_auto_accept=True)Вход в API сървъра
В APIClient има общо 3 метода за вход в API сървъра, и всеки от тях запомня стойността sid(session-id), която автоматично се използва във всяко последващо API извикване в заглавката (името в заглавката за този параметър — X-chkp-sid), така че не е необходимо да обработвате допълнително този параметър.
Методът login
Вариант с използване на потребителско име и парола (в примера потребителското име admin и паролата 1q2w3e са предадени като позиционни аргументи):
login = client.login('admin', '1q2w3e') В метода login са налични и допълнителни опционални параметри, посочвам имената им и стойностите по подразбиране:
continue_last_session=False, domain=None, read_only=False, payload=NoneМетодът login_with_api_key
Вариант с използване на API ключ (поддържа се от версия R80.40/Management API v1.6, „3TsbPJ8ZKjaJGvFyoFqHFA==“ това е стойността на API ключа за един от потребителите на управленския сървър с метод за автентикация API ключ):
login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') В метода login_with_api_key са налични същите опционални параметри, както в метода login.
Методът login_as_root
Опция за логин на локалната машина с API сървър:
login = client.login_as_root()За този метод са налични само два опционални параметра:
domain=None, payload=NoneИ накрая, самите API извиквания
Имаме два варианта за извършване на API извиквания чрез методи api_call и api_query. Нека разгледаме каква е разликата между тях.
api_call
Този метод е приложим за всякакви извиквания. Трябва да предадем последната част за API извикването и payload в тялото на заявката, ако е необходимо. Ако payload е празен, то не е нужно да го предаваме:
api_versions = client.api_call('show-api-versions') Изходът за тази заявка под кат:
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'})Изходът за тази заявка под кат:
В [25]: show_host
Out[25]:
APIResponse({
"data": {
"color": "черен",
"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": "черен",
"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
Искам да уточня, че този метод се прилага само за извиквания, чийто изход предвижда offset (преместване). Такъв изход се получава, когато в него се съдържа или може да се съдържа голямо количество информация. Например, това може да е заявка за списък на всички създадени обекти от тип хост на управленския сървър. За такива заявки API връща списък от 50 обекта по подразбиране (може да увеличите лимита до 500 обекта в отговора). И за да не се хакате информацията няколко пъти, променяйки параметъра offset в API заявката, има метод api_query, който автоматично извършва тази работа. Примери за извиквания, при които е необходим този метод: show-sessions, show-hosts, show-networks, show-wildcards, show-groups, show-address-ranges, show-simple-gateways, show-simple-clusters, show-access-roles, show-trusted-clients, show-packages. В действителност, в имената на тези API извиквания виждаме думи в множествено число, така че тези извиквания ще бъдат по-лесни за обработка чрез api_query
show_hosts = client.api_query('show-hosts') Изходът за тази заявка под кат:
В [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
})
Обработка на резултатите от API повиквания
След това можете да използвате променливите и методите на класа APIResponse(както в мениджъра на контекста, така и извън него). Класът APIResponse съдържа 4 метода и 5 променливи, на най-важните ще се спрем по-подробно.

success
Първо, би било добре да се уверите, че API повикването е успешно и е върнало резултат. За целта има метод success:
В [49]: api_versions.success
Out[49]: True
Връща True, ако API повикването е успешно (код на отговора — 200) и False, ако не е успешно (всякакъв друг код на отговора). Удобно е да се използва веднага след API повикването, за да се изведе различна информация в зависимост от кода на отговора.
if api_ver.success:
print(api_versions.data)
else:
print(api_versions.err_message) statuscode
Връща кода на отговора след извършването на API повикването.
В [62]: api_versions.status_code
Out[62]: 400
Възможни кодове на отговорите: 200,400,401,403,404,409,500,501.
set_success_status
Възможно е да има нужда от промяна на стойността на статуса success. Технически, там може да се сложи всичко, дори обикновен низ. Но реален пример може да бъде нулирането на този параметър на False при определени съпътстващи условия. По-долу е даден пример, когато има задачи, изпълнявани на управляващия сървър, но ще считаме, че тази заявка е неуспешна (ще поставим променливата success на False, въпреки че API повикването беше успешно и върна код 200).
for task in task_result.data["tasks"]:
if task["status"] == "failed" or task["status"] == "partially succeeded":
task_result.set_success_status(False)
breakresponse()
Методът response позволява да се види речник с код на отговора (status_code) и с тяло на отговора (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
Позволява да се види само тялото на отговора (body) без излишна информация.
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']}
error_message
Тази информация е достъпна само когато при обработката на API заявка е възникнала грешка (код на отговора не 200). Примерен изход
In [107]: api_versions.error_message
Out[107]: 'code: generic_err_invalid_parameter_namenmessage: Unrecognized parameter [1]n'
Полезни примери
По-долу са изброени примери, в които се използват API повиквания, добавени в версия Management API 1.6.
За начало, нека разгледаме работата на повикванията add-host и add-address-range. Да предположим, че трябва да създадем като обекти от тип хост всички IP адреси от подсет 192.168.0.0/24, чийто последен октет е равен на 5, а всички останали IP адреси да запишем като обекти от тип диапазон адреси. При това, адресът на подсета и широковещателният адрес трябва да бъдат изключени.
И така, по-долу е предоставен скрипт, който решава тази задача и създава 50 обекта от тип хост и 51 обект от тип диапазон адреси. За решението на задачата са необходими 101 API повиквания (без да се броят окончателните повиквания за публикуване). Също така с помощта на модула timeit изчисляваме времето за изпълнение на скрипта до момента на публикуване на промените.
Скрипт с използване на add-host и 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')
В моята лабораторна среда изпълнението на този скрипт отнема от 30 до 50 секунди в зависимост от натоварването на управленския сървър.
А сега да видим как да решим същата задача с помощта на API извикване add-objects-batch, чиято поддръжка е добавена в версия API 1.6. Това извикване позволява с едно API запитване да се създадат много обекти наведнъж. Освен това, те могат да бъдат от различни типове (например хостове, подсети и диапазони от адреси). По този начин задачата ни може да бъде решена в рамките на едно API извикване.
Скрипт с използване на 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')
А изпълнението на този скрипт в моята лабораторна среда отнема от 3 до 7 секунди в зависимост от натоварването на управленския сървър. Тоест, средно, за 101 обекта API извикването от тип batch работи 10 пъти по-бързо. При по-голям брой обекти разликата ще бъде дори по-впечатляваща.
Сега нека разгледаме как да работим с set-objects-batch. С помощта на това API извикване можем масово да променяме всякакъв параметър. Нека настроим първата половина от адресите от предишния пример (до .124 на хоста, включително и диапазоните) в цвят sienna, а на втората половина адреси присвоим цвят khaki.
Промяна на цвета на обектите, създадени в предишния пример
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")
Можете да изтриете множество обекти с един API повик с помощта на delete-objects-batch. Сега нека разгледаме примерен код, който изтрива всички хостове, създадени по-рано чрез add-objects-batch.
Изтриване на обекти с помощта на 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)
Всички функции, които се появяват в новите версии на софтуера Check Point, веднага получават и API извиквания. Така, в R80.40 се появиха функции като Revert to revision и Smart Task, и за тях веднага бяха подготвени съответните API извиквания. Освен това, целият функционал при преминаването от Legacy конзоли в режим Unified Policy също получава поддръжка на API. Например, дългоочакваното обновление в версия R80.40 беше преместването на политиката за HTTPS Inspection от Legacy режим в режим Unified Policy, и тази функционалност веднага получи API извиквания. Ето пример за код, който добавя на най-горната позиция в политиката за HTTPS Inspection правило, което изключва от инспекция 3 категории (Здравеопазване, Финанси, Държавни услуги), които е забранено да се инспектират съгласно законодателството в редица страни.
Добави правило в политиката за HTTPS Inspection
from cpapi import APIClient, APIClientArgs
client_args = APIClientArgs(server="192.168.47.240")
data = {
"layer" : "Default Layer",
"position" : "top",
"name" : "Правни Изисквания",
"action": "bypass",
"site-category": ["Здраве", "Държава / Военни", "Финансови Услуги"]
}
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")
Стартиране на Python скриптове на сървъра за управление Check Point
Все още същото съдържа информация как да стартирате Python скриптове директно от сървъра за управление. Това може да бъде удобно, когато нямате възможност да се свържете с API сървъра от друга машина. Записах шестминутно видео, в което разглеждам инсталацията на модула cpapi и особеностите при стартиране на Python скриптове на сървъра за управление. Като пример се стартира скрипт, който автоматизира конфигурацията на нов шлюз за задача като аудит на мрежата Security CheckUp. От особеностите, с които се сблъсках: в версия Python 2.7 все още не е налична функцията input, затова за обработка на информацията, която въвежда потребителят, се използва функцията raw_input. В останалото, кодът е такъв, какъвто е и за стартиране от други машини, само че е по-удобно да се използва функцията login_as_root, за да не се налага отново да посочвате своите потребителско име, парола и IP адрес на сървъра за управление.

Скрипт за бърза настройка на Security CheckUp
от __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("Не можа да се получи пръстовият отпечатък на сървъра - Проверете свързаността със сървъра.")
# exit(1)
login_res = client.login_as_root()
if login_res.success is False:
print("Неуспешно влизане:n{}".format(login_res.error_message))
exit(1)
gw_name = raw_input("Въведете името на шлюза:")
gw_ip = raw_input("Въведете IP адреса на шлюза:")
if sys.stdin.isatty():
sic = getpass.getpass("Въведете еднократна парола за шлюза (SIC): ")
else:
print("Внимание! Вашата парола ще бъде показана на екрана!")
sic = raw_input("Въведете еднократна парола за шлюза (SIC): ")
version = raw_input("Въведете версията на шлюза (напр. 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("Сигурната връзка с шлюза не е установена!")
exit(1)
elif add_gw.success:
print("Шлюзът беше добавен успешно.")
gw_uid = add_gw.data['uid']
gw_name = add_gw.data['name']
else:
print("Неуспешно добавяне на шлюза - {}".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("Политиката беше променена успешно")
else:
print("Неуспешна промяна на политиката- {}".format(change_policy.error_message))
change_rule = client.api_call("set-access-rule", {"name" : "Правило за почистване", "layer" : "Network", "action": "Accept", "track": {"type": "Detailed Log", "accounting": "true"}})
if change_rule.success:
print("Правилото за почистване беше променено успешно")
else:
print("Неуспешна промяна на правилото за почистване- {}".format(change_rule.error_message))
# публикувайте резултата
publish_res = client.api_call("publish", {})
if publish_res.success:
print("Промените бяха публикувани успешно.")
else:
print("Неуспешно публикуване на промените - {}".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("Достъпната политика беше инсталирана")
else:
print("Неуспешно инсталиране на достъпната политика - {}".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("Политиката за предотвратяване на заплахи беше инсталирана")
else:
print("Неуспешно инсталиране на политиката за предотвратяване на заплахи - {}".format(install_tp_policy.error_message))
# добавяне на пароли и фрази за достъп до речника
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" : "Добавете пароли и фрази за достъп", "script" : "printf "{}" >> $FWDIR/conf/additional_pass.conf".format(line), "targets" : gw_name})
if add_password_dictionary.success:
print("Редът на речника за пароли {} беше добавен успешно".format(line_num))
else:
print("Неуспешно добавяне на речника - {}".format(add_password_dictionary.error_message))
main() Пример на файл с речника на пароли additional_pass.conf
{
"passwords" : ["зловреден софтуер","злонамерен","инфектиран","Инфектиран"],
"phrases" : ["парола","Парола","Парола","парола","код","ключ","пдп","парола","Парола","Ключ","ключ","шифър","Шифър"]
}
Заключение
Тази статия разглежда само основните възможности на работата Python SDK и модула cpapi(както можете да предположите, те всъщност са синоними), и като изучите кода в този модул, ще откриете още повече възможности за работа с него. Не е изключено да получите желанието да го допълните с вашите класове, функции, методи и променливи. Винаги можете да споделяте своите разработки и да преглеждате други скриптове за Check Point в раздела в общността , която обединява както разработчиците на продукти, така и потребителите.
Приятно кодиране и благодаря, че прочетохте до края!
Източник: habr.com
