Maskinoversættelse, ikke gennemgået af en modersmålstalende. Engelsk er referencen.

Modtagertillid og maritimRedigér på GitHubKilde: docs/TRUST-TELEMETRY.md

GNSS-tillid som sikkerhedstelemetri

kshana trust-telemetry omdanner strømmen af GNSS-tillid for hver epoke (score 0-100, bånd, årsager) til signaler, som et drifts- eller sikkerhedscenter allerede indlæser: Prometheus-metrikker, syslog-hændelser i CEF eller LEEF til et SIEM og eventuelt OpenTelemetry. Det læser strømmen; det ændrer aldrig tillidsvurderingen og sender intet andet end telemetri.

Ét tillidsresultat i tre eksportformater, fra egentlige kørsler af motor v0.40.0 (`kshana trust-telemetry`) på examples/maritime-trust: Prometheus-tekstvisning (den seneste tillidsscore er 5,9, og det utroværdige bånd er det, der er sat), og de sidste CEF- og LEEF-meddelelser. Kommandoen udgiver intet, medmindre den får en destination, rummer ingen legitimationsoplysninger og udsender intet radiosignal. Vejledende software, ikke typegodkendt navigationsudstyr (IEC 61108, IEC 61162): operatøren er fortsat ansvarlig for fartøjets navigation.Ét tillidsresultat i tre eksportformater, fra egentlige kørsler af motor v0.40.0 (`kshana trust-telemetry`) på examples/maritime-trust: Prometheus-tekstvisning (den seneste tillidsscore er 5,9, og det utroværdige bånd er det, der er sat), og de sidste CEF- og LEEF-meddelelser. Kommandoen udgiver intet, medmindre den får en destination, rummer ingen legitimationsoplysninger og udsender intet radiosignal. Vejledende software, ikke typegodkendt navigationsudstyr (IEC 61108, IEC 61162): operatøren er fortsat ansvarlig for fartøjets navigation.

Kør den#

# live stream on stdin -> /metrics on localhost:9464
kshana receiver-trust live <args> | kshana trust-telemetry

# replay a batch result (the score is the epoch's own for a vessel platform, absent otherwise)
kshana trust-telemetry --result session.result.json --print-metrics
kshana trust-telemetry --result session.result.json --print-syslog --format leef

# SIEM over UDP, one event per band change
kshana trust-telemetry --input stream.jsonl --syslog-udp siem.example:514 --format cef --host ops-gw1

Input er live-JSON-linje-skemaet v1.1, dokumenteret i docs/MARITIME-TRUST.md. Læst: t_s; state (calibrating|nominal|degraded|untrusted, båndet); score (0-100 eller null); time (epokens tid som angivet); gate (off|passed|withheld); position (lat_deg, lon_deg, height_m eller null); årsager er monitorerne i deductions, derefter eventuelle yderligere i alarms; fra skema 1,3, geometry (status, hdop, pdop, n_used) og hvert fradrags class. Andre nøgler ignoreres, da skemaet kun vokser ved tilføjede nøgler. En linje, der ikke kan fortolkes, tælles i kshana_trust_input_errors_total og springes over; scorer uden for 0-100 afvises og afkortes ikke, så en formatændring bliver opdaget. Den eneste kode, der kender dette format, er src/telemetry/sample.rs.

/metrics serveres uden autentificering og er som standard 127.0.0.1:9464. Binding andre steder udskriver en advarsel; sæt den bag din egen adgangskontrol. Endepunktet håndterer én forbindelse ad gangen med en læsegrænse på 2 s, så en inaktiv klient kan forsinke en indsamling med op til så lang tid; det er beregnet til én indsamler og ikke til det åbne netværk.

Home Assistant og NTP-appliances (MQTT)#

--print-mqtt udskriver, og --mqtt-tcp <host:port> publicerer, et JSON-tilstandsdokument og Home Assistant MQTT-discovery-meddelelser. Discovery (bevaret, under homeassistant/...) opretter tre entiteter: tillidsscore, tillidsbånd (med årsagerne som attributter) og en problemsensor untrusted. Tilstandsdokumentet går til <prefix>/state (standard kshana/trust/state, bevaret): state, score (null, mens der ingen er), untrusted, t_s, time, reasons, gate og den vejledende erklæring; positionen medtages aldrig. Indstillinger: --mqtt-prefix, --mqtt-node, --mqtt-discovery.

