Sous-ensemble de l'API NSX Policy
La partie de l'API NSX Policy servie pour le pare-feu distribué : chemins, objets, correspondance avec les objets du pare-feu, différences et limites.
Kyvernon sert un sous-ensemble de l'API NSX Policy au-dessus de son propre pare-feu distribué, afin que des outils écrits pour cette API puissent gérer des groupes, des services, des stratégies de sécurité, des règles et des étiquettes de machines virtuelles. Ce n'est pas NSX. NSX est nommé ici pour décrire l'API que parlent les outils existants, et la compatibilité n'est revendiquée que pour les points d'accès, les champs et les outils listés sur cette page. Les objets écrits par ce point d'accès sont des objets de pare-feu ordinaires : la console, la CLI et l'API native les montrent et les modifient aussi.
Activation du point d'accès
Le point d'accès est désactivé par défaut et dispose de son propre écouteur avec le certificat TLS du contrôleur. La console ne propose pas ces paramètres ; ils font partie de la configuration du contrôleur (voir Configuration), dans la section [facades.nsx].
| Clé | Par défaut | Signification |
|---|---|---|
enabled | false | Servir le point d'accès. Il est indépendant de enabled dans [facades] |
listen | 0.0.0.0:8445 | L'adresse et le port de l'écouteur |
product_version | 4.1.2.0.0 | La version que GET /api/v1/node/version indique. Les clients activent des fonctions d'après elle |
Les clients se connectent avec HTTP Basic à chaque requête, ou avec POST /api/session/create (j_username et j_password), qui répond par un cookie JSESSIONID ; les écritures portent ensuite l'en-tête X-XSRF-TOKEN. Les deux sont des connexions de façade, la stratégie de connexion des points d'accès de compatibilité s'applique donc : par défaut, le compte a besoin d'une attribution de rôle. Les privilèges sont les privilèges natifs du pare-feu (Kyvernon.Firewall.*), voir Référence du pare-feu.
Portées
| Portée | Préfixe de chemin sous /policy/api/v1 | Objets |
|---|---|---|
| Fournisseur | /infra | Les objets du fournisseur |
| Un locataire, comme projet NSX | /orgs/default/projects/{tenant}/infra | Les objets d'un locataire. Un utilisateur de locataire travaille dans son propre projet |
Seul le domaine default existe. Les locataires sont listés, en lecture seule, sous /orgs/default/projects.
Points d'accès servis
Sous /policy/api/v1, avec {scope} comme dans le tableau ci-dessus.
| Point d'accès | Méthodes |
|---|---|
{scope} | GET ; PATCH et PUT avec un corps hiérarchique |
{scope}/domains, {scope}/domains/default | GET |
{scope}/domains/default/groups, .../groups/{id} | GET liste ; GET, PUT, PATCH, DELETE |
.../groups/{id}/members/virtual-machines, .../members/ip-addresses | GET |
{scope}/services, {scope}/services/{id} | GET liste ; GET, PUT, PATCH, DELETE |
{scope}/domains/default/security-policies, .../security-policies/{id} | GET liste ; GET, PUT, PATCH, DELETE |
.../security-policies/{id}/rules, .../rules/{rid} | GET liste ; GET, PUT, PATCH, DELETE |
.../security-policies/{id}/statistics, .../rules/{rid}/statistics | GET |
{scope}/realized-state/status?intent_path= | GET : REALIZED, IN_PROGRESS ou ERROR |
{scope}/realized-state/virtual-machines, .../enforcement-points/default/virtual-machines | GET avec external_id ou display_name |
.../enforcement-points/default/virtual-machines?action=update_tags | POST avec {virtual_machine_id, tags} |
{scope}/realized-state/virtual-machines/{id}/tags | POST avec {tags}, remplace les étiquettes |
{scope}/realized-state/enforcement-points/default/vifs | GET avec owner_vm_id |
/search/query?query=, /search?query= | GET |
/orgs, /orgs/default, /orgs/default/projects, /orgs/default/projects/{id} | GET |
En dehors de /policy/api/v1 :
| Point d'accès | Méthodes |
|---|---|
/api/session/create, /api/session/destroy | POST |
/api/v1/node/version | GET |
/api/v1/fabric/virtual-machines | GET ; POST avec ?action=update_tags, add_tags ou remove_tags et {external_id, tags} |
Les listes répondent {results, result_count, cursor} et acceptent page_size et cursor. Chaque objet porte id, display_name, description, path, parent_path, relative_path, unique_id, resource_type, tags, _revision, _create_time, _create_user, _last_modified_time, _system_owned, _protection et marked_for_delete, qui vaut toujours false. PUT répond avec l'objet, PATCH et DELETE avec un 200 vide, et supprimer un objet absent n'est pas une erreur. _revision est la version de l'enregistrement, et un PUT avec une version périmée échoue avec 412.
Objets et correspondance
| Objet NSX | Champs acceptés | Objet Kyvernon et limites |
|---|---|---|
| Group | expression, group_type, tags | Un groupe de pare-feu. Une Condition sur VirtualMachine avec la clé Tag et l'opérateur EQUALS (valeur scope|tag) devient un critère d'étiquette ; AND est permis entre conditions d'étiquettes, OR entre critères, et les critères sont au nombre de 64 au plus. NestedExpression devient un groupe imbriqué. IPAddressExpression accepte des adresses, des préfixes et des plages a-b. MACAddressExpression liste des adresses MAC. PathExpression accepte des chemins de groupes de la même portée ou de celle du fournisseur et /infra/segments/network-N (un réseau sur pont d'hôte). ExternalIDExpression accepte des UUID d'instance de machines virtuelles, et des cartes réseau sous la forme <instance UUID>-<device key>. group_type est enregistré sans effet |
| Service | service_entries, service_type, tags | Un service de pare-feu nommé. L4PortSetServiceEntry (TCP, UDP, avec destination_ports et source_ports), ICMPTypeServiceEntry (ICMPv4, ICMPv6, icmp_type, icmp_code) et IPProtocolServiceEntry (protocol_number) |
| SecurityPolicy | category, sequence_number, stateful, tcp_strict, scope, locked, comments, rules, tags | Une stratégie de pare-feu. Les catégories sont Emergency et Infrastructure (fournisseur seulement), Environment et Application. scope est la liste des cibles : ANY ou des chemins de groupes. Le sequence_number n d'un locataire est la séquence 1 000 000 + n de la stratégie ; les stratégies du fournisseur restent sous 1 000 000. tcp_strict et comments sont enregistrés sans effet |
| Rule | sequence_number, source_groups, destination_groups, sources_excluded, destinations_excluded, services, service_entries, action, direction, ip_protocol, logged, disabled, scope, profiles, notes, tag, tags ; en lecture seule : rule_id | Une règle de pare-feu. Les groupes sont des chemins, ANY, ou des adresses, préfixes et plages littéraux. ALLOW, DROP, REJECT et JUMP_TO_APPLICATION correspondent à allow, drop, reject et pass. ip_protocol vaut IPV4, IPV6 ou IPV4_IPV6. profiles doit être vide ou ANY. Les règles sont ordonnées par sequence_number, et rule_id est le numéro de la règle |
| VirtualMachine | external_id, display_name, power_state, tags, compute_ids | Une machine virtuelle. external_id est son UUID d'instance. Une étiquette avec scope et tag est l'étiquette d'inventaire tag dans la catégorie scope ; une portée vide utilise la catégorie nsx |
| Statistics | packet_count, byte_count, hit_count | Les compteurs de la règle. hit_count égale les paquets, et les champs de sessions valent 0 |
Une plage d'adresses devient la plus petite liste de préfixes qui couvre exactement cette plage, 256 au plus, et le point d'accès renvoie la plage telle qu'elle a été écrite.
Les services intégrés sont en lecture seule (_system_owned vaut true) : SSH, HTTP, HTTPS, DNS, DNS-UDP, NTP, SMTP, SMTP_TLS, SMTP-Submission, IMAP, IMAPS, POP3, POP3S, RDP, VNC, FTP, TFTP, LDAP, LDAP-UDP, LDAP-over-SSL, KERBEROS, KERBEROS-UDP, SNMP, SNMP-Trap, Syslog-UDP, Syslog-TCP, MySQL, PostgreSQL, MS-SQL-S, DHCP-Server, DHCP-Client, ICMP_Echo_Request, ICMP_Echo_Reply, ICMPv6_Echo_Request, ICMPv6_Echo_Reply, ICMP-ALL et ICMPv6-ALL.
Identité, noms et écritures simultanées
- L'identifiant est choisi par le client, comme dans NSX, et est unique par portée. Un objet créé par l'API native apparaît sous son identifiant natif, tel que
fwgroup-3, et les clients ne peuvent pas créer d'objets sous des identifiants de cette forme. display_namen'a pas besoin d'être unique et peut compter jusqu'à 255 caractères. Le point d'accès le renvoie tel qu'il a été écrit. L'objet de pare-feu qui se trouve derrière a un nom unique que Kyvernon dérive : les caractères de contrôle,/et\deviennent_, unsys:initial reçoit le préfixensx-, et un nom déjà pris ou de plus de 80 caractères est raccourci et suivi de l'identifiant entre crochets. Après une modification par une autre surface, le point d'accès affiche le nom natif.- Les champs pour lesquels le modèle du pare-feu n'a pas de place, comme
tcp_strict, sont conservés tels que le client les a écrits et renvoyés inchangés tant que l'objet n'est pas modifié par une autre surface. - Les écritures simultanées, comme les ressources parallèles de Terraform, sont chacune calculées à partir de l'état qu'elles ont lu. Une écriture qui perd la course contre un autre auteur est rejouée sur le nouvel état, jusqu'à 12 fois. Seule une
_revisionpérimée du client est refusée. - Une écriture par le point d'accès déclenche les mêmes événements que l'API native, par exemple quand une règle est ajoutée, modifiée, supprimée ou déplacée.
- Les étiquettes que ce point d'accès a créées pour des machines virtuelles sont supprimées avec leur dernier usage, sauf si un groupe de pare-feu les nomme. Les étiquettes portent la description
Created for NSX tags. Les utilisateurs de locataire ne voient ni ne modifient les catégories d'étiquettes que le fournisseur gère.
Appel hiérarchique
PATCH et PUT sur {scope} acceptent un corps Infra avec ChildResourceReference ou ChildDomain du domaine default. En dessous, ChildGroup, ChildSecurityPolicy avec des enfants ChildRule, et ChildService au niveau supérieur sont servis ; marked_for_delete supprime un objet. Tout autre enfant est refusé avec sa position dans le corps. Le corps entier est vérifié comme un tout : Kyvernon valide les objets et le résultat, et applique tout ou rien. Les objets que le corps crée peuvent se référencer entre eux. C'est l'appel que le fournisseur Terraform NSX utilise pour écrire les stratégies de sécurité.
Recherche
GET /policy/api/v1/search/query?query= accepte des termes joints par AND : field:value sur resource_type, id, display_name, path, parent_path, marked_for_delete, external_id, tags.scope, tags.tag ou tout champ de texte de premier niveau, et des valeurs seules, qui correspondent à l'identifiant, au nom affiché, à l'identifiant externe et au chemin. * est un caractère générique, \ échappe, et les guillemets sont permis. Les types de ressource sont Group, Service, SecurityPolicy, Rule, VirtualMachine, Domain et Project. OR, NOT, les parenthèses et les intervalles sont refusés.
Erreurs
Le point d'accès répond avec le corps d'erreur NSX (httpStatus, error_code, module_name, error_message, related_errors) et l'identifiant de message natif dans details.
| Identifiant de message | Signification |
|---|---|
error.nsx.unsupported | La requête utilise un champ ou une zone hors du sous-ensemble. Le message le nomme |
error.nsx.invalid | Un champ a une valeur non valide |
error.nsx.not_found | Le chemin ne désigne aucun objet que le compte puisse voir |
error.nsx.revision | La _revision de l'écriture est périmée |
error.nsx.read_only | Un objet intégré, ou un utilisateur de locataire qui écrit dans /infra |
error.nsx.xsrf | Une écriture sans X-XSRF-TOKEN valide |
Les erreurs de l'API native gardent leur identifiant error.firewall.* ; voir Erreurs du pare-feu.
Différences et limites
| Élément | Comportement |
|---|---|
Groupes d'identité (IdentityGroupExpression) | Refusés. Ils exigent un service d'annuaire et un agent dans chaque invité qui signale les connexions d'utilisateurs, que la plateforme n'a pas. Groupez plutôt les machines virtuelles par étiquette |
| Autres expressions | Les conditions sur d'autres clés ou types de membres, et les expressions de ports de segment, sont refusées avec le champ nommé |
tcp_strict, comments, group_type | Enregistrés et renvoyés, sans effet |
locked: true, connectivity_strategy, plannings | Refusés |
Catégorie Ethernet | Refusée |
profiles d'une règle | Doit être vide ou ANY |
source_ports | Accepté dans les services et dans les service_entries d'une règle |
| Zones hors du sous-ensemble | Répondent 400 error.nsx.unsupported avec la fonction nommée : stratégies de passerelle, segments, passerelles tier-0 et tier-1, profils de contexte, IDS, redirection, stratégies de point de terminaison et de transfert, liste d'exclusion et paramètres d'infrastructure, répartiteurs de charge, pools et blocs d'adresses IP, plannings, sections de pare-feu de l'API Manager, et domaines autres que default |
| État d'application | REALIZED quand chaque hôte connecté a appliqué la modification, ERROR tant qu'un hôte signale une erreur de pare-feu, IN_PROGRESS sinon |
| Nombres de sessions | Les champs de sessions des statistiques valent toujours 0 |
| Après un renommage par une autre surface | Le point d'accès affiche le nom natif, qui peut porter un suffixe |
| PowerCLI | Les scripts qui appellent les mêmes chemins fonctionnent dans les limites des chemins et champs ci-dessus ; ils n'ont pas été exécutés contre le point d'accès |
Vérifié avec Terraform
Le fournisseur Terraform NSX vmware/nsxt 3.12.2 a été exécuté contre le point d'accès pour la création, la lecture, la mise à jour, l'import et la destruction.
| Élément | Opérations qui fonctionnent |
|---|---|
nsxt_policy_service (ensemble de ports, entrées ICMP et de protocole IP, étiquettes) | Création, lecture, mise à jour, suppression |
nsxt_policy_group (conditions d'étiquettes, adresses et plages, adresses MAC, chemins, identifiants externes, contexte de projet) | Création, lecture, mise à jour, import, suppression |
nsxt_policy_security_policy | Création, lecture, mise à jour, suppression |
nsxt_policy_parent_security_policy | Création, lecture, suppression |
nsxt_policy_security_policy_rule | Création, lecture, suppression |
nsxt_policy_vm_tags | Création, lecture, suppression |
Sources de données nsxt_policy_service, nsxt_policy_group, nsxt_policy_vm, nsxt_policy_project | Lecture |
Le côté vSphere de Terraform est décrit dans Fournisseur Terraform vSphere.
Voir aussi
Version 0.1. Dernière modification : 2026-11-14