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
- En administratör skapar ett maskinkonto i valvet och väljer vilka samlingar det får läsa.
- 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.
varnanvä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>
| Del | Vad den är |
|---|---|
organisation | Organisationens kortnamn i Värn, det som står i adressen /o/<kortnamn>/…. Måste vara samma organisation som token hör till. |
samling | Samlingens namn, eller id: följt av samlingens id. |
post | Postens namn, eller id: följt av postens id. |
fält | password, 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önskrivsEkonomi%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
varngissa och visar deras id, så att ni kan byta namn på en av dem eller användaid:. - 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.
varnsparar ingenting på disk utom medvarn inject -o, och värdena finns bara i minnet. - Granska paketet.
@varnsecurity/clipubliceras från CI med npm provenance. Körnpm audit signaturesi ett projekt som installerar det, och ange alltid en exakt version.
Slutkoder
| Kod | Betyder |
|---|---|
| 0 | Klart |
| 2 | Felaktigt kommando eller argument |
| 3 | Felaktig referens |
| 4 | Ingen eller ogiltig token |
| 5 | VARN_API_URL är ogiltig eller inte https |
| 6 | Nätverksfel, tidsgräns eller oväntat svar |
| 7 | Token godtogs inte (återkallad, utgången eller fel nätverk) |
| 8 | Planen saknar säkert valv |
| 9 | Samlingen, posten eller fältet finns inte eller är tomt |
| 10 | Namnet matchar flera samlingar eller poster |
| 11 | För många anrop – försök igen om en minut |
| 12 | Valvet är avstängt |
| 13 | Serverfel |
| 14 | Något kunde inte dekrypteras |
| 15 | Referensen gäller en annan organisation |
| 16 | En fil kunde inte läsas eller skrivas |
När varn run har startat programmet avslutas det med programmets egen slutkod.
