Hoppa till innehåll

Hemligheter i kod och CI

Lanseras efter en oberoende granskning. Referera till valvets hemligheter från kod och CI med varn, utan att lägga dem i koden.

Lanseras efter en oberoende granskning – inte aktiverat ännu

Säkert valv, maskinkonton och kommandoradsverktyget varn är byggda men ännu inte aktiverade. De lanseras när en oberoende säkerhetsgranskning är klar. Den här sidan beskriver hur det kommer att fungera.

Lösenord och API-nycklar hör inte hemma i koden, i .env-filer som delas eller i CI-inställningar som många kan läsa. Med Värn skriver ni i stället en referens till hemligheten i ert säkra valv:

DATABASE_PASSWORD=varn://exempel/Produktion/Produktionsdatabas/password
STRIPE_KEY=varn://exempel/Produktion/Stripe/password

och startar programmet genom kommandoradsverktyget varn:

varn run -- npm start

varn hämtar de krypterade posterna, dekrypterar dem på den egna maskinen och startar programmet med de riktiga värdena i miljön. Värn ser aldrig hemligheterna i klartext eller någon nyckel som kan dekryptera dem – inte heller när en maskin läser dem. Säkert valv ingår i Business och Enterprise.

Så fungerar det

  1. En administratör skapar ett maskinkonto i valvet och väljer vilka samlingar det får läsa.
  2. Maskinkontot får en token som bara visas en gång. Den innehåller maskinens privata nyckel och lagras som en hemlighet där programmet körs, till exempel i GitHub Actions.
  3. varn använder token för att hämta samlingarnas krypterade innehåll från Värn, dekrypterar lokalt och slår upp namnen i referenserna på maskinen. Värn får aldrig veta vilka poster ett program använder.

Ett maskinkonto kan bara läsa. Det har ett slutdatum, kan begränsas till vissa IP-adresser och kan återkallas direkt. Varje läsning loggas med IP-adress, och administratörer aviseras första gången ett maskinkonto används från ett nytt nätverk.

Skapa ett maskinkonto

Öppna Maskinkonton

Gå till Säkert valv → Maskinkonton, lås upp valvet och klicka Nytt maskinkonto. Det kräver administratör som själv har åtkomst till samlingarna.

Välj samlingar, giltighetstid och nätverk

Ge kontot ett namn, till exempel "GitHub Actions – webbshop", och bara de samlingar det behöver. Välj hur länge det ska gälla (högst ett år) och, om ni kan, vilka IP-adresser det får anropa från.

Spara token

Kopiera token eller ladda ner den som textfil och spara den direkt som en hemlighet, till exempel VARN_TOKEN i GitHub. Värn kan inte visa den igen.

Referenser

varn://<organisation>/<samling>/<post>/<fält>
DelVad den är
organisationOrganisationens kortnamn i Värn, det som står i adressen /o/<kortnamn>/…. Måste vara samma organisation som token hör till.
samlingSamlingens namn, eller id: följt av samlingens id.
postPostens namn, eller id: följt av postens id.
fältpassword, username, url eller notes.
  • Namn jämförs utan hänsyn till stora och små bokstäver och skrivs URL-kodade: ett mellanslag blir %20, ett snedstreck %2F. Ekonomi & lön skrivs Ekonomi%20%26%20l%C3%B6n (å, ä och ö går också bra okodade).
  • Id ändras aldrig, även om någon byter namn på posten. Namn är lättare att läsa.
  • Om två poster i samma samling har samma namn vägrar varn gissa och visar deras id, så att ni kan byta namn på en av dem eller använda id:.
  • En referens avslöjar ingenting utan en token, så den kan ligga i ett publikt repository.

Installera varn

varn är ett npm-paket utan beroenden som kräver Node.js 20 eller senare. Ange alltid en exakt version:

npx @varnsecurity/cli@0.1.0 --version
# eller installera det
npm install --global @varnsecurity/cli@0.1.0

Token läses från miljövariabeln VARN_TOKEN, eller från en fil med --token-file <sökväg> (även textfilen ni laddade ner när kontot skapades).

Kör ett program

export VARN_TOKEN=varn_mt_…
DATABASE_PASSWORD=varn://exempel/Produktion/Produktionsdatabas/password varn run -- npm start

Varje miljövariabel vars värde är en varn://-referens ersätts med hemligheten innan programmet startar. Med --env-file .env läses variabler även från en fil; filens värden gäller före den vanliga miljön. Programmet får inte VARN_TOKEN.

Om programmet skriver ut en hemlighet ersätts den med <varn:concealed>, så att den inte hamnar i CI-loggar. Programmets utdata går då genom ett rör i stället för direkt till terminalen; --no-masking stänger av maskeringen. varn vidarebefordrar signaler och avslutas med programmets egen slutkod.

Läs ett värde

varn read varn://exempel/Produktion/Stripe/password

Värdet skrivs till standard ut, med radbrytning bara när det visas i en terminal.

Fyll i en konfigurationsfil

Skriv platshållare i en mall, till exempel config.yml.tpl:

database:
  user: {{ varn://exempel/Produktion/Produktionsdatabas/username }}
  password: {{ varn://exempel/Produktion/Produktionsdatabas/password }}
varn inject -i config.yml.tpl -o config.yml

Filen skrivs med behörigheten 0600 så att bara ni kan läsa den. Utan -o skrivs resultatet till standard ut. Det här är det enda sättet varn skriver hemligheter till disk; ta bort filen när den inte behövs.

GitHub Actions

- uses: actions/setup-node@v4
  with:
    node-version: 22
- name: Driftsätt
  run: npx --yes @varnsecurity/cli@0.1.0 run -- ./deploy.sh
  env:
    VARN_TOKEN: ${{ secrets.VARN_TOKEN }}
    DATABASE_PASSWORD: varn://exempel/Produktion/Produktionsdatabas/password

Hemligheterna finns då bara i det steget, och allt deploy.sh skriver ut maskeras. Det finns också en färdig action som kan exportera värden till senare steg, maskerade med GitHubs ::add-mask::; se README för @varnsecurity/cli.

Säkerhet

  • Token är nyckeln. Den som har den kan läsa maskinkontots samlingar tills den slutar gälla eller återkallas. Lägg den bara i en hemlighetshanterare, aldrig i koden eller i valvet.
  • Ge så lite som möjligt. En samling per miljö, ett maskinkonto per system, kort giltighetstid och tillåtna nätverk när det går.
  • Om en token läcker: återkalla maskinkontot under Säkert valv → Maskinkonton. Rotera sedan samlingarna det kunde läsa och byt de riktiga lösenorden.
  • Ingen cache. varn sparar ingenting på disk utom med varn inject -o, och värdena finns bara i minnet.
  • Granska paketet. @varnsecurity/cli publiceras från CI med npm provenance. Kör npm audit signatures i ett projekt som installerar det, och ange alltid en exakt version.

Slutkoder

KodBetyder
0Klart
2Felaktigt kommando eller argument
3Felaktig referens
4Ingen eller ogiltig token
5VARN_API_URL är ogiltig eller inte https
6Nätverksfel, tidsgräns eller oväntat svar
7Token godtogs inte (återkallad, utgången eller fel nätverk)
8Planen saknar säkert valv
9Samlingen, posten eller fältet finns inte eller är tomt
10Namnet matchar flera samlingar eller poster
11För många anrop – försök igen om en minut
12Valvet är avstängt
13Serverfel
14Något kunde inte dekrypteras
15Referensen gäller en annan organisation
16En fil kunde inte läsas eller skrivas

När varn run har startat programmet avslutas det med programmets egen slutkod.