Vault
https://gyazo.com/822c904c09e07eb6da124689dbbee8c5
KVSのようなインターフェース(REST API)を使って機密情報の管理ができるソフトウェア。
ストレージに何を使うかを選ぶことができ、認証も様々なオプションがあり詳細なアクセス権限の設定が得意。
全般
token: vaultに対する認証トークン.トークンは認証の主体と対応
policy: あるトークンでどの機密にアクセスできるかのルール
機能
Seal/Unseal
初回起動時にVaultは秘密鍵を複数個生成する
この数は初回起動時にオプションとして変更出来る
デフォルトは5
Vaultは起動時にSeal modeに移行する
Seal modeでは秘密鍵をVaultが持っておらず、暗号化済みのバックエンドシステムから情報を復号できない
以下のコマンドでSeal modeなVaultに秘密鍵を渡す事で、起動できる
code:bash
$ vault operator unseal <秘密鍵>
初回起動時にオプションとしてunseal化する秘密鍵の数をオプションとして渡せる
デフォルトは3
その他機能
Kubernetesとの組み合わせ
vaultに対する認証
k8sのServiceAccountがvaultのtokenと1対1対応
Vaultから機密を読み込みPodの環境変数に入れる仕組みの一例
sidecar container として vault agent が実行され,ServiceAccountに対応するvault tokenが取得される.また,定期的に更新される.取得されたtokenはemptyDirのvolumeに書き込んでアプリケーションのPodに渡す
sidecar containerのDockerfileの例
code:Dockerfile
FROM ubuntu:18.04
VOLUME /data
WORKDIR /app
RUN apt-get update \
&& apt-get -y install curl unzip
# Install vault
&& unzip vault.zip \
&& mv vault /usr/local/bin/vault \
&& chmod +x /usr/local/bin/vault
# Install envconsul
# envconsulはvault tokenを用いてvaultから機密を抜き出し,子プロセスの環境変数に流し込む.
&& tar -xvzf envconsul.tgz \
&& mv envconsul /usr/local/bin/envconsul \
&& chmod +x /usr/local/bin/envconsul
RUN apt-get -y remove curl unzip \
&& apt-get -y autoremove
COPY ./init.sh ./revoke.sh /app/
RUN chmod +x /app/init.sh /app/revoke.sh
sidecar containerで実行するスクリプトの例:
code:init.sh
set -ex
VAULT_CONFIG_FILE=/app/vault-agent.hcl
VAULT_ROLE=${VAULT_ROLE:-default}
ENVCONSUL_CONFIG_FILE=/data/envconsul.hcl
# 以下,設定ファイルを2つ実行時に書き込む.
# 環境変数をinterpolationしなければならないので実行時に行っている.
cat > ${VAULT_CONFIG_FILE} <<EOF
pid_file = "./pidfile"
auto_auth {
method "kubernetes" {
mount_path = "auth/kubernetes"
config = { role = "${VAULT_ROLE}" }
}
sink "file" {
config = { path = "/data/token" }
}
sink "file" {
config = { path = "${HOME}/.vault-token" }
}
}
EOF
cat > ${ENVCONSUL_CONFIG_FILE} <<EOF
upcase = true
vault {
address = "${VAULT_ADDR}"
unwrap_token = false
renew_token = false
retry {
enabled = true
attempts = 12
backoff = "250ms"
max_backoff = "1m"
}
}
EOF
# envconsulの実行ファイルを共有volumeにコピーする.
# アプリケーションのDockerfileでenvconsulをインストールしなくてもよくするため.
cp $(which envconsul) /data/
# vault agentの起動.tokenを/data/tokenに配置し,最新に保つ.
# このコマンド呼び出しは戻ってこない.
vault agent -log-level=debug -config ${VAULT_CONFIG_FILE}
sidecarの終了時にrevokeする.以下のスクリプトをsidecar containerのpreStop lifecycleに設定する:
code:revoke.sh
vault token revoke -self
アプリケーションのcontainerでは envconsole でtokenを読んでvaultから機密を取り出し環境変数に設定した上でアプリケーションに exec する.
docker-entrypoint.shの例:
code:docker-entrypoint.sh
set -e
ENVCONSUL=/data/envconsul
ENVCONSUL_CONFIG_FILE=/data/envconsul.hcl
TOKEN=/data/token
while true; do
echo "Dependencies were all found"
break
else
echo "Waiting for dependencies..."
sleep 5
fi
done
# envconsulを通してアプリケーション本体を起動することで機密を環境変数に流し込む.
${ENVCONSUL} -config ${ENVCONSUL_CONFIG_FILE} -config /app/secrets.hcl \
-vault-token "$(cat ${TOKEN})" "$@"
アプリケーションごとにvaultの機密と環境変数の対応付を設定する必要がある
code:secrets.hcl
secret {
no_prefix = true # 機密のパスを付さない
# Vault中の機密名が{{key}} に代入されたものがプロセスから見える環境変数となる.
format = "SIMPLE_VAULT_APP_{{ key }}"
# 機密が入っているパスで,terraform moduleにより場所が決定される.
path = "app/simple-vault-app/kv/config"
}