📝

HashiCorp Vault CLIをDockerイメージに入れる際の注意点

2021/08/21に公開

これは何?

HashiCorp VaultのCLIをAmazon Linux 2のDockerイメージに入れようとしたらちょっと詰まったのでメモ

やったこと

こちらを参考にしてAmazon Linux 2のイメージにVault CLIを突っ込みたかった。
https://learn.hashicorp.com/tutorials/vault/getting-started-install?in=vault/getting-started

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に書いてあった。
https://github.com/hashicorp/vault/issues/10048

詳細については上記のISSUEに貼られているリンク(以下)に書いてあった。
https://hub.docker.com/_/vault

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