Naar de hoofdinhoud

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

  1. Maak een gebruiker aan voor fremforge, bijvoorbeeld fremforge.integration. Vink Web service access only aan.
  2. Geef deze gebruiker een rol die via de Table API incidenten mag aanmaken, meestal itil, of een beperktere eigen rol met create op incident.
  3. 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.
  4. Optioneel: noteer de sys_id van 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" }
}
EOF

De 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

IncidentveldWaarde
short_description[fremforge] gevolgd door de titel van de gebeurtenis, bijvoorbeeld [fremforge] CVE-2026-12345 in lodash 4.17.20 (maximaal 160 tekens)
descriptionNaam van de gebeurtenis, organisatie, repository, ernst, tijdstip, correlatiesleutel, een link naar de fremforge-console en de details van de gebeurtenis als JSON
urgency, impact1 voor kritiek, 2 voor hoog, anders 3
correlation_idfremforge: 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_displayfremforge
assignment_group, caller_id, category, subcategoryAlleen 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