Udgiveren taler MQTT 3.1.1 ved QoS 0 og læser kun mæglerens CONNACK. Den har ingen legitimationsoplysninger og ingen TLS, så brug en mægler på det lokale netværk (eller et lokalt relæ, der tilføjer dem). Leveringen kører på sin egen tråd bag en kø på 1024: en død mægler taber meddelelser, som tælles og rapporteres til sidst, og standser aldrig strømmen. En NTP-appliance eller enhver anden forbruger, der vil have almindelig JSON, kan læse den samme tilstandslinje. Intet skrives til en modtager eller et ur. Python, WebAssembly og MCP tager format = "mqtt" og returnerer de samme topic<TAB>payload-linjer (intet publiceres dér).

Fra Python, WebAssembly og MCP#

Indkoderne findes også som kald med tekst ind og tekst ud uden proces, socket eller ur: Python kshana.trust_telemetry(input, format, host="", input_kind="jsonl", expose_position=False, syslog_all=False, unix_nano=0), WebAssembly-eksporten trust_telemetry(input, format, host, input_kind, options_json) og MCP-værktøjet trust_telemetry (plugin-kommando /kshana-trust-telemetry). format er prometheus, cef, leef eller otlp; input_kind er jsonl (strømmen) eller result (et batchresultat). De returnerer den samme tekst, som kommandolinjen udskriver (--print-metrics, --print-syslog), med de samme grænser: syslog-linjer bærer intet tidsstempel, host er højst 255 printbare ASCII-tegn uden mellemrum (ellers afvist, her og på kommandolinjen), og et svar, der er større end overfladens grænse (4 MiB på MCP), afvises, fordi CEF og LEEF med syslog_all skriver én hændelse pr. epoke. Intet sendes, serveres eller skrives; de kørende eksportører forbliver en proces på kommandolinjen.

Levering standser aldrig vurderingen#

Levering af syslog og OpenTelemetry kører på deres egne tråde. Indlæsningsløkken afleverer kun en meddelelse eller et øjebliksbillede til dem og venter aldrig, så en død, langsom eller ikke-læsende samler ikke kan lægge modtryk på live-strømmen eller fryse /metrics:

  • hver forbindelse og hver skrivning har en grænse på 2 s; en mislykket forbindelse droppes og genoprettes dovent, med eksponentiel backoff fra 1 s op til 60 s;
  • en meddelelse, der ikke kan leveres (samler nede, skrivning fik timeout, kø på 1024 fuld), droppes og tælles i kshana_trust_syslog_send_failures_total; alarmér på dens rate;
  • OpenTelemetry-eksportøren får en kopi af registret, så der ikke holdes nogen lås under netværks-I/O; hvis en eksport stadig er undervejs, springes det nye øjebliksbillede over (det næste bærer de samme kumulative totaler).

Ved slutningen af inputtet får afsendertrådene deres resterende tidsgrænser til at blive færdige.

Prometheus-metrikker#

