ServiceNow
fremforge kan voor elke beveiligingsgebeurtenis een ServiceNow-incident openen: een nieuwe kritieke of hoge bevinding, een malwaretreffer, een geblokkeerde pull, een beleidsovertreding of een verlopen risicoacceptatie. De bestemming stuurt rechtstreeks naar de Table API (POST /api/now/table/incident), dus ServiceNow heeft alleen een integratiegebruiker nodig, en geen Scripted REST API of MID Server.
1. ServiceNow-kant: een integratiegebruiker
- Maak een gebruiker aan voor fremforge, bijvoorbeeld
fremforge.integration. Vink Web service access only aan. - Geef deze gebruiker een rol die via de Table API incidenten mag aanmaken, meestal
itil, of een beperktere eigen rol metcreateopincident. - Kies hoe fremforge zich authenticeert:
- Basic: de naam en het wachtwoord van de gebruiker, verzonden als
Authorization: Basic <base64 of user:password>. - OAuth-bearer: een OAuth-token voor die gebruiker, verzonden als
Authorization: Bearer <token>. Een OAuth-toegangstoken van ServiceNow verloopt, dus een aflopend token moet op de bestemming worden vervangen voordat het verloopt. Basic is de eenvoudigere keuze voor een machinegebruiker.
- Basic: de naam en het wachtwoord van de gebruiker, verzonden als
- Optioneel: noteer de
sys_idvan de toewijzingsgroep die de incidenten moet ontvangen, en van de melder die moet worden vastgelegd.
ServiceNow moet verzoeken vanaf het uitgaande adres van fremforge accepteren. Beperkt je instantie de bron-IP’s, vraag dan support om het actuele adres.
2. fremforge-kant: een bestemming in ServiceNow-formaat
Met de API (scope webhooks:write):
AUTH="Basic $(printf '%s' 'fremforge.integration:<password>' | base64)"
curl -sS -X POST "https://frem.sh/_app/api/v1/orgs/acme/webhooks/destinations" \
-H "Authorization: Bearer $FREMFORGE_TOKEN" -H "Content-Type: application/json" \
-d @- <<EOF
{
"name": "ServiceNow incidents",
"target_url": "https://acme.service-now.com/api/now/table/incident",
"events": ["security.finding.created", "security.malware.matched",
"security.pull.blocked", "security.policy.violation",
"security.exception.expired"],
"payload_format": "servicenow",
"security_min_severity": "critical",
"security_hourly_cap": 50,
"servicenow": { "assignment_group": "<sys_id>", "category": "security" },
"auth_header": { "name": "Authorization", "value": "$AUTH" }
}
EOFDe waarde van auth_header wordt versleuteld opgeslagen en nooit meer getoond. Het antwoord bevat "auth_header_set": true. Om het wachtwoord te vervangen, stuur je een PATCH met een nieuwe auth_header.
Stuur daarna een testincident en lees het resultaat:
curl -sS -X POST "https://frem.sh/_app/api/v1/orgs/acme/webhooks/destinations/$ID/test" \
-H "Authorization: Bearer $FREMFORGE_TOKEN"
curl -sS "https://frem.sh/_app/api/v1/orgs/acme/webhooks/deliveries?destination_id=$ID&limit=1" \
-H "Authorization: Bearer $FREMFORGE_TOKEN"Een 201 in response_status betekent dat ServiceNow het incident heeft aangemaakt. Een 401 betekent dat de inloggegevens niet kloppen. Een 403 betekent dat de gebruiker de rol mist om incidenten aan te maken.
Wat het incident bevat
| Incidentveld | Waarde |
|---|---|
short_description | [fremforge] gevolgd door de titel van de gebeurtenis, bijvoorbeeld [fremforge] CVE-2026-12345 in lodash 4.17.20 (maximaal 160 tekens) |
description | Naam van de gebeurtenis, organisatie, repository, ernst, tijdstip, correlatiesleutel, een link naar de fremforge-console en de details van de gebeurtenis als JSON |
urgency, impact | 1 voor kritiek, 2 voor hoog, anders 3 |
correlation_id | fremforge: gevolgd door de correlatiesleutel van de bevinding. Een sleutel die te lang is voor het veld, wordt vervangen door een stabiele SHA-256 ervan |
correlation_display | fremforge |
assignment_group, caller_id, category, subcategory | Alleen als ze op de bestemming zijn ingesteld (object servicenow) |
ServiceNow berekent de prioriteit van het incident zoals gebruikelijk uit urgency en impact.
Elke gebeurtenis maakt een nieuw incident aan. De Table API werkt geen bestaand record bij. Gebeurtenissen over dezelfde bevinding hebben dezelfde correlation_id. Een voorbeeld is een bevinding die later wordt gevolgd door het verlopen van een risicoacceptatie erop. Gebruik die waarde in een business rule of lijstfilter in ServiceNow om ze te groeperen. Het maximum per uur begrenst hoeveel incidenten één bestemming per uur kan openen. Boven dat maximum volgt na afloop van het uur één samenvattend incident.
Het verzoek is ook ondertekend (X-Fremforge-Signature). De Table API negeert de handtekening; de auth-header authenticeert het verzoek.
Alternatief: je eigen logica in een Scripted REST API
Wil je een bestaand incident bijwerken in plaats van een nieuw aan te maken, of velden anders koppelen, laat het formaat van de bestemming dan op Generieke JSON (ondertekend) staan en richt hem op een resource van een Scripted REST API. Het script ontvangt de generieke body. Zoek een open incident op via correlation_id en werk het bij, of voeg een nieuw toe. Om de handtekening in het script te verifiëren, bereken je HMAC-SHA256 over <X-Fremforge-Timestamp>.<raw body> met het ondertekeningssecret van de bestemming en vergelijk je die met het v1-deel van X-Fremforge-Signature. Bescherm de resource met dezelfde integratiegebruiker en de auth_header.
Gerelateerd
- Webhooks voor beveiligingsmeldingen: gebeurtenissen, body, handtekening, nieuwe pogingen en het maximum.
- Doorsturen naar een SIEM: het volledige auditlog naar een SIEM.