HashiCorp Vaultin käyttö tuotannossa
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.
Tietoturva on tärkeämpää kuin koskaan. Salaisuuksien suojaamisen tulisi olla ensisijainen tehtävä. Tässä blogissa näytämme, miten pääset alkuun tuotantoympäristössä.
Ohjelmistotoimituksen putkessa on mukana useita ympäristöjä ja siten monenlaisia salaisuuksia. Luomme putket koodina, mutta salaisuuksia ei tietenkään voi tallentaa versionhallintaan. Praqmalla asiakkaamme nosti esiin kysymyksen siitä, miten rakennukseen ja testaukseen käytettävän konttiklusterin tunnistetiedot voidaan suojata.
Tässä kohtaa kuvaan astuu HashiCorp Vault: salattu avainvarasto, jossa on mekanismit tallennettuihin arvoihin pääsyn hallintaan. Arvot voivat olla mitä tahansa salasanoista, sertifikaateista ja URL-osoitteista muuhun arkaluonteiseen dataan. Vault tukee useita taustajärjestelmiä käyttäjien todentamiseen, kuten GitHubia, AWS:ää, LDAPia ja Radiusta.
Vaultia on helppo kokeilla niin kutsutulla dev-modella. Tilanne muuttuu hieman haastavammaksi, kun haluat ottaa sen käyttöön tuotannossa. Näytämme, miten Vault määritetään tuotantotilaan ja miten sisällön käyttöoikeuksia hallitaan.
Aloitetaan
Rakastamme kontteja Praqmalla, joten olisi outoa olla ajamatta Vaultia kontissa. Ratkaisumme perustuu HashiCorpin ylläpitämään viralliseen Vaultin Docker-imageen sekä maksuttomaan djenriquez/vault-ui-verkkokäyttöliittymään. Molemmat löytyvät Docker Hubista.
Yksinkertainen Vaultin Dockerfile näyttäisi tältä:
FROM vault:0.7.0 MAINTAINER PraqmaJa käyttöliittymälle:
FROM djenriquez/vault-ui:2.1.0 MAINTAINER PraqmaSijoita nämä erillisiin kansioihin nimeltä vault ja vault-ui, niin olemme valmiita buildaamaan ja pushaamaan ne Docker Hubiin:
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.2Kun tämä on tehty, Docker Hubissa on kaksi imagea valmiina organisaatiomme käyttöön.
Valmistele verkko ja konfiguraatio
Vault UI:n täytyy muodostaa yhteys Vaultia ajavaan konttiin, joten luodaan verkko:
docker network create vault-networkVoit varmistaa, että verkko on luotu, suorittamalla:
docker network ls NETWORK ID NAME DRIVER SCOPE 7b332ca38df5 bridge bridge local 60f40b5e80f7 vault-network bridge localSeuraavaksi luomme konfiguraatiotiedoston. Meidän on määritettävä taustatallennuksen sijainti, tässä tapauksessa tiedosto, osoitealue, jossa Vaultin tulee kuunnella, sekä se, poistetaanko TLS käytöstä.
Luo tiedosto nimeltä vault.conf ja lisää siihen seuraava sisältö:
backend "file" { path = "/vault/file/vaultsecrets" } listener "tcp" { address = "0.0.0.0:8200" tls_disable = 1 }Tallennamme tallennustiedoston kontissa sijaintiin /vault/file, sillä se on yksi kontti-imagen määrittämistä volumeista. Näin voimme halutessamme liittää sen hostiin.
Määritämme Vaultin kuuntelemaan kaikissa verkkoliitännöissä portissa 8200 ja poistamme TLS:n käytöstä, koska meillä ei ole sertifikaatteja. Kun sinulla on sertifikaatit, lisää listener-osioon kaksi tällaista riviä:
tls_cert_file = "/root/server.crt" tls_key_file = "/root/server.key"Muista kopioida sertifikaatit konttiin määrittämääsi sijaintiin.
Käynnistä Vault-kontti
Nyt olemme valmiita käynnistämään Vault-kontin:
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.confVaultin pitäisi olla käynnissä. Voit varmistaa tämän suorittamalla:
docker logs vaultTulosteen pitäisi näyttää tältä:
==> 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:Hienoa, Vault on käynnissä. Alustetaan se nyt, jotta voimme alkaa käyttää sitä.
Alustus
Avaa terminaali-istunto Vault-kontin sisällä:
docker exec -it vault /bin/shAseta ympäristömuuttuja, joka kertoo Vault-asiakkaalle, mihin sen tulee muodostaa yhteys, ja alusta sitten Vault:
export VAULT_ADDR=http://127.0.0.1:8200 vault initSaat viisi avainta ja root tokenin. Kun Vault käynnistyy, se on suljettu, mikä estää pääsyn kaikkiin tietoihin. Luotuja avaimia käytetään Vaultin avaamiseen, ja siihen tarvitaan vähintään kolme avainta.
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.Avaa Vault käyttämällä kolmea avainta näin:
/ # 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:Nyt kun Vault on avattu, voimme kirjautua käyttämällä root tokenia:
/ # 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]Ja olemme sisällä.
Meidän on luotava tiimimme käyttöön policy. Se antaa tiimille tarvittavat oikeudet tietojen hakemiseen Vaultista.
Luo kontissa policy-tiedosto HashiCorpin HCL-muodossa:
vi /vault/praqma-policy.hclSeuraavalla sisällöllä:
path "*"{ capabilities = [ "create", "read", "update", "list" ] }Tämä antaa käyttäjille pääsyn kaikkeen näihin toimintoihin liittyvään, mutta ei esimerkiksi salaisuuksien poistamiseen. Tämä on esittelyä varten, joten muokkaa asetuksia tietoturvastandardiesi mukaisesti.
Luo sitten policy:
/ # vault policy-write praqma /vault/praqma-policy.hcl Policy 'praqma' written.Ota nyt käyttöön GitHub-backend, jotta työntekijämme voivat kirjautua Vaultin käyttöliittymään GitHub-tilillään.
/ # vault auth-enable github Successfully enabled 'github' at 'github'!Määritä organisaatio, jonka jäsen GitHub-käyttäjän on oltava:
/ # 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/defaultTässä esimerkissä käytimme tiimiä default. Voit käyttää useita tiimejä, joilla on eri policyt, kuten ops ja dev, jotta voit hallita käyttöoikeuksia tarkemmalla tasolla.
Käynnistä Vault UI -kontti
Poistu Vault-kontista, jotta voimme käynnistää käyttöliittymäkontin.
Meidän on määritettävä kaksi ympäristömuuttujaa: VAULT_URL_DEFAULT osoittaa Vault-palvelimeen ja VAULT_AUTH_DEFAULT määrittää oletustodennusmenetelmän, joka on tässä tapauksessa 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.2Komennon docker ps pitäisi näyttää kaksi käynnissä olevaa konttia: vault ja 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 vaultVault kuuntelee porttia 8200 ja Vault-UI porttia 8000. Siirry osoitteeseen http://localhost:8000, niin Vault-UIn kirjautumisnäkymän pitäisi avautua.
Siirry nyt osoitteeseen github.com, napsauta profiilikuvasi alta Settings ja sitten vasemman valikon Personal access tokens -kohtaa. Napsauta ”Generate new token” -painiketta, anna tokenille nimi ja valitse tokenille annettavat oikeudet (tarvitset vähintään lukuoikeudet).
Syötä token Vault-UIhin kirjautuaksesi sisään. Käyttöliittymän pitäisi nyt näkyä.
Napsauta vasemman valikon ”secret”-kohtaa ja sitten ”new secret” -painiketta. Anna salaisuudelle nimi ja arvo napsauttamalla ”(empty object)” -tekstin vieressä olevaa neliötä. Napsauta sitten Save. Uuden kohteen pitäisi ilmestyä näkyviin. Kokeile napsauttaa oikealla olevaa roskakoria. Saat ilmoituksen ”Error, Access denied”, kuten aiemmin määrittämämme policy edellyttää.
Yhteenveto
Pääsimme alkuun Vaultin kanssa myös dev-moden ulkopuolella. Näimme, miten Vault-palvelin ja käyttöliittymä käynnistetään ja määritetään, jotta saat kokonaiskuvan tilanteesta.
- Pilvi
- Tietoturva
Subscribe to our newsletter
Related blogs