Metrik Type Labels Betydning
kshana_build_info gauge version konstant 1
kshana_trust_score gauge seneste score 0-100; fraværende, hvis kilden ikke giver nogen
kshana_trust_band gauge band 1 for det nuværende bånd, 0 for de andre
kshana_trust_gate gauge gate off, passed, withheld, unknown: 1 for den nuværende tilstand, 0 for de andre; fraværende uden en gate
kshana_trust_position_latitude_degrees, ..._longitude_degrees, ..._height_meters gauge modtagerrapporteret position; kun med --expose-position (endepunktet er uden autentificering, og en position kan identificere et sted eller et fartøj)
kshana_trust_reason_active gauge reason 1, hvis til stede ved den seneste epoke
kshana_trust_epochs_total counter band modtagne epoker
kshana_trust_reason_epochs_total counter reason epoker, hvor årsagen var til stede
kshana_trust_input_errors_total counter inputlinjer, der ikke kan fortolkes
kshana_trust_reason_overflow_total counter forekomster af årsager, der er foldet ind i reason="other" (se nedenfor)
kshana_trust_syslog_send_failures_total counter syslog-hændelser, der ikke er leveret
kshana_trust_epoch_offset_seconds gauge seneste epokes forskydning fra strømmens start
kshana_trust_last_sample_timestamp_seconds gauge modtagelsestid på vægur; alarmér på dens alder
kshana_trust_geometry gauge status satellitgeometri ved den seneste epoke, good, degraded, unknown: 1 for den nuværende (input i skema 1,3)
kshana_trust_geometry_degraded gauge 1 degraded, 0 good; fraværende, når geometrien er ukendt (1.3)
kshana_trust_geometry_signal_loss gauge 1, når satellitter i sigte ikke spores, mens deres geometri er god (signalet var tabt, ikke himlen; geometry_degraded viser stadig 1), ellers 0; fraværende, når geometrien er ukendt, eller inputtet ikke angiver det (1.3)
kshana_trust_geometry_hdop, ..._pdop, ..._used_satellites gauge HDOP, PDOP og anvendte satellitter ved den seneste epoke; hver fraværende, når der ingen er (1.3)
kshana_trust_geometry_epochs_total counter status epoker efter geometristatus (1.3)
kshana_trust_geometry_label gauge label geometrietiket ved den seneste epoke, good, fair, poor, unknown: 1 for den nuværende; scores aldrig (scoren trækker kun for poor); fra input, der bærer etiketten (0,36)
kshana_trust_geometry_vdop gauge VDOP ved den seneste epoke; fraværende, når der ingen er (0.36)

Geometrietiketten er hovedpunktet. Tegn grafer og alarmér på kshana_trust_geometry_label (OTLP kshana.geometry.label, CEF det tredje cs6-felt, LEEF geoLabel): poor er den eneste etiket, scoren trækker for. Geometristatussen er beskrivende: degraded omfatter det informative tilfælde sky-blocked, som kan komme med god eller rimelig DOP, så alarmér ikke alene på kshana_trust_geometry_degraded.

Fra input i skema 1,3 bærer kshana_trust_reason_active også en class-etiket (geometry, environment, inconsistency) på hver årsag, der kom med en: fradragets klasse ved den seneste epoke. Geometriserierne kommer efter alle de andre og først når en inputepoke bærer geometry (live-skema 1,3, et resultat fra motor 0,36 eller nyere), så en strøm eller et resultat fra 0,35 gengives byte for byte som før. Etiketværdier er faste mængder (en ukendt status viser unknown; en ukendt klasse droppes). Alarmér på kshana_trust_reason_active{class="inconsistency"} frem for alene på båndet, så en dårlig himmel ikke giver alarm som et angreb; en geometry-klasse er en udtalelse om himlen og ikke en konstatering af, at intet angreb fandt sted (se docs/RECEIVER-TRUST.md).

Etiketten class er en del af en series identitet: når en årsags klasse ændres mellem epoker (loss-of-lock fra environment til geometry, når de tabte satellitter stod lavt, eller geometry til inconsistency, når den angivne HDOP er uenig med den angivne himmel), eksporteres den gamle serie ikke længere, og en ny starter. Forespørg efter reason med max by (reason), når klassen ikke betyder noget, og forvent, at et sådant skifte ser ud som én serie, der slutter, og en anden, der begynder. Serierne i skema 1,3, etiketten class og CEF/LEEF-geometrifelterne kontrolleres af motorens egne tests og af CEF-referencerne (pycef, Logstash); de eksterne Prometheus- og OTLP-referencer har endnu ingen 1,3-strøm.

Årsagsnavne afkortes til 128 tegn, og højst 64 forskellige årsager får deres egen serie; senere tælles under reason="other" og i kshana_trust_reason_overflow_total, så et fjendtligt eller fejlbehæftet input ikke kan skabe ubegrænset etiketkardinalitet.

band er en af calibrating, nominal, degraded, untrusted, unknown. Årsagsnavne er strømmens monitornavne (kinematic, heading-course, ...; for batchresultatet cn0-drop, agc, raim).

Et eksempel på et dashboard findes i deploy/grafana/kshana-gnss-trust.json (importér det, og vælg din Prometheus-datakilde).

Syslog: CEF og LEEF#

