GNSS-luottamus tietoturvatelemetriana
kshana trust-telemetry muuttaa epookkikohtaisen GNSS-luottamusvirran (pistemäärä 0-100, luokka, syyt) signaaleiksi, joita operatiivinen tai tietoturvakeskus jo vastaanottaa: Prometheus-mittareiksi, syslog-tapahtumiksi CEF- tai LEEF-muodossa SIEM:lle ja valinnaisesti OpenTelemetryksi. Se lukee virran; se ei koskaan muuta luottamusarviota eikä lähetä mitään muuta kuin telemetriaa.
Aja se#
# 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
Syöte on live-JSON-rivien skeema v1.1, joka on dokumentoitu tiedostossa docs/MARITIME-TRUST.md. Luetaan: t_s; state (calibrating|nominal|degraded|untrusted, luokka); score (0-100 tai null); time (epookin aika sellaisena kuin se on ilmoitettu); gate (off|passed|withheld); position (lat_deg, lon_deg, height_m tai null); syyt ovat monitorit kentässä deductions, sitten mahdolliset muut kentässä alarms; skeemasta 1,3 alkaen geometry (status, hdop, pdop, n_used) ja kunkin vähennyksen class. Muut avaimet jätetään huomiotta, koska skeema kasvaa vain lisättävillä avaimilla. Rivi, jota ei voi jäsentää, lasketaan kohteessa kshana_trust_input_errors_total ja ohitetaan; arvot alueen 0-100 ulkopuolella hylätään, ei rajata, jotta muodon muutos huomataan. Ainoa koodi, joka tuntee tämän muodon, on src/telemetry/sample.rs.
/metrics tarjotaan ilman todennusta ja oletuksena osoitteessa 127.0.0.1:9464. Sitominen muualle tulostaa varoituksen; aseta se oman pääsynhallintasi taakse. Päätepiste käsittelee yhtä yhteyttä kerrallaan 2 s:n lukurajalla, joten joutilas asiakas voi viivästyttää kaavintaa enintään sen verran; se on tarkoitettu yhdelle kaapijalle, ei avoimeen verkkoon.
Home Assistant ja NTP-laitteet (MQTT)#
--print-mqtt tulostaa ja --mqtt-tcp <host:port> julkaisee JSON-tila-asiakirjan ja Home Assistant MQTT -löytöviestit. Löytö (säilytetty, hakemiston homeassistant/... alla) tekee kolme entiteettiä: luottamuspistemäärä, luottamusluokka (syyt attribuutteina) ja ongelma-anturi untrusted. Tila-asiakirja menee osoitteeseen <prefix>/state (oletus kshana/trust/state, säilytetty): state, score (null, kun ei ole), untrusted, t_s, time, reasons, gate ja ohjeellinen lausuma; paikkaa ei koskaan sisällytetä. Asetukset: --mqtt-prefix, --mqtt-node, --mqtt-discovery.
Julkaisija puhuu MQTT 3.1.1 -protokollaa QoS 0 -tasolla ja lukee vain välittäjän CONNACKin. Sillä ei ole tunnistetietoja eikä TLS:ää, joten käytä välittäjää paikallisessa verkossa (tai paikallista releä, joka lisää ne). Toimitus ajetaan omassa säikeessään 1024 jonon takana: kuollut välittäjä pudottaa viestejä, jotka lasketaan ja raportoidaan lopussa, eikä se koskaan jumita virtaa. NTP-laite tai mikä tahansa muu kuluttaja, joka haluaa pelkkää JSONia, voi lukea saman tilarivin. Mitään ei kirjoiteta vastaanottimelle tai kellolle. Python, WebAssembly ja MCP ottavat format = "mqtt" ja palauttavat samat rivit topic<TAB>payload (mitään ei julkaista siellä).
Pythonista, WebAssemblystä ja MCP:stä#
Enkooderit ovat saatavilla myös teksti sisään, teksti ulos -kutsuina ilman prosessia, pistoketta tai kelloa: Python kshana.trust_telemetry(input, format, host="", input_kind="jsonl", expose_position=False, syslog_all=False, unix_nano=0), WebAssembly-vienti trust_telemetry(input, format, host, input_kind, options_json) ja MCP-työkalu trust_telemetry (lisäosan komento /kshana-trust-telemetry). format on prometheus, cef, leef tai otlp; input_kind on jsonl (virta) tai result (eräntulos). Ne palauttavat saman tekstin, jonka komentorivi tulostaa (--print-metrics, --print-syslog), samoilla rajoilla: syslog-rivit eivät sisällä aikaleimaa, host on enintään 255 tulostettavaa ASCII-merkkiä ilman välilyöntejä (muuten evätään, sekä täällä että komentorivillä), ja käyttöpinnan rajaa suurempi vastaus (4 MiB MCP:ssä) evätään, koska CEF ja LEEF asetuksella syslog_all kirjoittavat yhden tapahtuman epookkia kohti. Mitään ei lähetetä, tarjota tai kirjoiteta; käynnissä olevat viejät pysyvät prosessina komentorivillä.
Toimitus ei koskaan jumita arviointia#
Syslog- ja OpenTelemetry-toimitus ajetaan omissa säikeissään. Syöttösilmukka vain ulottaa niille viestin tai tilannekuvan eikä koskaan odota, joten kuollut, hidas tai lukematon kerääjä ei voi aiheuttaa vastapainetta live-virralle eikä jäädyttää kohdetta /metrics:
- jokaisella yhteydenotolla ja kirjoituksella on 2 s:n raja; epäonnistunut yhteys pudotetaan ja avataan uudelleen laiskasti eksponentiaalisella viiveellä 1 s:sta enintään 60 s:iin;
- viesti, jota ei voi toimittaa (kerääjä alhaalla, kirjoitus aikakatkaistu, 1024 jono täynnä), pudotetaan ja lasketaan kohteessa
kshana_trust_syslog_send_failures_total; hälytä sen nopeudesta; - OpenTelemetry-viejälle annetaan kopio rekisteristä, joten verkon I/O:n aikana ei pidetä lukkoa; jos vienti on yhä käynnissä, uusi tilannekuva ohitetaan (seuraava sisältää samat kumulatiiviset summat).
Syötteen lopussa lähetyssäikeille annetaan niiden jäljellä olevat aikarajat valmistua.
Prometheus-mittarit#
| Mittari | Tyyppi | Tunnukset | Merkitys |
|---|---|---|---|
kshana_build_info |
gauge | version |
vakio 1 |
kshana_trust_score |
gauge | viimeisin pistemäärä 0-100; puuttuu, jos lähde ei anna sitä | |
kshana_trust_band |
gauge | band |
1 nykyiselle luokalle, 0 muille |
kshana_trust_gate |
gauge | gate |
off, passed, withheld, unknown: 1 nykyiselle tilalle, 0 muille; puuttuu ilman porttia |
kshana_trust_position_latitude_degrees, ..._longitude_degrees, ..._height_meters |
gauge | vastaanottimen ilmoittama paikka; vain asetuksella --expose-position (päätepiste on todentamaton ja paikka voi tunnistaa sijainnin tai aluksen) |
|
kshana_trust_reason_active |
gauge | reason |
1, jos läsnä viimeisimmällä epookilla |
kshana_trust_epochs_total |
laskuri | band |
vastaanotetut epookit |
kshana_trust_reason_epochs_total |
laskuri | reason |
epookit, joissa syy oli läsnä |
kshana_trust_input_errors_total |
laskuri | jäsentämättömät syöterivit | |
kshana_trust_reason_overflow_total |
laskuri | syyesiintymät, jotka on laskettu kohteeseen reason="other" (katso alla) |
|
kshana_trust_syslog_send_failures_total |
laskuri | toimittamatta jääneet syslog-tapahtumat | |
kshana_trust_epoch_offset_seconds |
gauge | viimeisimmän epookin siirtymä virran alusta | |
kshana_trust_last_sample_timestamp_seconds |
gauge | seinäkellon vastaanottoaika; hälytä sen iästä | |
kshana_trust_geometry |
gauge | status |
satelliittigeometria viimeisimmällä epookilla, good, degraded, unknown: 1 nykyiselle (skeeman 1,3 syötteet) |
kshana_trust_geometry_degraded |
gauge | 1 degraded, 0 good; puuttuu, kun geometria on tuntematon (1.3) | |
kshana_trust_geometry_signal_loss |
gauge | 1, kun näkyvissä olevia satelliitteja ei seurata vaikka niiden geometria on hyvä (signaali katosi, ei taivas; geometry_degraded näyttää yhä 1), muuten 0; puuttuu, kun geometria on tuntematon tai syöte ei kerro (1.3) |
|
kshana_trust_geometry_hdop, ..._pdop, ..._used_satellites |
gauge | HDOP, PDOP ja käytetyt satelliitit viimeisimmällä epookilla; kukin puuttuu, kun ei ole (1.3) | |
kshana_trust_geometry_epochs_total |
laskuri | status |
epookit geometrian tilan mukaan (1.3) |
kshana_trust_geometry_label |
gauge | label |
geometriatunniste viimeisimmällä epookilla, good, fair, poor, unknown: 1 nykyiselle; ei koskaan pisteytetä (pistemäärä vähentää vain arvosta poor); syötteistä, jotka kantavat tunnisteen (0,36) |
kshana_trust_geometry_vdop |
gauge | VDOP viimeisimmällä epookilla; puuttuu, kun ei ole (0.36) |
Geometriatunniste on pääotsikko. Piirrä kuvaaja ja hälytä kohteesta kshana_trust_geometry_label (OTLP kshana.geometry.label, CEF kolmas cs6-kenttä, LEEF geoLabel): poor on ainoa tunniste, josta pistemäärä vähentää. Geometrian tila on kuvaileva: degraded sisältää informatiivisen tapauksen sky-blocked, joka voi tulla hyvän tai kohtalaisen DOP:n kanssa, joten älä hälytä pelkästä kohteesta kshana_trust_geometry_degraded.
Skeeman 1,3 syötteistä kshana_trust_reason_active kantaa myös class-tunnisteen (geometry, environment, inconsistency) jokaisella syyllä, joka tuli sellaisen kanssa: vähennyksen luokka viimeisimmällä epookilla. Geometriasarjat tulevat kaikkien muiden jälkeen ja vasta kun syöteepookki kantaa kohdetta geometry (live-skeema 1,3, tulos moottorista 0,36 tai uudemmasta), joten 0,35-virta tai -tulos renderöityy tavu tavulta kuten ennen. Tunnisteiden arvot ovat kiinteitä joukkoja (tuntematon tila luetaan unknown; tuntematon luokka pudotetaan). Hälytä kohteesta kshana_trust_reason_active{class="inconsistency"} pelkän luokan sijaan, jotta huono taivas ei hälytä hyökkäyksenä; luokka geometry on lausuma taivaasta, ei havainto siitä, ettei hyökkäystä tapahtunut (katso docs/RECEIVER-TRUST.md).
Tunniste class on osa sarjan identiteettiä: kun syyn luokka muuttuu epookkien välillä (loss-of-lock luokasta environment luokkaan geometry, kun menetetyt satelliitit olivat matalalla, tai geometry luokkaan inconsistency, kun ilmoitettu HDOP on ristiriidassa ilmoitetun taivaan kanssa), vanhaa sarjaa ei enää viedä ja uusi alkaa. Kysele kentällä reason ja max by (reason), kun luokalla ei ole väliä, ja odota tällaisen vaihdon näyttävän yhden sarjan päättymiseltä ja toisen alkamiselta. Skeeman 1,3 sarjat, tunniste class ja CEF/LEEF-geometriakentät tarkistetaan moottorin omilla testeillä ja CEF-oraakkeleilla (pycef, Logstash); ulkoisilla Prometheus- ja OTLP-oraakkeleilla ei vielä ole 1,3-virtaa.
Syiden nimet typistetään 128 merkkiin, ja enintään 64 erillistä syytä saa oman sarjansa; myöhemmät lasketaan kohteessa reason="other" ja kohteessa kshana_trust_reason_overflow_total, joten vihamielinen tai viallinen syöte ei voi luoda rajatonta tunnisteiden kardinaliteettia.
band on yksi arvoista calibrating, nominal, degraded, untrusted, unknown. Syiden nimet ovat virran monitorien nimiä (kinematic, heading-course, ...; eräntuloksessa cn0-drop, agc, raim).
Esimerkkikojelauta on tiedostossa deploy/grafana/kshana-gnss-trust.json (tuo se ja valitse Prometheus-tietolähteesi).
Syslog: CEF ja LEEF#
Tapahtumat lähetetään RFC 5424 -kehyksessä (facility local0, sovellus kshana, viestin tunniste GNSSTRUST) UDP:n yli (yksi datagrammi kutakin; IPv4 tai IPv6) tai TCP:n yli, oletuksena rivinvaihtoon päättyen tai asetuksella --syslog-octet-counting kehystettynä <length> <message> kuten RFC 6587:ssä. Oletuksena yksi tapahtuma lähetetään luokan muutosta kohti; --syslog-all lähettää yhden epookkia kohti. Valmistaja kirjoitetaan Ashforde OU (ASCII), jotta mikään SIEM ei tulkitse sitä väärin.
| Käsite | Syslog-vakavuus | CEF-vakavuus | LEEF sev |
|---|---|---|---|
| calibrating | 6 info | 0 | 1 |
| nominal | 6 info | 1 | 1 |
| heikentynyt | 4 varoitus | 5 | 5 |
| untrusted | 2 kriittinen | 9 | 9 |
| unknown | 5 huomautus | 3 | 3 |
Kenttien vastaavuus (tapahtuman tunniste on gnss-trust.<band>):
| Merkitys | CEF | LEEF 2,0 (erotin ^) |
|---|---|---|
| luokka | cat=gnss-trust |
cat |
| lähettävä isäntä | dvchost |
devHost |
| band (luottamusluokka) | cs1 (tunniste band) |
band |
| syyt, pilkuilla erotettuina | cs2 (reasons) |
reasons |
| edellinen luokka | cs3 (previousBand) |
previousBand |
| pistemäärä | cfp1 (trustScore), jätetään pois, jos ei ole |
trustScore |
| epookin siirtymä, s | cfp2 (epochOffsetSeconds) |
epochOffsetSeconds |
| lokin aikatunniste | cs4 (logTime) |
logTime |
| portin tila | cs5 (gate) |
gate |
geometrian tila, sitten ; ja epookin vähennysten luokat pilkuilla erotettuina (esimerkiksi degraded;environment,geometry) (1,3 -syötteet); syötteistä, jotka kantavat tunnisteen (0,36), kolmas kenttä, ; ja tunniste, jolloin luokkakenttä on aina läsnä (esimerkiksi degraded;;poor, good;;fair) |
cs6 (geometry) |
geoStatus (vain tila), geoClass (luokat) ja geoLabel (tunniste) |
| HDOP (1.3) | cfp3 (geometryHdop) |
geoHdop |
| PDOP (1.3) | cfp4 (geometryPdop) |
geoPdop (0,36, tunnisteen kanssa) |
| VDOP (0,36, tunnisteen kanssa) | ei kuljeteta: neljä liukuluku-mukautettua kenttää on otettu | geoVdop |
| käytetyt satelliitit (0,36, tunnisteen kanssa) | cn1 (geometryUsedSatellites), kokonaisluku |
geoUsed |
| signaalin menetys: näkyvissä olevia satelliitteja ei seurata, vaikka niiden geometria on hyvä (1.3) | ei kuljeteta kenttänä (mikään CEF-sanakirjan avain ei ole vapaa sille): tila on degraded ja geometriavähennyksen luokka environment kentässä cs6 |
geoSignalLoss=1, vain kun se pätee |
CEF:ssä geometria käyttää vain sanakirjan mukautettuja kenttiä (ei keksittyjä avaimia); tunniste kulkee kentässä cs6 eikä kentässä flexString1, koska Logstashin CEF-koodekki ei kartoita kenttiä flexString. Geometriatapahtumat 1,3, tunnistetapaukset mukaan lukien, kuuluvat CEF-riviin, jonka taso on VALIDATED: kumpikin oraakkelijäsentäjä lukee ne takaisin sellaisina kuin ne on kirjoitettu (tests/cef_reference.rs, muutokset 4 ja 5, kukin rekisteröitynä ennen kuin kumpaakaan jäsentäjää ajettiin sen tapauksilla). Tunniste-, VDOP- ja satelliittimääräkentät liitetään kaikkien aiempien kenttien ja sarjojen jälkeen, ja vain syötteille, jotka kantavat tunnisteen, joten syöte ilman sellaista renderöityy täsmälleen kuten ennen.
Tyhjät kentät jätetään pois (ei kohdetta cs2= ilman syitä). Isäntänimi typistetään 255 merkkiin. CEF-otsikon arvoissa kenoviivat \ ja | escapataan; laajennusarvoissa \, = ja rivinvaihdot escapataan. LEEF-arvoissa ^ ja rivinvaihdot korvataan välilyönneillä.
OpenTelemetry (oletuksena pois päältä)#
Rakenna asetuksella --features otlp ja anna --otlp http://host:4318/v1/metrics. Viejä lähettää OTLP/HTTP JSONia (kshana.trust.score, kshana.trust.band, kshana.trust.epochs, kshana.trust.reason.epochs, ja skeeman 1,3 syötteille kshana.geometry.status, kshana.geometry.degraded, kshana.geometry.signal_loss, kshana.geometry.hdop, kshana.geometry.pdop, kshana.geometry.used_satellites ja syötteistä, jotka kantavat tunnisteen (0,36), kshana.geometry.label (attribuutti label) ja kshana.geometry.vdop; kumulatiiviset summat kantavat kohdetta startTimeUnixNano) joka --otlp-every epookki (oletus 10) ja syötteen lopussa. Se ei lisää riippuvuutta eikä sisällä TLS:ää: lähetä kerääjälle samalla isännällä tai luotetussa segmentissä, joka välittää eteenpäin TLS:n yli. Päätepisteet https:// evätään.