Blog

Hallitse salaisuuksiasi HashiCorp Vaultilla

JUN 13, 2017

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 Praqma

Ja käyttöliittymälle:

FROM djenriquez/vault-ui:2.1.0 MAINTAINER Praqma

Sijoita 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.2

Kun 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-network

Voit varmistaa, että verkko on luotu, suorittamalla:

docker network ls NETWORK ID      NAME             DRIVER    SCOPE 7b332ca38df5    bridge           bridge    local 60f40b5e80f7    vault-network    bridge    local

Seuraavaksi 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.conf

Vaultin pitäisi olla käynnissä. Voit varmistaa tämän suorittamalla:

docker logs vault

Tulosteen 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

lock

Avaa terminaali-istunto Vault-kontin sisällä:

docker exec -it vault /bin/sh

Aseta 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 init

Saat 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.hcl

Seuraavalla 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/default

Tä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

Vault UI

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.2

Komennon 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 vault

Vault 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