Ga naar inhoud

De JSON-bestanden bewerken met schemaondersteuning

Firewallregels, IP groups, Application Gateways, WAF policies en spokes zijn JSON-bestanden. Elk type heeft een JSON-schema dat beschrijft welke properties bestaan, welke verplicht zijn en welke waarden zijn toegestaan. Een editor die het schema kent (Visual Studio Code doet dat, met een kleine instelling) helpt je tijdens het typen: hij stelt properties voor, toont de toegestane waarden en onderstreept fouten. Deze pagina laat zien hoe je dit instelt en hoe je het gebruikt. De runbooks vertellen je wat je in de bestanden zet. Deze pagina helpt je om het er zonder fouten in te zetten.

Welke schema's er zijn

De pipelines valideren de bestanden tegen de schema's van de coderepository, in de config tests die vóór elke deployment draaien (Pipelines). Dezelfde schema's zijn ook voor jou beschikbaar.

Bestanden Schema (in src/Xebia.Mcp/Files/json/ van de coderepository) Map in de configuratierepository
Rule collection groups van de firewall firewallschema.json firewall_rule_configuration/
Application Gateways appgwschema.json application_gateways/
WAF policies wafpolicyschema.json web_application_firewall_policies/
Spokes spokeschema.json spokes/
IP groups een klein schema, zie hieronder ip_groups/

Schemanamen zijn afhankelijk van de versie

Oudere how-to's gebruiken andere bestandsnamen voor de schema's (bijvoorbeeld applicationgatewayschema.json). Gebruik de bestanden van de codeversie die je draait. Kopieer ze na elke upgrade opnieuw, zodat de editor niet waarschuwt voor properties die in de nieuwe versie wel geldig zijn.

De schema's aan de bestanden koppelen

Visual Studio Code koppelt een schema op basis van het pad aan bestanden. Maak het bestand .vscode/settings.json aan in de root van de configuratierepository en kopieer de schemabestanden die je nodig hebt ernaast (de root van de repository) of naar een map naar keuze, en pas url aan:

{
  "json.schemas": [
    {
      "fileMatch": ["/**/firewall_rule_configuration/**/*.json"],
      "url": "./firewallschema.json"
    },
    {
      "fileMatch": ["/**/ip_groups/**/*.json"],
      "url": "./ipgroupschema.json"
    },
    {
      "fileMatch": ["/**/application_gateways/**/*.json"],
      "url": "./appgwschema.json"
    },
    {
      "fileMatch": ["/**/web_application_firewall_policies/**/*.json"],
      "url": "./wafpolicyschema.json"
    }
  ]
}

Elke regel zegt: gebruik voor elk bestand waarvan het pad overeenkomt met fileMatch het schema op url. Open een regelbestand om te controleren of het werkt. Open het Problems-paneel, of typ met opzet een verkeerde waarde en kijk of de editor reageert.

Wat de editor je vertelt

Drie dingen helpen het meest. De beschrijvingen hieronder gelden voor Visual Studio Code. Andere editors met ondersteuning voor JSON-schema's werken op een vergelijkbare manier.

Suggesties voor properties. Zet de cursor in een object, bijvoorbeeld in een regel, en druk op Ctrl+Space. De editor toont de properties die het schema daar toestaat en die je nog niet hebt toegevoegd. In een lege regel zie je protocols, source_addresses, source_ip_groups, enzovoort. Gebruik dit om te zien welke properties een regeltype nodig heeft, in plaats van een oude regel te kopiëren.

Suggesties voor waarden. Zet de cursor achter een property met een vaste set waarden, bijvoorbeeld achter "action":, en druk op Ctrl+Space. De editor toont de toegestane waarden (voor een network rule collection Allow en Deny). Hetzelfde werkt overal waar het schema vaste waarden opsomt, bijvoorbeeld de FQDN-tags van een application rule (WindowsUpdate, AzureBackup, enzovoort) en de subnetdelegaties in een spoke-bestand, dat een lange lijst namen heeft.

Validatiefouten. Een property of waarde die niet in het schema past krijgt een golvende onderstreping. De kleur geeft de ernst aan: rood is een fout, geel een waarschuwing. Beweeg de muis over de onderstreping om de reden te lezen, of open het Problems-paneel voor de lijst met alle bevindingen in het bestand. Typische meldingen:

Melding (ingekort) Betekenis
Missing property "<name>" Een verplichte property ontbreekt. Het firewallbestand heeft alle drie de collection-maps nodig (nat_rule_collections, network_rule_collections, application_rule_collections), ook als ze leeg zijn.
Value is not accepted. Valid values: ... De waarde staat niet in de lijst. Controleer de spelling en de hoofdletters (Allow, niet allow).
Incorrect type. Expected "array" Een lijst is als losse waarde geschreven. Schrijf ["443"], niet "443".
String does not match the pattern of "..." De tekst volgt niet het vereiste formaat, bijvoorbeeld een IP-adres of CIDR met een verkeerde prefix, of een naam met tekens die niet zijn toegestaan.
Property <name> is not allowed De property bestaat niet in dit schema, vaak een typefout. Controleer de spelling voordat je het negeert.

Twee praktische tips:

  • Los de rode onderstrepingen op voordat je commit. De pipeline faalt er toch op, en een pull request waarvan de checks falen blijft op je wachten.
  • Formatteer het bestand (Shift+Alt+F) voordat je commit, zodat de diff alleen de echte wijziging toont.

Wat het schema niet controleert

Het schema controleert één bestand afzonderlijk. Deze controles doen de config tests van de pipeline, die je lokaal kunt draaien (De tests lokaal draaien):

  • dat een IP group waarnaar wordt verwezen bestaat in een ip_groups-map;
  • dat prioriteiten van rule collection groups uniek zijn per map, en dat NAT-prioriteiten lager zijn dan network-prioriteiten, die op hun beurt lager zijn dan application-prioriteiten;
  • dat een regel maar één brontype en één doeltype heeft;
  • dat verwijzingen in een Application Gateway naar bestaande keys wijzen;
  • dat de management group van een spoke bestaat en dat de spoke-omgeving in de pipelinelijst staat.

Niet elke combinatie die het schema accepteert wordt ook door de Terraform-code geaccepteerd, en andersom. In het spoke-schema zijn sommige keys die Terraform leest niet beschreven, en een paar worden afgewezen (Bekende problemen). Als de editor en de pipeline het oneens zijn, wint de pipeline.

IP group-schema

Het IP group-bestand heeft maar twee properties. Dit schema, in JSON schema draft 07, accepteert een IPv4-adres met een optionele prefixlengte van /0 tot /32:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "ip_group": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "cidrs": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})\\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(?:\\/(3[0-2]|[12]?[0-9]))?$"
          }
        }
      },
      "additionalProperties": false,
      "required": ["name", "cidrs"]
    }
  },
  "additionalProperties": false,
  "required": ["ip_group"]
}

Sla het op als ipgroupschema.json naast de andere schema's. Het patroon controleert de notatie, niet de betekenis: het vindt geen adresbereik dat je niet zou moeten gebruiken.