Så kör du HashiCorp Vault i produktion
Henrik Hoegh
Henrik is a DevOps Consultant based in Aarhus. He specializes in Docker, Kubernetes and everything Atlassian. Away from the office Henrik designs loudspeakers and takes a keen interest in quantum physics and astrophotography.
Säkerhet är viktigare än någonsin. Att skydda dina hemligheter bör ha högsta prioritet. I den här bloggen visar vi hur du kommer igång i produktionsmiljö.
I en pipeline för mjukvaruleverans ingår flera miljöer och därmed många typer av hemligheter. Vi skapar våra pipelines som kod, men vi kan förstås inte lagra våra hemligheter i versionshantering. Här på Praqma hade vi en kund som tog upp frågan om hur man skyddar autentiseringsuppgifter för ett containerkluster som används för build och test.
Här kommer HashiCorp Vault in i bilden – ett krypterat nyckellager med mekanismer för att styra åtkomsten till de lagrade värdena. Värden kan vara allt från lösenord, certifikat och URL:er till annan känslig data. Vault stöder flera olika backends för användarautentisering, till exempel GitHub, AWS, LDAP och Radius.
Det är väldigt enkelt att testa Vault med det som kallas dev-mode. Det blir lite mer komplicerat när du vill använda det i produktion. Vi visar hur du konfigurerar Vault i produktionsläge och styr åtkomsten till innehållet.
Kom igång
Vi på Praqma gillar containrar, så det vore märkligt att inte köra Vault i en container. Vår konfiguration bygger på den officiella Docker-imagen för Vault, som underhålls av HashiCorp, och ett kostnadsfritt webbgränssnitt som heter djenriquez/vault-ui. Båda finns på Docker Hub.
En enkel Dockerfile för Vault kan se ut så här:
FROM vault:0.7.0 MAINTAINER PraqmaOch för gränssnittet:
FROM djenriquez/vault-ui:2.1.0 MAINTAINER PraqmaLägg dessa i separata mappar med namnen vault och vault-ui, så är vi redo att bygga och pusha dem till Docker Hub:
docker build -t praqma/vault:0.7.0 vault/. docker build -t praqma/vault-ui:2.0.2 vault-ui/. docker push praqma/vault:0.7.0 docker push praqma/vault-ui:2.0.2När det är klart har vi två images på Docker Hub, redo att användas i vår organisation.
Förbered nätverk och konfiguration
Vault UI behöver ansluta till containern som kör Vault, så låt oss skapa ett nätverk:
docker network create vault-networkDu kan kontrollera att nätverket har skapats genom att köra:
docker network ls NETWORK ID NAME DRIVER SCOPE 7b332ca38df5 bridge bridge local 60f40b5e80f7 vault-network bridge localDärefter skapar vi en konfigurationsfil. Vi behöver ange en plats för backend-lagringen, i det här fallet en fil, vilket adressintervall Vault ska lyssna på och om TLS ska vara inaktiverat eller inte.
Skapa en fil med namnet vault.conf och följande innehåll:
backend "file" { path = "/vault/file/vaultsecrets" } listener "tcp" { address = "0.0.0.0:8200" tls_disable = 1 }Vi väljer att placera lagringsfilen på /vault/file i containern, eftersom det är en av de volymer som definieras av container-imagen som används som grund. På så sätt kan vi montera den på värden om vi vill.
Vi anger att Vault ska lyssna på alla nätverksgränssnitt på port 8200 och inaktiverar TLS eftersom vi inte har några certifikat. När du har det lägger du till två rader som dessa i listener-sektionen:
tls_cert_file = "/root/server.crt" tls_key_file = "/root/server.key"Kom ihåg att kopiera dina certifikat till containern på den plats du anger.
Starta Vault-containern
Nu är vi redo att starta vår Vault-container:
docker run -d --hostname vault --network vault-network --privileged --name vault --cap-add=IPC_LOCK -v vault.conf:/vault/config/vault.conf -v /opt/persistant_storage/vault/:/vault/file/ \ praqma/vault:0.7.0 server -config /vault/config/vault.confVault bör nu vara igång, vilket du kan bekräfta genom att köra:
docker logs vaultDu bör få ett resultat som ser ut så här:
==> Vault server configuration: Cgo: disabled Listener 1: tcp (addr: "0.0.0.0:8200", cluster address: "0.0.0.0:8201", tls: "disabled") Log Level: info Mlock: supported: true, enabled: true Storage: file Version: Vault v0.7.0 Version Sha:614deacfca3f3b7162bbf30a36d6fc7362cd47f0 ==> Vault server started! Log data will stream in below:Hurra, Vault körs. Nu initierar vi det så att vi kan börja använda det.
Initiering
Starta en terminalsession i Vault-containern:
docker exec -it vault /bin/shAnge en miljövariabel som talar om för Vault-klienten var den ska ansluta och initiera sedan Vault:
export VAULT_ADDR=http://127.0.0.1:8200 vault initDu får fem nycklar och en root token. När Vault startar är det förseglat, vilket förhindrar åtkomst till data. De genererade nycklarna används för att öppna Vault, och du behöver minst tre nycklar för att göra det.
Unseal Key 1: z+LgaNbDbejE+hxqq9Q87vjBBfQH6VII1Ey/vmiH+Q4B Unseal Key 2: Zmy5jsn/+LQCMKzaM97imgLOQ2XIBHrmms6Oyxdz5eoC Unseal Key 3: xFEtXOUM6w4JMG+4tf4VaXu/bjoMbQx68/YKzMxO5G4D Unseal Key 4: MKsgyCt935cPcKzvNRPE+0MKOveD0GYvCh7ktsTJvp0E Unseal Key 5: kpa0GgeOzC0EcG+NszMzCDp7F6hHuRCzYyZgsR/0vxkFInitial Root Token: 9cfb29e7-0fde-cc24-df72-76ee59f5c712 Vault initialized with 5 keys and a key threshold of 3. Please securely distribute the above keys. When the Vault is re-sealed, restarted, or stopped, you must provide at least 3 of these keys to unseal it again. Vault does not store the master key. Without at least 3 keys, your Vault will remain permanently sealed.Du öppnar Vault med tre av nycklarna så här:
/ # vault unseal z+LgaNbDbejE+hxqq9Q87vjBBfQH6VII1Ey/vmiH+Q4BSealed: true Key Shares: 5 Key Threshold: 3 Unseal Progress: 1 Unseal Nonce: 88d38704-415f-b945-e00e-747a51aa8f14 / # vault unseal Zmy5jsn/+LQCMKzaM97imgLOQ2XIBHrmms6Oyxdz5eoCSealed: true Key Shares: 5 Key Threshold: 3 Unseal Progress: 2 Unseal Nonce: 88d38704-415f-b945-e00e-747a51aa8f14 / # vault unseal xFEtXOUM6w4JMG+4tf4VaXu/bjoMbQx68/YKzMxO5G4D Sealed: false Key Shares: 5 Key Threshold: 3 Unseal Progress: 0 Unseal Nonce:Nu när Vault är öppet kan vi autentisera oss med root token:
/ # vault auth 9cfb29e7-0fde-cc24-df72-76ee59f5c712 Successfully authenticated! You are now logged in. token: 9cfb29e7-0fde-cc24-df72-76ee59f5c712 token_duration: 0 token_policies: [root]Och vi är inne.
Vi behöver skapa en policy som vårt team kan använda. Den ger dem de behörigheter de behöver när de hämtar data från Vault.
Skapa en policyfil i HashiCorps HCL-format i containern:
vi /vault/praqma-policy.hclMed följande innehåll:
path "*"{ capabilities = [ "create", "read", "update", "list" ] }Detta ger användarna åtkomst till allt som rör dessa åtgärder, men exempelvis inte till att radera secrets. Detta är endast för demonstrationssyfte och du bör anpassa det efter era säkerhetsstandarder.
Skapa sedan policyn:
/ # vault policy-write praqma /vault/praqma-policy.hcl Policy 'praqma' written.Nu aktiverar vi en GitHub-backend så att våra medarbetare kan använda sina GitHub-konton för att logga in i Vault UI.
/ # vault auth-enable github Successfully enabled 'github' at 'github'!Ange den organisation som en GitHub-användare måste vara medlem i:
/ # vault write auth/github/config organization=Praqma Success! Data written to: auth/github/config/ # vault write auth/github/map/teams/default value=praqma Success! Data written to: auth/github/map/teams/defaultI det här exemplet använde vi teamet default. Du kan ha flera team med olika policyer, till exempel ops och dev, för mer detaljerad kontroll av åtkomstnivåer.
Starta Vault UI-containern
Avsluta Vault-containern så att vi kan starta UI-containern.
Vi behöver ange två miljövariabler: VAULT_URL_DEFAULT pekar på Vault-servern och VAULT_AUTH_DEFAULT anger standardmetoden för autentisering, i det här fallet GitHub:
docker run -d \ -p 8000:8000 \ --network vault-network \ --hostname vault-ui \ -e VAULT_URL_DEFAULT="http://vault:8200" \ -e VAULT_AUTH_DEFAULT="GITHUB" \ --name vault-ui \ praqma/vault-ui:2.0.2När du kör docker ps bör du se två containrar som körs: vault och vault-ui:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5941ad1aaeb8 praqma/vault-ui:2.0.2 "/entrypoint.sh np..." 5 seconds ago Up 4 seconds 0.0.0.0:8000->8000/tcp vault-ui d0d126ac150e praqma/vault:0.7.0 "docker-entrypoint..." 19 minutes ago Up 19 minutes 8200/tcp vaultVi ser att Vault lyssnar på port 8200 och Vault-UI på port 8000. Gå till http://localhost:8000 så bör du se Vault-UIs inloggningssida.
Gå nu till github.com, klicka på Settings under din profilbild och sedan på Personal access tokens i menyn till vänster. Klicka på knappen ”Generate new token”, ge tokenen ett namn och välj vilka behörigheter du vill ge den (du behöver minst läsbehörighet).
Ange tokenen i Vault-UI för att logga in. Du bör nu se användargränssnittet.
Klicka på menyalternativet ”secret” i menyn till vänster och sedan på knappen ”new secret”. Ge secretet ett namn och ett hemligt värde (genom att klicka på rutan bredvid ”(empty object)”) och klicka sedan på Save. Det nya objektet bör visas. Prova att klicka på papperskorgen till höger. Du får meddelandet ”Error, Access denied”, enligt den policy vi skapade tidigare.
Sammanfattning
Vi har kommit igång med Vault, utöver dev-mode. Vi har sett hur du kör och konfigurerar Vault-servern och ett UI där du kan få en överblick.
- Moln
- Säkerhet
Subscribe to our newsletter
Related blogs