GNSS usaldus turvatelemeetriana
kshana trust-telemetry muudab epohhipõhise GNSS usaldusvoo (skoor 0-100, tase, põhjused) signaalideks, mida operatsiooni- või turvakeskus juba sisse loeb: Prometheuse mõõdikud, CEF- või LEEF-vormingus syslog-sündmused SIEM-i jaoks ning valikuliselt OpenTelemetry. See loeb voogu; see ei muuda kunagi usaldushinnangut ega edasta midagi peale telemeetria.
Käivitamine#
# 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
Sisend on reaalajas JSON-lines skeemi v1.1, mis on dokumenteeritud failis docs/MARITIME-TRUST.md. Loetakse: t_s; state (calibrating|nominal|degraded|untrusted, tase); score (0-100 või null); time (epohhi aeg nagu öeldud); gate (off|passed|withheld); position (lat_deg, lon_deg, height_m või null); põhjused on monitoorid väljas deductions, seejärel kõik edasised väljas alarms; skeemist 1,3 alates geometry (status, hdop, pdop, n_used) ja iga mahaarvamise class. Teisi võtmeid ignoreeritakse, sest skeem kasvab ainult lisatud võtmetega. Rida, mis ei parsi, loetakse välja kshana_trust_input_errors_total ja jäetakse vahele; skoorid väljaspool 0-100 lükatakse tagasi, mitte ei piirata, et vormingu muutus märgataks. Ainus kood, mis seda vormingut tunneb, on src/telemetry/sample.rs.
/metrics serveeritakse ilma autentimiseta ja vaikimisi on selleks 127.0.0.1:9464. Mujale sidumine trükib hoiatuse; panna see oma juurdepääsukontrolli taha. Lõpp-punkt teenindab korraga ühte ühendust 2 s lugemispiiriga, nii et jõude klient võib kogumist viivitada kuni selle aja võrra; see on mõeldud ühele koguja jaoks, mitte avaliku võrgu jaoks.
Home Assistant ja NTP seadmed (MQTT)#
--print-mqtt trükib ja --mqtt-tcp <host:port> avaldab JSON olekudokumendi ja Home Assistant MQTT avastamissõnumid. Avastamine (säilitatud, all homeassistant/...) loob kolm olemit: usaldusskoor, usaldustase (põhjused atribuutidena) ja untrusted probleemianduri. Olekudokument läheb teemasse <prefix>/state (vaikimisi kshana/trust/state, säilitatud): state, score (null, kuni ühtegi pole), untrusted, t_s, time, reasons, gate ja nõuandev avaldus; asukohta ei lisata kunagi. Valikud: --mqtt-prefix, --mqtt-node, --mqtt-discovery.
Avaldaja räägib MQTT 3.1.1 protokolli QoS 0 juures ja loeb ainult vahendaja CONNACK-i. Sellel pole mandaate ega TLS-i, seega kasutada kohaliku võrgu vahendajat (või kohalikku releed, mis need lisab). Edastus toimub oma lõimes 1024 järjekorra taga: surnud vahendaja viskab sõnumeid minema, need loetakse ja neist teatatakse lõpus, ning see ei peata kunagi voogu. NTP seade või mis tahes muu tarbija, kes soovib lihtsat JSON-i, saab lugeda sama olekurida. Vastuvõtjale ega kellale midagi ei kirjutata. Python, WebAssembly ja MCP võtavad format = "mqtt" ja tagastavad samad topic<TAB>payload read (seal midagi ei avaldata).
Pythonist, WebAssembly-st ja MCP-st#
Kodeerijad on saadaval ka tekst sisse, tekst välja kutsetena ilma protsessi, sokli ega kellata: Python kshana.trust_telemetry(input, format, host="", input_kind="jsonl", expose_position=False, syslog_all=False, unix_nano=0), WebAssembly eksport trust_telemetry(input, format, host, input_kind, options_json) ja MCP tööriist trust_telemetry (pistikprogrammi käsk /kshana-trust-telemetry). format on prometheus, cef, leef või otlp; input_kind on jsonl (voog) või result (paketitulemus). Need tagastavad sama teksti, mida käsurida trükib (--print-metrics, --print-syslog), samade piirangutega: syslog-read ei kanna ajatemplit, host on kuni 255 trükitavat ASCII märki ilma tühikuteta (muidu lükatakse tagasi, siin ja käsureal) ning vastus, mis on suurem kui pinna piirang (4 MiB MCP-s), lükatakse tagasi, sest CEF ja LEEF valikuga syslog_all kirjutavad ühe sündmuse epohhi kohta. Midagi ei saadeta, serveerita ega kirjutata; töötavad eksportijad jäävad käsureal protsessiks.
Edastus ei peata kunagi hindamist#
Syslog ja OpenTelemetry edastus töötavad oma lõimedes. Sisselugemistsükkel annab neile ainult sõnumi või hetktõmmise ega oota kunagi, nii et surnud, aeglane või mitte-lugev koguja ei saa reaalajavoogu tagasi survestada ega käsku /metrics külmutada:
- igal ühendamisel ja kirjutamisel on 2 s piirang; ebaõnnestunud ühendus jäetakse maha ja ühendatakse laisalt uuesti, eksponentsiaalse ooteajaga alates 1 s kuni 60 s;
- sõnum, mida ei saa edastada (koguja maas, kirjutamine aegus, 1024 järjekord täis), visatakse ära ja loetakse väljas
kshana_trust_syslog_send_failures_total; häire anda selle sageduse põhjal; - OpenTelemetry eksportijale antakse registri koopia, nii et võrgu I/O ajal ei hoita lukku; kui eksport on veel pooleli, jäetakse uus hetktõmmis vahele (järgmine kannab samu kumulatiivseid summasid).
Sisendi lõpus antakse saatelõimedele lõpetamiseks nende allesjäänud ajapiirangud.
Prometheuse mõõdikud#
| Mõõdik | Tüüp | Sildid | Tähendus |
|---|---|---|---|
kshana_build_info |
gauge | version |
konstant 1 |
kshana_trust_score |
gauge | viimane skoor 0-100; puudub, kui allikas seda ei anna | |
kshana_trust_band |
gauge | band |
1 praeguse taseme jaoks, 0 teiste jaoks |
kshana_trust_gate |
gauge | gate |
off, passed, withheld, unknown: 1 praeguse oleku jaoks, 0 teiste jaoks; puudub ilma väravata |
kshana_trust_position_latitude_degrees, ..._longitude_degrees, ..._height_meters |
gauge | vastuvõtja teatatud asukoht; ainult valikuga --expose-position (lõpp-punkt on autentimata ja asukoht võib tuvastada saidi või laeva) |
|
kshana_trust_reason_active |
gauge | reason |
1, kui viimasel epohhil olemas |
kshana_trust_epochs_total |
loendur | band |
vastuvõetud epohhid |
kshana_trust_reason_epochs_total |
loendur | reason |
epohhid, milles põhjus oli olemas |
kshana_trust_input_errors_total |
loendur | parsimatud sisendread | |
kshana_trust_reason_overflow_total |
loendur | põhjuse esinemised, mis on liidetud kategooriasse reason="other" (vt allpool) |
|
kshana_trust_syslog_send_failures_total |
loendur | edastamata syslog-sündmused | |
kshana_trust_epoch_offset_seconds |
gauge | viimase epohhi nihe voo algusest | |
kshana_trust_last_sample_timestamp_seconds |
gauge | seinakella vastuvõtuaeg; häire anda selle vanuse põhjal | |
kshana_trust_geometry |
gauge | status |
satelliitide geomeetria viimasel epohhil, good, degraded, unknown: 1 praeguse jaoks (skeemi 1,3 sisendid) |
kshana_trust_geometry_degraded |
gauge | 1 halvenenud, 0 hea; puudub, kui geomeetria on teadmata (1.3) | |
kshana_trust_geometry_signal_loss |
gauge | 1, kui nähtavaid satelliite ei jälgita, kuigi nende geomeetria on hea (signaal kadus, mitte taevas; geometry_degraded näitab endiselt 1), muidu 0; puudub, kui geomeetria on teadmata või sisend seda ei ütle (1.3) |
|
kshana_trust_geometry_hdop, ..._pdop, ..._used_satellites |
gauge | HDOP, PDOP ja kasutatud satelliidid viimasel epohhil; igaüks puudub, kui ühtegi pole (1.3) | |
kshana_trust_geometry_epochs_total |
loendur | status |
epohhid geomeetria oleku järgi (1.3) |
kshana_trust_geometry_label |
gauge | label |
geomeetria silt viimasel epohhil, good, fair, poor, unknown: 1 praeguse jaoks; ei hinnata kunagi (skoor arvab maha ainult poor eest); sisenditest, mis kannavad silti (0,36) |
kshana_trust_geometry_vdop |
gauge | VDOP viimasel epohhil; puudub, kui ühtegi pole (0.36) |
Geomeetria silt on peamine. Joonistada graafik ja anda häire väljal kshana_trust_geometry_label (OTLP kshana.geometry.label, CEF kolmas cs6 väli, LEEF geoLabel): poor on ainus silt, mille eest skoor maha arvab. Geomeetria olek on kirjeldav: degraded sisaldab informatiivset juhtu sky-blocked, mis võib tulla hea või keskmise DOP-iga, seega ainult kshana_trust_geometry_degraded põhjal mitte häiret anda.
Skeemi 1,3 sisenditest alates kannab kshana_trust_reason_active ka silti class (geometry, environment, inconsistency) igal põhjusel, millega see kaasas oli: mahaarvamise klass viimasel epohhil. Geomeetria seeriad tulevad pärast kõiki teisi ja alles siis, kui sisendi epohh kannab geometry (reaalajas skeem 1,3, tulemus mootorist 0,36 või hilisemast), nii et 0,35 voog või tulemus renderdatakse bait-baidilt nagu varem. Sildi väärtused on fikseeritud hulgad (tundmatu olek loetakse unknown; tundmatu klass jäetakse välja). Häire anda väljal kshana_trust_reason_active{class="inconsistency"} mitte ainult tasemel, et kehv taevas ei anna häiret rünnakuna; klass geometry on väide taeva kohta, mitte järeldus, et rünnakut ei toimunud (vt docs/RECEIVER-TRUST.md).
Silt class on seeria identiteedi osa: kui põhjuse klass muutub epohhide vahel (loss-of-lock väärtusest environment väärtuseks geometry, kui kaotatud satelliidid olid madalad, või geometry väärtusest inconsistency väärtuseks, kui esitatud HDOP on vastuolus esitatud taevaga), siis vana seeriat enam ei ekspordita ja uus algab. Päring väljal reason koos max by (reason), kui klass ei loe, ja oodata, et selline ümberlülitus näeb välja nagu ühe seeria lõppemine ja teise algamine. Skeemi 1,3 seeriaid, silti class ja CEF/LEEF geomeetria välju kontrollivad mootori enda testid ja CEF sõltumatud etalonid (pycef, Logstash); välistel Prometheuse ja OTLP sõltumatutel etalonidel ei ole veel 1,3 voogu.
Põhjuste nimed lõigatakse 128 märgini ja kuni 64 erineval põhjusel on oma seeria; hilisemad loetakse kategooria reason="other" alla ja väljale kshana_trust_reason_overflow_total, nii et vaenulik või vigane sisend ei saa luua piiramatut sildikardinaalsust.
band on üks väärtustest calibrating, nominal, degraded, untrusted, unknown. Põhjuste nimed on voo monitooride nimed (kinematic, heading-course, ...; paketitulemuse puhul cn0-drop, agc, raim).
Näidisarmatuurlaud on failis deploy/grafana/kshana-gnss-trust.json (importida see ja valida oma Prometheuse andmeallikas).
Syslog: CEF ja LEEF#
Sündmused saadetakse RFC 5424 ümbrises (facility local0, rakendus kshana, sõnumi id GNSSTRUST) UDP kaudu (üks datagramm igaühele; IPv4 või IPv6) või TCP kaudu, vaikimisi reavahetusega lõpetatult või valikuga --syslog-octet-counting kaadristatult <length> <message> nagu RFC 6587. Vaikimisi saadetakse üks sündmus taseme muutuse kohta; --syslog-all saadab ühe epohhi kohta. Tootja kirjutatakse Ashforde OU (ASCII), et ükski SIEM seda valesti ei dekodeeriks.
| Mõiste | Syslogi tõsidus | CEF tõsidus | LEEF sev |
|---|---|---|---|
| kalibreerimisel | 6 info | 0 | 1 |
| nominaalne | 6 info | 1 | 1 |
| halvenenud | 4 hoiatus | 5 | 5 |
| ebausaldatav | 2 kriitiline | 9 | 9 |
| teadmata | 5 teade | 3 | 3 |
Väljade vastendus (sündmuse id on gnss-trust.<band>):
| Tähendus | CEF | LEEF 2,0 (eraldaja ^) |
|---|---|---|
| kategooria | cat=gnss-trust |
cat |
| saatev host | dvchost |
devHost |
| tase | cs1 (silt band) |
band |
| põhjused, komadega eraldatud | cs2 (reasons) |
reasons |
| eelmine tase | cs3 (previousBand) |
previousBand |
| skoor | cfp1 (trustScore), välja jäetud, kui ühtegi pole |
trustScore |
| epohhi nihe, s | cfp2 (epochOffsetSeconds) |
epochOffsetSeconds |
| logi aja silt | cs4 (logTime) |
logTime |
| värava olek | cs5 (gate) |
gate |
geomeetria olek, seejärel ; ja epohhi mahaarvamiste klassid, komadega eraldatud (näiteks degraded;environment,geometry) (sisendid 1,3); sisenditest, mis kannavad silti (0,36), kolmas väli ; ja silt, klasside väli on siis alati olemas (näiteks degraded;;poor, good;;fair) |
cs6 (geometry) |
geoStatus (ainult olek), geoClass (klassid) ja geoLabel (silt) |
| HDOP (1.3) | cfp3 (geometryHdop) |
geoHdop |
| PDOP (1.3) | cfp4 (geometryPdop) |
geoPdop (0,36, koos sildiga) |
| VDOP (0,36, koos sildiga) | ei kanta: võetakse neli ujukomaga kohandatud välja | geoVdop |
| kasutatud satelliidid (0,36, koos sildiga) | cn1 (geometryUsedSatellites), täisarv |
geoUsed |
| signaali kadu: nähtavaid satelliite ei jälgita, kuigi nende geomeetria on hea (1.3) | ei kanta väljana (ühtki CEF sõnastiku võtit ei ole selle jaoks vaba): olek on degraded ja geomeetria mahaarvamise klass environment väljas cs6 |
geoSignalLoss=1, ainult kui see kehtib |
CEF-is kasutab geomeetria ainult sõnastiku kohandatud välju (leiutatud võtmeid ei ole); silt liigub väljas cs6, mitte väljas flexString1, sest Logstashi CEF-kodek ei vasta välju flexString. Geomeetria sündmused 1,3, sealhulgas sildijuhud, on VALIDATED CEF rea osa: mõlemad sõltumatu etaloni parserid loevad need tagasi nii, nagu need on kirjutatud (tests/cef_reference.rs, muudatused 4 ja 5, kumbki registreeritud enne, kui kumbagi parserit nende juhtudel käivitati). Sildi, VDOP ja satelliitide arvu väljad lisatakse pärast kõiki varasemaid välju ja seeriaid ning ainult sisenditele, mis kannavad silti, nii et sildita sisend renderdatakse täpselt nagu varem.
Tühjad väljad jäetakse välja (ilma põhjusteta ei ole cs2=). Hostinimi lõigatakse 255 märgini. CEF päise väärtused paoseerivad \ ja |; laiendiväärtused paoseerivad \, = ja reavahetused. LEEF väärtustes asendatakse ^ ja reavahetused tühikutega.
OpenTelemetry (vaikimisi väljas)#
Ehitada valikuga --features otlp ja anda --otlp http://host:4318/v1/metrics. Eksportija postitab OTLP/HTTP JSON-i (kshana.trust.score, kshana.trust.band, kshana.trust.epochs, kshana.trust.reason.epochs ja skeemi 1,3 sisendite puhul kshana.geometry.status, kshana.geometry.degraded, kshana.geometry.signal_loss, kshana.geometry.hdop, kshana.geometry.pdop, kshana.geometry.used_satellites ning sisenditest, mis kannavad silti (0,36), kshana.geometry.label (atribuut label) ja kshana.geometry.vdop; kumulatiivsed summad kannavad startTimeUnixNano) iga --otlp-every epohhi järel (vaikimisi 10) ja sisendi lõpus. See ei lisa sõltuvust ega toeta TLS-i: saata koguja poole samas hostis või usaldatud segmendis, mis edastab edasi TLS-i kaudu. Lõpp-punktid https:// lükatakse tagasi.