Hændelser sendes i en RFC 5424-kuvert (facility local0, app kshana, meddelelses-id GNSSTRUST) over UDP (ét datagram hver; IPv4 eller IPv6) eller TCP, som standard afsluttet med linjeskift eller, med --syslog-octet-counting, indrammet <length> <message> som i RFC 6587. Som standard sendes én hændelse pr. båndskift; --syslog-all sender én pr. epoke. Leverandøren skrives Ashforde OU (ASCII), så intet SIEM afkoder den forkert.

Begreb Syslog-alvorlighed CEF-alvorlighed LEEF sev
calibrating 6 info 0 1
nominal 6 info 1 1
forringet 4 warning 5 5
untrusted 2 critical 9 9
unknown 5 notice 3 3

Feltafbildning (hændelses-id er gnss-trust.<band>):

Betydning CEF LEEF 2,0 (skilletegn ^)
kategori cat=gnss-trust cat
afsendende vært dvchost devHost
bånd cs1 (etiket band) band
årsager, adskilt med komma cs2 (reasons) reasons
forrige bånd cs3 (previousBand) previousBand
score cfp1 (trustScore), udeladt, hvis ingen trustScore
epokens forskydning, s cfp2 (epochOffsetSeconds) epochOffsetSeconds
etiket for logtid cs4 (logTime) logTime
gate-tilstand cs5 (gate) gate
geometristatus, derefter ; og klasserne for epokens fradrag, adskilt med komma (for eksempel degraded;environment,geometry) (input i 1,3); fra input, der bærer etiketten (0,36), et tredje felt, ; og etiketten, hvor klassefeltet så altid er til stede (for eksempel degraded;;poor, good;;fair) cs6 (geometry) geoStatus (kun status), geoClass (klasser) og geoLabel (etiket)
HDOP (1.3) cfp3 (geometryHdop) geoHdop
PDOP (1.3) cfp4 (geometryPdop) geoPdop (0,36, med etiketten)
VDOP (0,36, med etiketten) medtages ikke: de fire brugerdefinerede flydendetalsfelter er optaget geoVdop
anvendte satellitter (0,36, med etiketten) cn1 (geometryUsedSatellites), et heltal geoUsed
signaltab: satellitter i sigte, der ikke spores, mens deres geometri er god (1.3) medtages ikke som felt (ingen CEF-ordbogsnøgle er ledig til det): statussen viser degraded og geometrifradragets klasse environment i cs6 geoSignalLoss=1, kun mens det gælder

I CEF bruger geometrien kun brugerdefinerede felter fra ordbogen (ingen opfundne nøgler); etiketten sendes i cs6 og ikke i flexString1, fordi Logstash-CEF-codec'en ikke afbilder felterne flexString. Geometrihændelserne i 1,3, etiketsagerne medregnet, er en del af den VALIDATED CEF-række: begge referenceparsere læser dem tilbage, som de er skrevet (tests/cef_reference.rs, tillæg 4 og 5, hvert registreret, før nogen af parserne blev kørt på dets sager). Etiket-, VDOP- og satellittalsfelterne føjes til efter hvert tidligere felt og hver tidligere serie, og kun for input, der bærer etiketten, så et input uden en gengives præcis som før.

Tomme felter udelades (intet cs2= uden årsager). Værtsnavnet afkortes til 255 tegn. CEF-headerværdier escaper \ og |; extension-værdier escaper \, = og linjeskift. I LEEF-værdier er ^ og linjeskift erstattet af mellemrum.

OpenTelemetry (slået fra som standard)#

Byg med --features otlp, og angiv --otlp http://host:4318/v1/metrics. Eksportøren poster OTLP/HTTP-JSON (kshana.trust.score, kshana.trust.band, kshana.trust.epochs, kshana.trust.reason.epochs og for input i skema 1,3 kshana.geometry.status, kshana.geometry.degraded, kshana.geometry.signal_loss, kshana.geometry.hdop, kshana.geometry.pdop, kshana.geometry.used_satellites og, fra input, der bærer etiketten (0,36), kshana.geometry.label (attribut label) og kshana.geometry.vdop; de kumulative summer bærer startTimeUnixNano) hver --otlp-every epoke (standard 10) og ved slutningen af inputtet. Den tilføjer ingen afhængighed og har ingen TLS: send til en samler på samme vært eller et betroet segment, som videresender over TLS. Endepunkter med https:// afvises.