Hoppa till huvudinnehållet

ServiceNow

fremforge kan öppna en incident i ServiceNow för varje säkerhetshändelse: ett nytt kritiskt eller allvarligt fynd, en träff på skadlig kod, en blockerad pull, en policyöverträdelse eller ett riskaccepterande som har löpt ut. Mottagaren postar direkt till Table API (POST /api/now/table/incident), så ServiceNow behöver bara en integrationsanvändare – inget Scripted REST API och ingen MID-server.

1. ServiceNow-sidan: en integrationsanvändare

  1. Skapa en användare för fremforge, till exempel fremforge.integration. Kryssa i Web service access only.
  2. Ge den en roll som får skapa incidenter via Table API, vanligtvis itil, eller en snävare egen roll med create på incident.
  3. Välj hur fremforge ska autentisera sig:
    • Basic: användarens namn och lösenord, skickade som Authorization: Basic <base64 of user:password>.
    • OAuth bearer: en OAuth-token för användaren, skickad som Authorization: Bearer <token>. En åtkomsttoken för OAuth i ServiceNow går ut, så en token som håller på att gå ut måste ersättas på mottagaren innan den slutar gälla. Basic är det enklare valet för en maskinanvändare.
  4. Valfritt: anteckna sys_id för den tilldelningsgrupp som ska ta emot incidenterna, och för den anmälare som ska registreras.

ServiceNow måste ta emot anrop från fremforges utgående adress. Om din instans begränsar källadresser, be supporten om den aktuella adressen.

2. fremforge-sidan: en mottagare i ServiceNow-format

Med API:et (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

Värdet i auth_header lagras krypterat och visas aldrig igen. Svaret innehåller "auth_header_set": true. För att byta lösenordet skickar du en PATCH med en ny auth_header.

Skicka sedan en testincident och läs resultatet:

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"

201 i response_status betyder att ServiceNow skapade incidenten. 401 betyder att inloggningsuppgifterna är fel. 403 betyder att användaren saknar rollen för att skapa incidenter.

Vad incidenten innehåller

Fält i incidentenVärde
short_description[fremforge] följt av händelsens titel, till exempel [fremforge] CVE-2026-12345 in lodash 4.17.20 (högst 160 tecken)
descriptionHändelsens namn, organisation, repo, allvarlighetsgrad, tidpunkt, korrelationsnyckel, en länk till fremforge-konsolen och händelsens detaljer som JSON
urgency, impact1 för kritisk, 2 för allvarlig, annars 3
correlation_idfremforge: följt av fyndets korrelationsnyckel. En nyckel som är för lång för fältet ersätts med en stabil SHA-256 av den
correlation_displayfremforge
assignment_group, caller_id, category, subcategoryBara när de är angivna på mottagaren (objektet servicenow)

ServiceNow beräknar incidentens prioritet utifrån urgency och impact som vanligt.

Varje händelse skapar en ny incident. Table API uppdaterar inte en befintlig post. Händelser om samma fynd har samma correlation_id. Ett exempel är ett fynd som senare följs av att ett riskaccepterande för det löper ut. Använd värdet i en business rule eller ett listfilter i ServiceNow för att gruppera dem. Timtaket begränsar hur många incidenter en mottagare kan öppna per timme. När taket har nåtts följer en sammanfattande incident efter timmen.

Anropet är också signerat (X-Fremforge-Signature). Table API ignorerar signaturen; det är auth-headern som autentiserar anropet.

Alternativ: egen logik i ett Scripted REST API

Vill du uppdatera en befintlig incident i stället för att skapa en ny, eller mappa fälten på ett annat sätt, behåller du mottagarens format Generic och pekar den mot en Scripted REST API-resurs. Skriptet tar emot den generiska payloaden. Slå upp en öppen incident via correlation_id och uppdatera den, eller skapa en ny. För att verifiera signaturen i skriptet beräknar du HMAC-SHA256 över <X-Fremforge-Timestamp>.<raw body> med mottagarens signeringshemlighet och jämför med v1-delen av X-Fremforge-Signature. Skydda resursen med samma integrationsanvändare och auth_header.

Relaterat