Sophos SIEM: HTTP Ingest en parser met een voorbeeld controleren
Dit voorbeeld verbindt een synthetische JSON-bron met HTTP Ingest, een Custom Parser voor het Auth-schema en gericht zoeken. Het laat zo het traject tussen de afzonderlijke handleidingen voor HTTP Ingest en Custom Parsers zien. Het voorbeeld meldt alleen fictieve laboratoriumaanmeldingen; het voert geen echte gebruikersaanmelding uit en controleert geen toegangsgegevens.
Het laboratorium voorbereiden en succes bepalen
Nodig zijn een testtenant met Next-Gen SIEM-subscription, een geautoriseerde Admin- of Super Admin-rol en een goedgekeurde computer met Python 3 en HTTPS-toegang tot het toegewezen ingest-endpoint. De SIEM-planning legt licentie- en bewaarbeperkingen uit. Bestaande XDR-toegang alleen volstaat niet voor maatwerktransport en Custom Parsers.
Het laboratoriumformaat is bewust nauw begrensd: één JSON-melding per POST, het hieronder getoonde veldformaat en de vaste bron avanet-lab-source. De HTTP-help beschrijft HTTPS-POST met Bearer-token, maar legt daar geen algemene responsebody, statuscode of payloadomhulsel voor alle bronnen vast. Controleer vóór de verzendtest het daadwerkelijk verstrekte endpoint en de actuele voorschriften. Vereist de concrete implementatie een andere bodyopbouw, pas die dan eerst aan volgens de bijbehorende documentatie; de template is geen universele ingest-API-specificatie.
Documenteer vóór de start tenant, verantwoordelijke, integratienaam, parsernaam en testtijd. Het verwachte resultaat bestaat uit drie afzonderlijke bewijzen:
- De goedgekeurde laboratoriumbron heeft precies de bedoelde melding verzonden.
- De parser wijst de fictieve bronwaarden correct toe aan het Auth-schema.
- De melding is in de juiste tenant met passende tijd, bron en testkenmerk terug te vinden.
Een HTTP-succes, groene connector of syntactisch geldig script alleen doorstaat deze acceptatie niet. Er wordt geen detectie of MDR-behandeling van deze laboratoriumgebeurtenis verwacht.
Testformaat en volledige parsertemplate
De laboratoriumbron gebruikt deze enkele JSON-regel:
{"product":"avanet-siem-lab","schema_version":1,"event_type":"logon","sensor_id":"avanet-lab-source","user":"pilot-user","src_ip":"192.0.2.25","session_id":"avanet-lab-20261029T101500Z","time":"2026-10-29T10:15:00Z","result":"success"}
192.0.2.25 is een documentatieadres. pilot-user is geen tenantgebruiker. De session_id is een kenmerk van deze fictieve laboratoriumrun, niet de sessie-ID van een echte aanmelding. Bij de latere verzendtest maakt het script een actuele UTC-tijd en nieuw kenmerk; het vaste voorbeeldtijdstip dient alleen voor de parsereditor.
Maak onder Security Operations > Integrations > Custom Parsers > Add Custom Parser een nieuwe parser met de naam AVANET_LAB_JSON_AUTH. Selecteer Standalone, bronformaat JSON en doelschema Auth. Overschrijf of verruim geen bestaande globale parsers. De volgende volledige template beschrijft uitsluitend het getoonde laboratoriumformaat:
!SCHEMA=scwx.auth
!CONFIRMWITH=PATTERN
!CONFIRMSTRING=^\{"product":"avanet-siem-lab","schema_version":1,"event_type":"logon","sensor_id":"avanet-lab-source","user":"[^"]+","src_ip":"[^"]+","session_id":"[^"]+","time":"[^"]+","result":"(success|failure)"\}$
!TRIMALLOFF
!SAMPLE={"product":"avanet-siem-lab","schema_version":1,"event_type":"logon","sensor_id":"avanet-lab-source","user":"pilot-user","src_ip":"192.0.2.25","session_id":"avanet-lab-20261029T101500Z","time":"2026-10-29T10:15:00Z","result":"success"}
json = JSON(originalData$)
sensorType$ = "AVANET_SIEM_LAB"
sensorId$ = json["$.sensor_id"]
sourceUserName$ = json["$.user"]
sourceAddress$ = json["$.src_ip"]
sessionId$ = json["$.session_id"]
authSystem$ = json["$.product"]
eventTimeUsec$ = DATETIME(json["$.time"], "2006-01-02T15:04:05Z07:00")
authCategory$ = 10
action$ = IF json["$.result"] == "failure" THEN 8 ELSE 1
actionResult$ = IF json["$.result"] == "success" THEN 10 ELSE 20
De Confirm String is bewust beperkt tot precies deze compacte serialisatie met vaste veldvolgorde. Netjes ingesprongen JSON of een andere volgorde past niet. Ontwerp dit herkenningspatroon voor een echte bron opnieuw aan de hand van representatieve originele meldingen; breed zoeken op alleen het woord ‘logon’ is geen gelijkwaardige vervanging.
Voor dit laboratorium worden de gebruikte Auth-velden en hun vaste enum-waarden als volgt toegewezen:
| Ruwe waarde | Parserveld | Verwachte normalisatie |
|---|---|---|
sensor_id | sensorId$ | sensor_id |
user | sourceUserName$ | source_user_name |
src_ip | sourceAddress$ | source_address |
session_id | sessionId$ | session_id |
UTC-time | eventTimeUsec$ | event_time_usec |
| Laboratoriumaanmelding | authCategory$ = 10 | ACCOUNT_LOGON |
success | action$ = 1, actionResult$ = 10 | LOGON, SUCCESS |
failure | action$ = 8, actionResult$ = 20 | FAILURE, FAILED |
De getallen zijn schema-enums, geen vrij gekozen ernstniveaus. De Go-tijdformaattemplate in DATETIME() behoudt het UTC-teken of een ISO-8601-zoneoffset. Vergelijk ruwe waarde en genormaliseerde microsecondentijd in de editor. De template stelt tenantId$ en resourceId$ niet zelf in; vervang die waarden niet door verzonnen tenant- of gebeurteniskenmerken.
Zonder inschakelen in de parsereditor controleren
Plak de afzonderlijke voorbeeldregel in Sample Message. Open Parse Message en daarna Source Destination Mapping. Vergelijk schema, gebruiker, adres, tijd, resultaat en extractor path met de tabel. Een waarschuwing over een andere parser moet vóór activering worden verduidelijkt.
Leg daarna meerdere afzonderlijke meldingen als tegenproeven vast:
- Wijzig
resultnaarfailure: verwacht wordenaction=8enaction_result=20. - Wijzig
productnaarother-lab: de melding mag niet aan deze parser worden toegewezen. - Wijzig
resultnaarunknownof verwijderuser: de melding mag niet als geslaagde aanmelding worden genormaliseerd; de nauwe Confirm String moet haar uitsluiten. - Gebruik een ongeldige tijdwaarde: een fout of ontbrekende correcte tijdwaarde stopt de goedkeuring. Accepteer de importtijd niet als ogenschijnlijk succes.
Run Test controleert het schema en de Extractor Paths van alle vastgelegde samples. Sophos beveelt verschillende samples en 12–15 testruns aan; controleer daarbij het daadwerkelijk gebruikte parserpad. Parse Message levert de Parsed Source Message en de Source Destination Mapping voor de afzonderlijke controle. Een test slaat de parser niet op; Save en Deploy zijn afzonderlijke stappen. Opslaan is geen testbewijs. Laat een nieuwe parser eerst uitgeschakeld. Bij al actieve parsers zouden wijzigingen direct bij het opslaan gelden; daarom gebruikt dit laboratorium een eigen nieuwe parser. Het algemene parser-runbook legt activering en herstelpad uit.
Eén HTTP-verzendstap voorbereiden
Maak na goedkeuring in de testtenant onder Security Operations > Integrations > Marketplace > Custom > HTTP Ingest > Set Up een afzonderlijke integratie AVANET-LAB-HTTP. Neem Integration Key en URL meteen op in de goedgekeurde secretstore; Sophos toont ze maar één keer. Schakel nog geen bestaande bron om.
Het volgende Python-voorbeeld verstuurt precies één zelfgemaakte melding. URL en sleutel worden verborgen opgevraagd, niet als opdrachtregelargument, shellvariabele of onderdeel van de broncode opgeslagen. De normale TLS-certificaatcontrole blijft ingeschakeld; HTTP-omleidingen worden niet gevolgd, zodat de Bearer-sleutel niet bij een ander doel belandt. Het script bevat bewust geen automatische herhalingen, omdat die zonder bevestigd gedrag dubbele gebeurtenissen kunnen maken.
import datetime
import getpass
import json
import urllib.error
import urllib.parse
import urllib.request
import uuid
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
url = getpass.getpass("Integration URL: ").strip()
key = getpass.getpass("Integration Key: ")
parsed = urllib.parse.urlsplit(url)
if parsed.scheme != "https" or not parsed.hostname or parsed.username or parsed.password or parsed.fragment:
raise SystemExit("Nur die freigegebene HTTPS-URL ohne eingebettete Zugangsdaten verwenden.")
now = datetime.datetime.now(datetime.timezone.utc)
time_text = now.strftime("%Y-%m-%dT%H:%M:%SZ")
run_id = "avanet-lab-" + now.strftime("%Y%m%dT%H%M%SZ") + "-" + uuid.uuid4().hex[:8]
event = {
"product": "avanet-siem-lab",
"schema_version": 1,
"event_type": "logon",
"sensor_id": "avanet-lab-source",
"user": "pilot-user",
"src_ip": "192.0.2.25",
"session_id": run_id,
"time": time_text,
"result": "success",
}
request = urllib.request.Request(
url,
data=json.dumps(event, separators=(",", ":")).encode("utf-8"),
headers={"Authorization": "Bearer " + key, "Content-Type": "application/json"},
method="POST",
)
print("Testkennung:", run_id, "UTC:", time_text)
try:
with urllib.request.build_opener(NoRedirect()).open(request, timeout=15) as response:
print("HTTP-Status:", response.status)
except urllib.error.HTTPError as error:
print("HTTP-Fehler:", error.code, "— nicht automatisch erneut senden.")
except urllib.error.URLError:
print("Verbindungs- oder TLS-Fehler — URL, Vertrauenskette und Netzwerkweg prüfen.")
Sla de code zonder geheimen op in een lokaal laboratoriumbestand en start het met Python 3. De URL moet exact uit de goedgekeurde laboratoriumintegratie komen; de code controleert geen eigendomsbewijs van een willekeurige HTTPS-host. Neem sleutel en URL niet over in openbare consoleopnames of tickets. Het script maakt geen klant-, wachtwoord- of productiesessiegegevens.
Ook na een HTTP-antwoord wordt nog geen geslaagde ingest geclaimd. Bij een timeout is onduidelijk of de server de melding al heeft geaccepteerd. Zoek daarom vóór opnieuw verzenden op het genoteerde testkenmerk. Verduidelijk bij 401/403 de toegewezen toegangsgegevens en goedkeuringsstatus zonder op goed geluk rechten te verruimen. Controleer bij 4xx vanwege het bodyformaat het concrete ingest-voorschrift in plaats van willekeurig nieuwe JSON-omhulsels te proberen.
Ruwe melding en genormaliseerde gebeurtenis zoeken
Controleer eerst het transport afzonderlijk. Zoek onder Data Lake Search > Query Editor binnen een nauw tijdvenster naar het weergegeven testkenmerk:
FROM generic WHERE original_data CONTAINS 'avanet-lab-20261029T101500Z' earliest=-1h
Vervang de voorbeeldwaarde door het daadwerkelijk weergegeven kenmerk. In Original Data moeten product, bronkenmerk, gebruiker, tijd en resultaat overeenkomen met de verstuurde regel. sensor_id in de generieke gebeurtenis kan door de opnameroute zijn bepaald. Een integratieweergavenaam is daarom niet automatisch het juiste zoekkenmerk. Neem pas de daadwerkelijk aanwezige waarde over als aanvullend op sensor_id moet worden gefilterd.
Activeer na geslaagde editortests bewust de nieuwe laboratoriumparser en stuur een nieuwe testmelding. Er wordt niet verondersteld dat al opgenomen ruwe gegevens daardoor achteraf opnieuw worden genormaliseerd. Zoek de verwachte Auth-gebeurtenis met de gedefinieerde laboratoriumvelden:
FROM auth WHERE sensor_id = 'avanet-lab-source' AND session_id = 'avanet-lab-20261029T101500Z' earliest=-1h
Vervang ook hier het kenmerk. Controleer in het resultaat de Normalized Data: source_user_name=pilot-user, source_address=192.0.2.25, bij de bron passende tijd, action=1, auth_category=10 en action_result=10, of de bijbehorende enum-namen in de UI. Het extractor path moet bij de laboratoriumparser horen. Gebruik deze waarden als acceptatiecriteria.
Wijzig voor de gecontroleerde mislukte poging in de eigen generator alleen result naar failure, maak een nieuw testkenmerk en verstuur opnieuw precies één keer. Het schema moet nu action=8 en action_result=20 tonen. Aanvullende geslaagde normalisatie voor unknown of een vreemde productnaam zou daarentegen reden zijn om af te breken.
Fouten afbakenen en het laboratorium afbouwen
Geen ruwe melding: Controleer verzendtijd en testkenmerk, transportantwoord, juiste tenant, tijdvenster en bron. Behandel ontbrekende zoekresultaten niet als enig bewijs van transportuitval; generiek zoeken in ruwe data vereist de uitgebreide parameters en toegang tot original_data is in tijd beperkt.
Ruwe melding aanwezig, geen Auth-resultaat: Controleer parserstatus, exacte serialisatie, Confirm String, schema en parserpad. Verruim geen productieparsers om de laboratoriumgebeurtenis toch maar te herkennen.
Auth-resultaat met verkeerd resultaat of tijdwaarde: Vergelijk bron en mapping afzonderlijk. Schakel de parser uit en corrigeer de vastgelegde scriptversie; vul niets aan met verzonnen standaardwaarden.
Beëindig na acceptatie de eigen zender en schakel alleen de nieuw gemaakte laboratoriumparser uit via Disable. Daarmee eindigt de aanvullende normalisatie; generieke data en al opgeslagen gebeurtenissen worden niet als verwijderd beschouwd. Verwijder de laboratoriumintegratie pas nadat de vervangings-/intrekkingsroute van de sleutel is verduidelijkt en goedgekeurd. De afbouw mag geen gedeelde integratie of andere databron wijzigen.
Het verdere beheer volgt de SIEM-werkwijze: documenteer bronformaat en parserversie samen, accepteer ze opnieuw na wijzigingen en plan bewaring en alarmbehandeling afzonderlijk.