Hoppa till innehållet
Kom igång
Säkerhet

Det säkraste fältet är det som aldrig skickas

Maskningen sker på enheten, före överföringen. Ett personnummer som ersattes med [personnummer] i webbläsaren finns inte hos oss, alltså behöver det varken sökas fram, bedömas eller raderas när någon begär det. Nedan står vad som maskas, vad ni styr själva, hur ni kör Log i er egen miljö, och vem som kommer åt det som ligger kvar.

21Fältnamn som maskas innan något lämnar enhetenDEFAULT_SCRUB i packages/telemetry
5Mönster som maskas oavsett vilket fält de står iPATTERNS i packages/telemetry
0Inställningar som stänger av maskningenscrubKeys lägger till, den ersätter aldrig
Maskningen körs på er maskin, före sändningen.
Var datan ligger

I Europa, med maskning innan den lämnar din process

Tjugoen fält och fem mönster maskas i klienten, alltså före sändningen. Det som aldrig lämnar din server kan ingen läcka.

  • Rader av serverskåp
    Lagring i Europa, med utpekad region.
  • Ett patchpanelfält
    Maskningen sker hos dig, inte hos oss.
  • En äldre stordator med paneler
    Historiken går att exportera, hela vägen tillbaka.
  • Regionen står utpekad, inte antydd.
  • Det som aldrig lämnar er process kan ingen läcka.
  • Historiken går att exportera hela vägen tillbaka.
Maskning av personuppgifter

Fem mönster och tjugoen fältnamn, före sändningen

Maskningen körs på två sätt samtidigt. Fältnamnet jämförs mot standardlistan, och innehållet jämförs mot mönstren. Ett värde behöver alltså bara träffa en av dem för att ersättas.

Mönstren, med ett exempel före och efter

De 5 mönster som maskas oavsett fältnamn, med formen de träffar och vad de ersätts med.
VadFormen som träffasBlir
PersonnummerSex siffror, valfritt bindestreck eller plus, sedan fyra siffror[personnummer]
KortnummerTretton till nitton siffror, med eller utan mellanslag och bindestreck[kortnummer]
E-postadressNamn, snabel-a, domän och toppdomän[epost]
Nycklarsk_, pk_ eller rk_ följt av live eller test och minst tio tecken[nyckel]
BärartokenOrdet Bearer följt av ett värdeBearer [maskerad]
  • PersonnummerKund 900101-1234 kunde inte betalaKund [personnummer] kunde inte betala
  • KortnummerAvvisat kort 4242 4242 4242 4242Avvisat kort [kortnummer]
  • E-postadressIngen mottagare för anna@example.seIngen mottagare för [epost]
  • NycklarNekad med sk_live_51Hx9QpABCDEFNekad med [nyckel]
  • BärartokenAuthorization: Bearer eyJhbGciOiJIAuthorization: Bearer [maskerad]

Mönstren ligger i PATTERNS och körs av scrubString i packages/telemetry/src/index.ts. De körs på meddelandet och på stackspåret, alltså också på text ni själva aldrig hade tänkt skicka.

REGLERpii.personnrpii.cardpii.emailpayloadpersonnr850101-0000000000-0000kort4242 4242 42420000 0000 4242FÖRE SÄNDNING0 RÅVÄRDEN

21 fältnamn, ordagrant ur standardlistan

  • password
  • losenord
  • lösenord
  • token
  • secret
  • authorization
  • cookie
  • apikey
  • api_key
  • personnummer
  • ssn
  • card
  • kortnummer
  • cvc
  • cvv
  • iban
  • email
  • epost
  • e-post
  • phone
  • telefon

Jämförelsen görs gemen och på delsträng. Ett fält som heter kundEpost träffar alltså epost, och ett fält som heter API_KEY_V2 träffar api_key. Värdet ersätts med [maskerad], och nyckelns namn står kvar så att felet fortfarande går att läsa.

Fältnamn i standardlistan
21
Mönster som gäller oavsett fältnamn
5
Egna fältnamn ni lägger till i scrubKeys
utan tak
Nivåer maskningen går ned i ett nästlat objekt
6
Poster som behålls ur en lista
50
Nivåer där maskningen går att stänga av
0

Listan och jämförelsen ligger i DEFAULT_SCRUB och i funktionen scrub i packages/telemetry/src/index.ts. Maskningen går sex nivåer ned i ett nästlat objekt och kortar en lista till femtio poster, så att ett djupt objekt inte kan smyga förbi genom att vara djupt.

app/routes/kassa.tsxTypeScript
1log.captureError(fel, {
2  ordernummer: order.id,
3  epost: "anna@example.se",
4  authorization: "Bearer eyJhbGciOiJI",
5  meddelande: "Kund 900101-1234 nekades",
6});

Så här ser anropet ut i er kod. Fälten epost och authorization träffar standardlistan, och personnumret inuti meddelandet träffar ett mönster.

