今天也沒有太多時間,但安排是了解Vault的使用。目前已經開始著手了解Terraform的使用,但每次要進行GCP的操作時,都必需要以file的形式將service account產生出來的json檔放進來。Terraform的寫法大致如下
provider "google" {
version = "3.5.0"
credentials = file("/terraform/keyfile-terraform.json")
project = "project-id"
region = "us-west1"
}
雖然目前還不太會用variable的方式撰寫,所以多數的值都是直接hard code上去的,但最主要的問題仍是在於用variable也還是會碰到相同的問題,那個由service account做出來的json檔要怎麼給。為了試著將json檔的內容由一個安全的地方拿取,有試著想過用Google KMS。但用KMS最先碰到的問題在於要怎麼拿取後給予。
先說明流程上用KMS,仍還是會需要一份service account的json檔,如果有給權限(IAM Role),則也可以直接用同一份,不過如果用KMS,流程上就會相當的複雜。原因是目前的Terraform已經是利用官方的Docker進行,而KMS若一樣是要用Docker,則需要再開一個Docker Compose,並利用mount的方式掛載檔案volume給二個Docker使用。
概念上會變成,KMS拿到一份json檔,放在volume上,而terrform所在的那個docker,則必需要等到KMS docker拿取完後才能夠取用。這裡複雜的部份是在於要怎麼樣讓terrform那份docker等到kms拿取完後再開始動作。最簡單的方式或許是等個數秒,再開始,但KMS要花多時間拿並不一定,也是可以直接給最大值後不理會它,反正過一分鐘很再塼執行也無所謂。
另一個比較好的方式是寫script,並在kms完成拿取時利用API的方式通知terraform所在的docker,但這個方式的bash script不知道怎麼寫,如果利用nodejs的方式進行,整個就是走偏變得更複雜了。
所以,自然而然的就放棄Google KMS的方式,轉而去了解同是一家的產品,也就是Vault。
網路上的文章看到後,就開始依樣畫葫蘆,期望能順利的了解怎麼用,不過今天也只大約了解一點點關於valut怎麼開始
version: '3.7'
services:
vault:
build:
context: ./vault
dockerfile: Dockerfile
ports:
- 8200:8200
volumes:
- ./vault/config:/vault/config
- ./vault/policies:/vault/policies
- ./vault/data:/vault/data
- ./vault/logs:/vault/logs
environment:
- VAULT_ADDR=http://127.0.0.1:8200
- VAULT_API_ADDR=http://127.0.0.1:8200
command: server -config=/vault/config/vault-config.json
cap_add:
- IPC_LOCK
而指向的Dockerfile內容則如下
# base image
FROM alpine:latest
# set vault version
ENV VAULT_VERSION 1.5.3
# create a new directory
RUN mkdir /vault
# download dependencies
RUN apk --no-cache add \
bash \
ca-certificates \
wget
# download and set up vault
RUN wget --quiet --output-document=/tmp/vault.zip https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip && \
unzip /tmp/vault.zip -d /vault && \
rm -f /tmp/vault.zip && \
chmod +x /vault
# update PATH
ENV PATH="PATH=$PATH:$PWD/vault"
# add the config file
COPY ./config/vault-config.json /vault/config/vault-config.json
# expose port 8200
EXPOSE 8200
# run vault
ENTRYPOINT ["vault"]
簡單來說,Vault需要幾個目錄,就在一開始直接mount volume進行引用。
最重要的部份還是在於unseal後才能使用
vault operator init
vault operator unseal
今天就只能先研究到這裡,明天再開始了解後續怎麼直接使用在Terraform裡。