
Je suis sûr que chacun de ceux qui ont travaillé avec , a eu des réclamations concernant l'impossibilité de modifier la configuration depuis la ligne de commande. C'est particulièrement frustrant pour ceux qui ont auparavant travaillé avec des Cisco ASA, où tout peut être configuré dans l'interface CLI. Avec Check Point, c'est tout le contraire : tous les réglages de sécurité se font exclusivement via l'interface graphique. Cependant, certaines tâches sont vraiment pénibles à réaliser par le biais de l'interface graphique (même celle aussi conviviale que celle de Check Point). Par exemple, l'ajout de 100 nouveaux hôtes ou réseaux devient un processus long et fastidieux. Pour chaque objet, il faut cliquer plusieurs fois et entrer l'adresse IP. Il en va de même pour la création d'un groupe de sites ou pour activer/désactiver massivement les signatures IPS. Dans ce cas, il y a un grand risque de faire une erreur.
Récemment, un "miracle" a eu lieu. Avec la sortie de la nouvelle version Gaia R80 , la possibilité a été annoncée d'utiliser l'API, ce qui ouvre de larges possibilités d'automatisation des réglages, d'administration, de surveillance, etc. Maintenant, il est possible de :
- créer des objets ;
- ajouter ou modifier des listes d'accès ;
- activer/désactiver des blades ;
- configurer des interfaces réseau ;
- installer des politiques ;
- et bien plus encore.
Honnêtement, je ne comprends pas comment cette nouvelle a échappé à Habr. Dans cet article, nous décrirons brièvement comment utiliser l'API et fournirons quelques exemples pratiques de configuration de Check Point à l'aide de scripts.
Je voudrais tout de suite préciser que l'API n'est utilisée que pour le serveur de gestion. C'est-à-dire qu'il est toujours impossible de gérer les passerelles sans serveur de gestion.
À qui cet API peut-elle donc être utile ?
- Administrateurs système qui souhaitent simplifier ou automatiser des tâches répétitives de configuration de Check Point ;
- Entreprises qui souhaitent intégrer Check Point avec d'autres solutions (systèmes de virtualisation, systèmes de tickets, systèmes de gestion de configurations, etc.) ;
- Intégrateurs système qui souhaitent standardiser les configurations ou créer des produits supplémentaires liés à Check Point.
Schéma typique
Et donc, imaginons un schéma typique avec Check Point :

Comme d'habitude, nous avons une passerelle (SG), un serveur de gestion (SMS) et la console de l'administrateur (SmartConsole). Le processus habituel de configuration de la passerelle se présente comme suit :

C'est-à-dire qu'il est d'abord nécessaire de lancer SmartConsole, grâce à laquelle nous nous connectons au serveur de gestion (SMS). Les paramètres de sécurité sont appliqués sur le SMS, puis sont utilisés (politique d'installation) sur la passerelle (SG).
Lorsque vous utilisez Management API, nous pouvons en principe sauter le premier point (démarrage de SmartConsole) et appliquer commandes API directement au serveur de gestion (SMS).
Moyens d'utiliser l'API
Pour modifier la configuration à l'aide de l'API, il existe quatre méthodes principales :
1) À l'aide de l'outil mgmt_cli
Exemple — # mgmt_cli add host name host1 ip-address 192.168.2.100
Cette commande est exécutée à partir de la ligne de commande du serveur de gestion (SMS). Je pense que la syntaxe de la commande est claire — on crée host1 avec l'adresse 192.168.2.100.
2) Saisir les commandes API via clish (en mode expert)
En gros, tout ce dont vous avez besoin, c'est de vous connecter à la ligne de commande (mgmt login) avec un compte utilisé lors de la connexion via SmartConsole (ou le compte root). Ensuite, vous pouvez saisir commandes API (dans ce cas, il n'est pas nécessaire d'utiliser l'outil mgmt_cli). Vous pouvez créer des scripts BASH. Exemple de script qui crée un hôte :
Script 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
Si cela vous intéresse, vous pouvez regarder la vidéo correspondante :

3) Via SmartConsole, en ouvrant la fenêtre CLI
Tout ce que vous devez faire, c'est lancer une fenêtre CLI directement depuis SmartConsole, comme cela est montré sur l'image ci-dessous.

Dans cette fenêtre, vous pouvez commencer à entrer des commandes API immédiatement.
4) Web Services. Utiliser une requête Post HTTPS (REST API)
À notre avis, c'est l'une des méthodes les plus prometteuses, car elle permet de “créer” des applications complètes pour la gestion du serveur de gestion (désolé pour la tautologie). Nous examinerons cette méthode un peu plus en détail ci-dessous.
Pour résumer :
- API + cli convient mieux à ceux qui sont habitués à Cisco ;
- API + shell pour l'utilisation de scripts et l'exécution de tâches routinières ;
- API REST pour l'automatisation.
Activation de l'API
Par défaut, l'API est activée sur les serveurs de gestion avec plus de 4 Go de RAM et les configurations autonomes avec plus de 8 Go de RAM. Vous pouvez vérifier le statut à l'aide de la commande : api status
Si l'API est désactivée, il est assez simple de l'activer via SmartConsole : Gérer & Paramètres > Blades > API de gestion > Paramètres avancés