nyttolast till inmatningenJSON
1"context": {
2  "ordernummer": "SO-49182",
3  "epost": "[maskerad]",
4  "authorization": "[maskerad]",
5  "meddelande": "Kund [personnummer] nekades"
6}

Så här ser samma anrop ut när det lämnar enheten. Ordernumret står kvar, eftersom det är det ni behöver för att felsöka. Resten är borta redan här, inte hos oss.

  • Fältnamnet och innehållet prövas samtidigt.
  • Mönstren körs också på stackspåret, inte bara på fälten.
Datastyrning

Ni bestämmer vad som skickas, hur länge det ligger kvar och var

Fyra reglage, och alla fyra sitter hos er. Två av dem sitter i klienten och gäller före sändningen, två sitter i projektet och gäller det som redan kommit in.

  • Egna fält som alltid maskas

    scrubKeys tar era egna fältnamn, till exempel kundnummer eller leveransadress. De läggs till standardlistan. Det finns ingen väg att ta bort ett namn som redan står där, alltså kan en förbättring i klienten aldrig göra er behandling sämre.

    Gäller före sändningen
  • Hur mycket som skickas alls

    sampleRate avgör andelen som lämnar enheten, och maxEventsPerSession sätter taket per session till hundra som standard. Det som sållas bort räknas i dropped.sampled respektive dropped.quota, så en förlust är aldrig tyst.

    Gäller före sändningen
  • Ingenting alls från utvecklingsmiljön

    Är environment satt till development returnerar capture direkt. Era lokala fel, era testkunder och era påhittade personnummer lämnar aldrig maskinen, och de kostar heller ingenting av kvoten.

    Gäller före sändningen
  • Hur länge det ligger kvar

    Kvarhållningen sätts per projekt och inte per konto, alltså kan ett projekt med känsligare data hålla kortare än resten. Fri håller 30 dagar och Team håller 90 dagar.

    Ingår från Fri
  • Regler per fält, för den som måste kunna visa dem

    Planen Enterprise bär datastyrning per fält, med regler för vad som aldrig får lagras. Regeln gäller på mottagningssidan och träffar därmed också det som kommer in via OpenTelemetry från ett annat språk.

    Ingår i Enterprise
  • Ut igen, när ni vill

    Exporten är öppen hela tiden och kostar ingenting. Ni behöver inte fråga oss, och ni behöver inte säga upp något för att få ut era data.

    Ingår från Fri

scrubKeys, sampleRate, maxEventsPerSession och environment är fält i TelemetryConfig i packages/telemetry/src/index.ts. Kvarhållningen står som kvot i planerna i packages/pricing/src/index.ts, och datastyrning per fält står i planen Enterprise i samma fil.

app/entry.client.tsxTypeScript
1const log = initTelemetry({
2  ingestKey: "gdr_pk_din_nyckel",
3  environment: "production",
4  scrubKeys: ["kundnummer", "leveransadress", "fodelsedatum"],
5  sampleRate: 0.25,
6  maxEventsPerSession: 50,
7});

Fyra rader beskriver hela er behandling på klientsidan: vad som maskas utöver standarden, hur stor andel som skickas, och hur många händelser en session får producera innan taket slår till.

VARM 7 dKALL 30 dUT 90 dapiwebjobsKVARHÅLLNING SÄTTS PER PROJEKT
SESSION 4d1eanna.lind4242 4242 4242ENHETLAGRINGMASKAT
  • Två reglage sitter i klienten och gäller före sändningen.
  • Två sitter i projektet och gäller det som redan kommit in.
  • Ingen inställning stänger av maskningen.
Drift i egen miljö

Er maskin, era nycklar, samma produkt

Säger era efterlevnadskrav att loggarna aldrig får lämna er miljö, så gör de inte det. Klienten pekar om sin endpoint, och resten av koden ser likadan ut.

  • Allt i Team
  • Drift i er miljö, eller i vår, i Sverige
  • SSO, SCIM och revisionslogg
  • Datastyrning per fält, med regler för vad som aldrig får lagras
  • Svarstid enligt avtal, med kompensation om vi missar den

Vill ni hellre att vi kör den åt er gör vi det i Sverige, med regionen utpekad i avtalet. Båda vägarna ligger i planen Enterprise, som prissätts i avtal.

Innehållet i listan är planen Enterprise ordagrant som den står i packages/pricing/src/index.ts. Fältet endpoint står i TelemetryConfig i packages/telemetry/src/index.ts, med standardvärdet https://log.gaddr.com/api/ingest/v1.

EGEN MILJÖBRANDVÄGGSAMMA BINÄRINGEN UTGÅENDETELEMETRILICENS OFFLINE
app/entry.client.tsxTypeScript
const log = initTelemetry({
  ingestKey: "gdr_pk_din_nyckel",
  environment: "production",
  endpoint: "https://log.internt.example.se/api/ingest/v1",
});

