HashiCorp Vault CLIをDockerイメージに入れる際の注意点
これは何?
HashiCorp VaultのCLIをAmazon Linux 2のDockerイメージに入れようとしたらちょっと詰まったのでメモ
やったこと
こちらを参考にしてAmazon Linux 2のイメージにVault CLIを突っ込みたかった。
Dockerfileとしては(だいぶ端折るが)雰囲気以下の感じ。
FROM amazonlinux:2
RUN yum install -y yum-utils && \
yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo && \
yum install -y vault && \
rm -rf /var/cache/yum/*
Dockerイメージを動かしてみると以下の感じで Operation not permitted
となってVault CLIを使えなかった...。
$ docker run -it vault-sample bin/bash
bash-4.2# vault
bash: /usr/bin/vault: Operation not permitted
原因
こちらのISSUEに書いてあった。
詳細については上記のISSUEに貼られているリンク(以下)に書いてあった。
Memory Locking and 'setcap'
The container will attempt to lock memory to prevent sensitive values from being swapped to disk and as a result must have --cap-add=IPC_LOCK provided to docker run. Since the Vault binary runs as a non-root user, setcap is used to give the binary the ability to lock memory. With some Docker storage plugins in some distributions this call will not work correctly; it seems to fail most often with AUFS. The memory locking behavior can be disabled by setting the SKIP_SETCAP environment variable to any non-empty value.
なるほどー。
対策
2パターンの対応方法がある。どちらの方法をとっても以下のようにVault CLIが使えてた。
$ docker run -it vault-sample2 bin/bash
bash-4.2# vault
Usage: vault <command> [args]
Common commands:
read Read data and retrieves secrets
write Write data, configuration, and secrets
delete Delete secrets and configuration
list List data or secrets
login Authenticate locally
agent Start a Vault agent
server Start a Vault server
status Print seal and HA status
unwrap Unwrap a wrapped secret
Other commands:
audit Interact with audit devices
auth Interact with auth methods
debug Runs the debug command
kv Interact with Vault's Key-Value storage
lease Interact with leases
monitor Stream log messages from a Vault server
namespace Interact with namespaces
operator Perform operator-specific tasks
path-help Retrieve API help for paths
plugin Interact with Vault plugins and catalog
policy Interact with policies
print Prints runtime configurations
secrets Interact with secrets engines
ssh Initiate an SSH session
token Interact with tokens
1. Dockerfile側の対応
以下のように setcap cap_ipc_lock=/usr/bin/vault
を実行してやる。
FROM amazonlinux:2
RUN yum install -y yum-utils && \
yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo && \
yum install -y vault && \
# vaultコマンドを利用できるようにするワークアラウンド
setcap cap_ipc_lock=/usr/bin/vault && \
rm -rf /var/cache/yum/*
2. Docker run時にパラメータを渡す
docker run
実行時に --cap-add=IPC_LOCK
を付与してやる。
雑感
へー
Discussion