Ensuite, publier (Publier) les changements et exécuter la commande api restart.
Requêtes Web + Python
Pour exécuter des commandes API, vous pouvez utiliser des requêtes Web avec Python et des bibliothèques requests, json. En termes généraux, la structure de la requête Web se compose de trois parties :
1) Adresse
(https://<serveur de gestion>:<port>/web_api/<commande>)
2) En-têtes HTTP
content-Type: application/json
x-chkp-sid: <token d'identification de session tel que retourné par la commande de connexion>
3) Charge utile de la requête
Texte au format JSON contenant les différents paramètres
Exemple pour appeler différentes commandes :
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' -> Adresse IP GAIA
Voici quelques tâches types auxquelles on est souvent confronté lors de l'administration de Check Point.
1) Exemple de fonctions de connexion et de déconnexion :
Script
payload = {'user': 'votre_utilisateur', 'password' : 'votre_mot_de_passe'}
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) Activation des blades et configuration du réseau :
Script
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) Modification des règles du pare-feu :
Script
new_access_data = {'name':'Règle de nettoyage','layer':'Réseau','action':'Accepter'}
new_access_result = api_call('xxx.xxx.xxx.xxx', 443, 'set-access-rule', new_access_data, sid)
print(json.dumps(new_access_result))
4) Ajouter une couche d'application :
Script
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) Publication et installation de la politique, vérification de l'exécution de la commande (task-id) :
Script
publish_result = api_call('xxx.xxx.xxx.xxx', 443, 'publish', {}, sid)
print("résultat de la publication : " + 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) Ajouter un hôte :
Script
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) Ajouter un champ de prévention des menaces :
Script
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) Voir la liste des sessions
Script
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) Créer un nouveau profil :
Script
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) Changer l'action pour la signature IPS :
Script
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) Ajouter votre service :
Script
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) Ajouter une catégorie, un site ou un groupe :
Script
add_application_site_category={ "name" : "Valve","description" : "Jeux Valve"}
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" : "Jeux","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))
De plus, à l'aide de Web API vous pouvez ajouter et supprimer des réseaux, des hôtes, des rôles d'accès, etc. Il est possible de configurer des lames Antivirus, Antibot, IPS, VPN. Il est même possible d'installer des licences en utilisant la commande run-script. Toutes les commandes API de Check Point peuvent être consultées .
Check Point API + Postman
Il est également pratique d'utiliser Check Point Web API en combinaison avec . Postman a des versions de bureau pour Windows, Linux et MacOS. De plus, il existe un plugin pour Google Chrome. C'est ce que nous allons utiliser. Tout d'abord, il faut trouver Postman dans le Google Chrome Store et l'installer :

Avec cet outil, nous pourrons effectuer des requêtes Web sur l'API Check Point. Pour ne pas avoir à mémoriser toutes les commandes de l'API, il est possible d'importer des collections (modèles) qui contiennent déjà toutes les commandes nécessaires :

vous trouverez collection pour R80.10. Après l'importation, des modèles de commandes API seront disponibles :

À mon avis, c'est très pratique. On peut rapidement commencer le développement d'applications utilisant l'API Check Point.
Check Point + Ansible
Je voudrais également souligner qu'il existe Ansible pour l'API CheckPoint. Le module permet de gérer les configurations, mais il n'est pas aussi pratique pour résoudre des tâches exotiques. Écrire des scripts dans n'importe quel langage de programmation offre des solutions plus flexibles et adaptées.
Sortie
Nous allons probablement conclure notre petite revue de l'API Check Point ici. À mon avis, cette fonctionnalité était très attendue et nécessaire. L'apparition de l'API ouvre de vastes possibilités tant pour les administrateurs systèmes que pour les intégrateurs systèmes travaillant avec les produits Check Point. L'orchestration, l'automatisation, les retours d'information avec SIEM... tout cela est désormais possible.
P.S. Vous pouvez trouver davantage d'articles sur comme toujours dans notre blog ou dans le blog sur .
P.S.S. Pour poser des questions techniques liées à la configuration de Check Point, vous pouvez
Seuls les utilisateurs enregistrés peuvent participer au sondage. , s'il vous plaît.
Envisagez-vous d'utiliser l'API ?
70,6%Oui12
23,5%Non4
5,9%J'utilise déjà1
17 utilisateurs ont voté. 3 utilisateurs se sont abstenus.
Source : habr.com