En rad skiljer drift hos oss från drift hos er. Maskningen, taket och buntningen fungerar likadant i båda fallen, eftersom de sitter i klienten och inte i mottagaren.

  • En rad skiljer drift hos oss från drift hos er.
  • Klienten pekar om sin endpoint, resten ser likadan ut.
level:error AND svc:pay1 284 TRÄFFAR3 902 TRÄFFAR11 447 TRÄFFARRÅDATALIVE
RevisionsloggenEn lupp sveper nedför en spalt med loggrader. Varje rad den passerar lyser upp, och i en egen liggare till höger fylls en rad märken på, en för varje läsning.
Revisionslogg

Vem läste vad, och när

En loggplattform samlar det känsligaste ni har och gör det sökbart för hela teamet. Då är frågan om vem som sökte på vad en säkerhetsfråga i sig, och den ska gå att besvara i efterhand.

  • Varje sökning, varje öppnad session och varje export skrivs som en rad med konto, tidpunkt och vad som lästes.
  • Raderna går att läsa i vyn och att hämta ut, så att de kan läggas i ert eget arkiv utan att gå genom oss.
  • Kontona styrs med SSO och SCIM, alltså tas åtkomsten bort i samma stund som anställningen gör det, från ert eget katalogsystem.
  • Revisionsloggen går inte att redigera från vyn. En rad som går att ta bort av den som granskas är inte en revisionslogg.

Att alla i teamet får ett eget konto är en säkerhetsegenskap och inte bara en prisfråga. Delade inloggningar uppstår när ett konto kostar pengar, och en delad inloggning gör varje revisionslogg oläsbar. Kvoten för användare är utan tak redan i planen Fri, som kostar 0 kr.

SSO, SCIM och revisionslogg står i planen Enterprise i packages/pricing/src/index.ts. Kvoten för användare står i planen Fri i samma fil.

  • Frågan om vem som sökte på vad går att besvara i efterhand.
  • Åtkomsten är en säkerhetsfråga i sig, inte en eftertanke.
Frågor

Det som brukar komma från den som ska godkänna

Varje svar pekar på en funktion i koden eller på en plan i prislistan.

Vanliga frågor

Går maskningen att stänga av?

Nej. Standardlistan läggs alltid först, och era egna namn i scrubKeys läggs till efter den. Det finns ingen flagga som tömmer listan, alltså kan ingen i ert team råka skicka ett lösenord genom att ändra en inställning.

Var sker maskningen, hos er eller hos oss?

Hos er, i klienten, före överföringen. Det är hela poängen. Data som aldrig lämnade enheten behöver varken sökas fram, bedömas eller raderas när någon begär det, och den kan inte läcka från en lagring den aldrig låg i.

Vad händer med ett personnummer som ligger inuti ett felmeddelande?

Det ersätts med [personnummer]. Mönstren körs på meddelandet och på stackspåret, inte bara på fälten ni skickar med som kontext. Ett kortnummer i samma mening ersätts med [kortnummer] i samma anrop.

Kan vi lägga till egna fält som alltid ska maskas?

Ja, med scrubKeys. Ni skickar in en lista med namn, till exempel kundnummer eller leveransadress, och de behandlas som standardlistans namn. Antalet är utan tak.

Är inmatningsnyckeln en hemlighet?

Nej. Den är publik, den skriver bara, och den får ligga i klientbygget. Den ger ingen åtkomst att läsa era data. Läcker den ändå återkallar ni den i projektets inställningar och skapar en ny.

Kan vi köra Log helt i vår egen miljö?

Ja, i planen Enterprise. Klienten pekar om sin endpoint och resten av koden ser likadan ut. Vill ni hellre att vi driftar den kör vi i Sverige, med regionen utpekad i avtalet.

Vem hos er kan läsa våra loggar?

Ingen utan att det står i revisionsloggen. Kör ni i egen miljö når vi dem inte alls, eftersom de aldrig lämnar er drift. Personuppgiftsbiträdesavtalet och registret över behandlingar hör till avtalet i planen Enterprise.

Skickar ni våra data vidare till någon annan?

Nej. Era data säljs inte vidare i någon form, och de används inte till något annat än att visa dem för er. Det står i villkoren och i integritetsinformationen.

Vad kostar säkerheten extra?

Maskningen, taket och kvarhållningen per projekt ingår från planen Fri, som kostar 0 kr. SSO, SCIM, revisionslogg och datastyrning per fält ligger i Enterprise, som prissätts i avtal. Beloppen på prissidan står exkl. moms.

Läs koden innan ni tror oss

Varje påstående på den här sidan pekar på en funktion i packages/telemetry/src/index.ts eller på en plan i packages/pricing/src/index.ts. Kom igång visar samma sak i den ordning ni skriver den.

Läs koden innan ni tror oss.