Sikkerhed
Noa kan ikke stoppe en handling, der aldrig når frem til Noa. Garantien kræver alle fire regler nedenfor.
NOA Mandate har én måde at blive brugt på: med alle fire regler. Der er ingen delvis tilstand.
Når disse regler håndhæves, udføres ingen beskyttet handling uden en gyldig godkendelse. Den signerede kvittering registrerer beslutningen; den beviser ikke, at penge blev flyttet, eller at en fysisk opgave blev udført. Kontrol af en gammel kvittering kræver også den offentlige nøgle og dens gyldighedshistorik.
Status, 3. oktober 2026: dørvagten — softwarepakken til JavaScript/TypeScript og MCP-proxyen, en bro til AI-værktøjer — er tilgængelig på npm, pakkebutikken. Gate er en referenceprototype med åben kildekode, som bruger en testbogføring — en demoregnskabsbog, ikke rigtige penge. Boksvagten er under udvikling: dens verifikationsspecifikation og testvektorer er offentlige i noa-mandate-core; selve vagten er endnu ikke tilgængelig. Der er endnu ikke bevis for, at noget eksternt betalings-, database- eller produktionssystem opfylder alle fire regler. Pilotforløb starter, når bokslåsens grundlæggende dele er bygget og kontrolleret af andre end dem, der bygger den. Dørvagten alene leverer ikke denne garanti.
Den hostede konsol er i beta. Godkendelse på telefonen gennem relæpostkassen blev senest påvist i vores eget arbejdsområde den 29. september 2026. Tilmelding er åben, og konsollen er gratis under beta uden løfte om oppetid. Send ikke beskyttede produktionshandlinger gennem beta.
Nedenfor står konsollens kontroller, som findes i kildekoden, med deres begrænsninger. Konsollens kildekode er privat; kvalificerede kontrollanter kan anmode om adgang under en fortrolighedsaftale.
Ingen certificering
Denne side beskriver kontroller, der findes i indtjekket, testet kode eller i en dokumenteret driftsprocedure — den er ikke en SOC 2-rapport, et resultat af en penetrationstest eller en certificering af nogen art, og intet af dette påstås noget sted på siden. En færdig SOC 2-rapport kan kun udstedes af et uafhængigt CPA-firma efter dets egen undersøgelse. Se /regulations for begrænsningerne i koblingen til lovgivningen. SOC 2 er en uafhængig revisionsrapport.
Hvem må gøre hvad, og om én kunde nogensinde kan se en anden kundes data.
4 roller (internal_admin, org_admin, approver, auditor) og 45 tilladelser, opregnet som data frem for spredt over `if`-udtryk, håndhæves ved hver konsolrute, før rutens kode køres.
lib/console-permissions.tslib/console-guard.tsPostgres Row-Level Security håndhæves på databasens ROLE-niveau, ikke kun i applikationens `WHERE`-filtre — produktion kræver et særskilt NOINHERIT-login, som ikke ejer databasen, og som med SET LOCAL ROLE skifter til en applikationsrolle uden superbruger- eller BYPASSRLS-rettigheder pr. transaktion. Før deployment afvises privilegerede driftslegitimationsoplysninger, og parathedskontrollen afviser adgang (503), hvis den effektive rolle kan omgå RLS.
infra/postgres/005_noa_console_rls.sqlinfra/postgres/014_noa_console_app_role.sql/health/ready (kontrol af drift)Hvordan en operatør beviser sin identitet, og hvordan en virksomheds identitetsudbyder tilsluttes.
Ekstra autentifikation er påkrævet før følsomme ændringer (eksport af revisionsspor, nøglerotation, håndtering af tillidsrødder, parring af enheder) og må højst være 10 minutter gammel. Som standard er det nok at indtaste din adgangskode igen. En organisation kan hæve sit minimumskrav til en passkey (WebAuthn) eller et nyt login gennem sin udbyder af fælles login.
lib/console-guard.tslib/console-webauthn.tslib/console-step-up-policy.tsOIDC (PKCE + nonce + state) og SAML (signaturkontrolleret, med cache til at afvise gentagelser).
app/admin/auth/oidc/[connectionId]/{start,callback}/route.tsapp/admin/auth/saml/[connectionId]/{start,callback,metadata}/route.tsSCIM v2, autentificeret med bearer-token og afgrænset til kunden, med kaskadevis fjernelse af adgang. Selve bearer-tokenet kan tilbagekaldes.
lib/console-scim.tsManipulation kan PÅVISES, ikke FORHINDRES: en omskrivning kan opdages, men er ikke umulig for den, der har både databasen og signeringsnøglen.
Revisionshændelser kan kun tilføjes, og hver hændelse henviser til den forriges hashværdi (sha256 af en kanonisk JSON-form). En eksport, der kræver ekstra autentifikation, indeholder konsollens eget genberegnede resultat af kædekontrollen sammen med dataene, så kundens revisor selvstændigt kan gentage kontrollen frem for at stole på vores erklæring. Eksportens begrænsning angives ærligt: højst 10.000 hændelser pr. eksport — over grænsen afviser ruten og henviser til SIEM-strømmen, som kan genoptages, frem for at afkorte i stilhed.
lib/console-audit.tslib/console-audit-chain.tsapp/admin/audit/export/route.tsHver kædes hoved kan signeres med en Ed25519-nøgle, der opbevares uden for databasen (eventuelt tidsstemplet af en ekstern RFC 3161-tjeneste), og sendes som NDJSON til kundens eget SIEM. Dette gør en senere omskrivning af en tidligere hændelse synlig for enhver, der har en kopi af forankringen — det forhindrer ikke i sig selv en omskrivning af en aktør, der har både databasen og signeringsnøglen. Inaktivt, indtil en operatør konfigurerer en signeringsnøgle; opfinder aldrig en forankring og afslutter aldrig i stilhed, som om en var oprettet.
scripts/audit-anchor.mjsscripts/siem-export.mjsÉn kontrolleret bevispakke ad gangen, sendt som sine kanoniske bytes, så `sha256(exported file)` matcher en svarheader — læseren behøver ikke stole på en genberegning.
app/admin/evidence/export/route.tsTo kontroller: ens resultater i browser og Node i dette websteds private CI samt en offentlig verifikatormatrix på tværs af programmeringssprog.
Den kanoniske Node-verifikator (node:crypto) til Ed25519 sammenlignes med erstatningsmodulet til browseren (@noble/curves), som dette websteds eget /playground bruger, mod 5 klasser af skadelige testvektorer (ændrede signaturer, som ligner ægte signaturer, svage nøgler, tal uden for intervallet, ugyldige nøgleformater og forkert formateret base64-tekst). Det sjette beviskort linker til en separat offentlig verifikatormatrix. Køres i dette websteds CI ved hvert push til main; testkoden er privat.
Hvad der lagres, og i hvilken form. Konsollen og databasen hostes i Railways EU West-region; destinationer for sikkerhedskopier og andre databehandlere står på /subprocessors.
Afgrænset påstand, præcist formuleret: i mobilappens loginmateriale til e-mail-links lagres e-mailadressen kun som en hashværdi med nøgle, tokenet i loginlinket og sessionens bearer-token lagres som sha256-hashværdier, der sammenlignes i konstant tid, og sessionens identitet er et uigennemskueligt internt bruger-id. Konsollens kontoprofil lagrer selve din login-e-mailadresse, så vi kan drive din konto — se /privacy.
lib/console-mobile-auth-core.tslib/console-mobile-auth.tsKontoens e-mailadresse — /privacy (på engelsk)Databehandlere — /subprocessors (på engelsk)Relæpostkassen i drift lagrer den Gate-signerede anmodning om en afventende handling, dens DEFERRED-kvittering (registreringen af, at handlingen venter), godkendelsesvisningen krypteret til enhedens nøgle, enhedens signerede beslutning samt identifikatorer for agent, legitimationsoplysninger og Gate. Konsollen kan ikke læse visningen og giver aldrig godkendelse ud fra disse rækker. Udløbne rækker kan først slettes, når den længste af 30 dage og organisationens opbevaringsperiode er gået siden udløbet.
infra/postgres/067_noa_console_gate_relay_mailbox.sqlapp/v1/mobile/approvals/route.tslib/console-gate-relay.tsOprydningsværktøjet bruger hver organisations konfigurerede opbevaringsperiode og sletter udløbet loginmateriale, gamle sikkerhedshændelser og udløbne rækker i relæpostkassen, som har passeret deres opbevaringsgrænse, ved en udtrykkelig --apply-kørsel (en prøvekørsel er standard). Det rører bevidst ikke selve revisionskæden, som kun kan tilføjes til.
scripts/retention-sweep.mjsHvordan et problem rapporteres, og hvordan ændringer leveres.
RFC 9116 security.txt, maskinlæsbar, på standardstien til velkendte oplysninger.
Idempotente Postgres-migrationer med kontrolsummer, kørt mod en rigtig PostgreSQL 18-instans i CI før merge. Migrationsværktøjet afviser alle andre hovedversioner af serveren før kørsel.
scripts/migrate.mjsscripts/migrate-smoke.shEn logisk gendannelsesprocedure, som afviser ved fejl, med indtjekkede øvelsesværktøjer: restore-drill.sh og særskilte verifikatorer til den gendannede migrationsbog, den gendannede revisionskæde og core-8-invarianterne. Den historiske øvelse registreret den 2026-08-29 gendannede en logisk produktionskopi bundet til en hashværdi i isoleret PostgreSQL 18 ved præcis version 060: 60 migrationer og 92 offentlige tabeller, hvor alle MVCC-tabelfingeraftryk og kontroller af revision og RLS/ACL bestod. Dens afgrænsede resultat er SEMANTIC_PASS_WITH_NON_MVCC_SEQUENCE_BOUNDARY, fordi PostgreSQL-sekvenser ikke blev sat i ro. Det beviser ikke, at udbyderens egne sikkerhedskopier kan gendannes, udbyderens PITR-konfiguration eller aktuelle driftstilstand eller produktionens RPO/RTO.
scripts/restore-drill.shscripts/verify-restored-migration-ledger.mjsrelease-evidence/production-logical-restore-snapshot-20260829T125200Z.jsondocs/PRODUCTION-RUNBOOK.mdEn automatisk parathedsvagt kører fra indtjekket kode: en planlagt arbejdsgang kontrollerer produktion, åbner én P1-hændelsessag uden dubletter ved fejl og lukker den efter bekræftet genopretning. Hyppigheden angives ærligt — GitHubs planlægger leverer efter bedste evne, så hver kørsel måler og rapporterer sit eget mellemrum siden forrige kontrol (observerede mellemrum på op til 2h35m oplyses i selve arbejdsgangen) frem for at påstå et interval på fem minutter, som den ikke kan overholde; et indtjekket script til ekstern kontrol kører den samme parathedskontrol og varsler ved fejl, hver gang en ekstern planlægger kalder det. Intervallet fastsættes af den planlægger, og ingen er endnu tilsluttet i produktion. Stadig åbent, klart nævnt: en planlægger med garanterede intervaller i produktion og en offentlig statusside. SIEM-eksporten ovenfor er fortsat vejen til kundens egen overvågning.
.github/workflows/production-readiness-pager.ymlmonitoring/external-probe/probe-and-page.mjsscripts/production-monitor.mjsResterende risici — nævnt, ikke skjult
Har du fundet en sårbarhed, eller har du brug for adgang til kodearkivet under en fortrolighedsaftale?
Rapportér et sikkerhedsproblem via /.well-known/security.txt, eller send os en e-mail direkte.