Dockerイメージ

コンテナ化された環境での環境変数置換の使用

Dockerでのシークレット管理

機能

  • KeeperボルトのシークレットのクレデンシャルをDockerイメージに渡します

  • ビルド引数を指定し、Keeperボルトのシークレットのクレデンシャルを使用して、Dockerイメージをビルドします

  • KeeperボルトからDockerコンテナにファイルをコピーします

Keeper Secrets Manager機能の完全なリストについては、概要をご参照ください。

前提条件

このページでは、Secrets ManagerとDockerイメージのビルドアクションとの連携について説明します。 この連携を利用するための必要条件は以下のとおりです。

概説

Secrets Manager CLIは、実行時にDockerイメージからシークレットを取得するために使用することも、Dockerイメージに組み込んで使用することもできます。このドキュメントでは、いくつかのユースケースについて説明します。

例 1: BuildKitを使用したシークレットを含むイメージのビルド

Keeperボルトのシークレットは、Docker BuildKitを使用してDockerコンテナに埋め込めます。Docker 18.09以降のイメージのビルドでは、マウントされたファイルシステムを使用して、シークレットを渡す機能がサポートされています。この機能を示す簡単な例として、Keeper Secrets Managerから取得したユーザー名とパスワードを使用して、マウント先イメージにユーザーアカウントを作成することにしましょう。

手順 1: 必要なシークレットにKeeper表記法を使用して環境変数を設定します。表記法の詳細については、こちらをご参照ください。

export MY_UID="SOAsfj_lIg0VenDr83gjDw"
export MY_USER="keeper://${MY_UID}/field/login"
export MY_PASS="keeper://${MY_UID}/field/password"

手順 2: ksm execコマンドを使用すると、2つのシークレット (ログインとパスワード) でDockerビルドが作成されます。 --secretパラメータは、Keeperシークレットで置き換えられた環境変数から値を取得します。

DOCKER_BUILDKIT=1 ksm exec -- \
    docker build \
    --secret id=my_user,env=MY_USER \
    --secret id=my_password,env=MY_PASS \
   -t my_image .

手順 3: dockerfileでは、useraddを使用してLinuxユーザーアカウントを作成し、chpasswdでパスワードを設定します。このDockerファイルは以下のとおりです。

FROM my_base_image

RUN --mount=type=secret,id=my_user,dst=/my_secrets/my_user \
    --mount=type=secret,id=my_password,dst=/my_secrets/my_password \
      useradd "$(cat /my_secrets/my_user)" && \
      echo "$(cat /my_secrets/my_user)":"$(cat /my_secrets/my_password)" | chpasswd

この例では、各シークレットはファイルとしてマウントされます。「dst」値でシークレットを一時的に格納したい場所を指定します。RUNコマンドが終了すると、一時ファイルは削除され、アンマウントされます。ファイル名を引数として渡すか、この例では、cat $(/path/to/secret)を使用してファイルの内容を変数に読み込みます。

例 2: ビルド引数を使用したシークレットを含むイメージのビルド

例1と同様に、--build-argを使用して、シークレットを渡すことができます。この例では、Dockerのビルドプロセスでシークレットを使用する機能も示します。

手順 1: 必要なシークレットにKeeper表記法を使用して、環境変数を設定します。表記法の詳細は、こちらをご参照ください。

export MY_UID="SOAsfj_lIg0VenDr83gjDw"
export MY_USER="keeper://${MY_UID}/field/login"
export MY_PASS="keeper://${MY_UID}/field/password"

手順 2: ksm execコマンドを使用すると、2つのシークレット (ログインとパスワード) でDockerビルドが作成されます。 --inlineフラグは、シークレットの置換を処理します。以下に例を示します。

ksm exec --inline -- \
   docker build \
     --build-arg "BUILD_MY_USER=${MY_USER}" \
     --build-arg "BUILD_MY_PASSWORD=${MY_PASSWORD}" \
     -t my_image .

手順 3: dockerfileでは、useraddを使用してLinuxユーザーアカウントを作成し、chpasswdでパスワードを設定します。このDockerファイルは以下のとおりです。

FROM my_base_image
​ARG BUILD_MY_USER
ARG BUILD_MY_PASSWORD
 
RUN useradd "$(printenv --null BUILD_MY_USER)" && \
  echo "$(printenv --null BUILD_MY_USER)":"$(printenv --null BUILD_MY_PASSWORD)" | chpasswd

printenvコマンドでシークレットが標準出力に送信されないようにするには、--nullオプションを使用して改行を削除します。

例 3: docker-composeを使用したシークレットを含むイメージのビルド

この例では、docker-composeを使用してイメージをビルドします。Docker-composeは環境変数からビルド引数を読み込めません。表記をシークレット値に置き換えるには、コマンドラインでビルド引数を設定する必要があります。表記をコマンドラインで使用するため、--inline置換フラグを設定する必要があります。

手順 1: 単純なdocker-compose.yamlファイルを作成します。

---
version:"3"
services:
  my_app:
    build:
      content: "."

手順 2: ksm execコマンドを使用すると、2つのシークレット (ログインとパスワード) でDockerビルドが作成されます。 --inlineフラグは、シークレットの置換を処理します。以下に例を示します。

ksm exec --inline -- \
   docker-compose build \
     --build-arg "BUILD_MY_USER=${MY_USER}" \
     --build-arg "BUILD_MY_PASSWORD=${MY_PASSWORD}" \
     -t my_image .

手順 3: dockerfileでは、useraddを使用してLinuxユーザーアカウントを作成し、chpasswdでパスワードを設定します。このDockerファイルは以下のとおりです。

FROM my_base_image
​ARG BUILD_MY_USER
ARG BUILD_MY_PASSWORD
 
RUN useradd "$(printenv --null BUILD_MY_USER)" && \
  echo "$(printenv --null BUILD_MY_USER)":"$(printenv --null BUILD_MY_PASSWORD)" | chpasswd

printenvコマンドでシークレットが標準出力に送信されないようにするには、--nullオプションを使用して改行を削除します。

例 4: ボルトからDockerイメージにファイルをコピー

この実際の例では、SSL証明書とパスフレーズをKeeperボルトからTomcatコンテナにコピーします。

デフォルトでは、公式のTomcat dockerには、SSLが有効になっていないデフォルトのサーバー設定が含まれています。server.xmlをインストールし、キーストアファイルをコピーして、SSLを有効にするカスタムイメージをビルドすることになります。server.xmlファイルには、キーストアファイルのシークレットのパスフレーズも含まれています。

手順1:Keeper Secretの記録を作成

以下に示すように、Keeperボルトでserver.xmllocalhost-rsa.jksの2つのファイル添付を含むシークレットの記録を作成します。

情報ダイアログに表示された、dockerfileで使用するUID記録をメモします。UID記録(Record UID)をクリックして、クリップボードにコピーします。

手順 2: dockerfileを作成

以下のdockerfileの例では、server.xmlファイルとkeystoreファイルをボルトからTomcatフォルダにコピーします。

FROM tomcat:10-jdk16

ARG BUILD_KSM_INI_CONFIG
ARG BUILD_KSM_SERVER_UID
    
# シークレットの記録のファイル名
ARG BUILD_SERVER_CONFIG="server.xml"
ARG BUILD_KEYSTORE="localhost-rsa.jks"
  
# Python 3を一時的にインストール
RUN apt-get update -y && \
    apt-get install -y \
    python3 \
    python3-pip \
    python3-venv

# モジュールは後で削除できるように、既知の場所にインストール
ENV VIRTUAL_ENV /venv
RUN python3 -m pip install --upgrade pip && \
    python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

# ディストリビューションに含まれるpythonが古すぎて、新しいモジュールのインストールに支障があるかもしれないため、pipをアップグレードします。
RUN pip3 install --upgrade pip
RUN pip3 install keeper_secrets_manager_cli

RUN echo ${BUILD_KSM_INI_CONFIG}

# KSMクライアントデバイスの設定をインポートしてデコードし、ksmが検出可能な場所に保存します。
RUN ksm profile import $(printenv --null BUILD_KSM_INI_CONFIG)

# server.xmlとキーストアをTomcatのconfディレクトリにダウンロード
RUN ksm secret download -u ${BUILD_KSM_SERVER_UID} --name ${BUILD_SERVER_CONFIG} --file-output /usr/local/tomcat/conf/server.xml
RUN ksm secret download -u ${BUILD_KSM_SERVER_UID} --name ${BUILD_KEYSTORE} --file-output /usr/local/tomcat/conf/localhost-rsa.jks

# ksmはもう必要ありません。ksm、python、Debian aptを削除して、Dockerイメージを小さくします。
RUN rm -rf /venv keeper.ini
RUN apt-get purge -y \
    python3 \
    python3-pip \
    python3-venv && \
    apt-get clean autoclean && \
    apt-get autoremove -y && \
    rm -rf /var/lib/{apt,dpkg,cache,log}/

# SSL用にポート8443を公開
EXPOSE 8443

このユースケースでは、ksmはビルド後に不要になるため、削除します。

手順 3: dockerビルドを実行するシェルスクリプトを作成

docker buildを実行するには、以下のスクリプトでSecrets Managerのデバイス設定と、シークレットファイルを含むUID記録を渡します。

#!/bin/sh

# KSMプロファイルを文字列としてエクスポート
export CF=$(ksm profile export _default)

# docker buildを実行して
# 秘密ファイルを含むUID記録を渡す
docker build \
  --build-arg "BUILD_KSM_INI_CONFIG=${CF}" \
  --build-arg "BUILD_KSM_SERVER_UID=LdRkidFLPF7vDaogwJ7etQ" \
  -t ksm_tomcat .

Dockerイメージがビルドされると、Keeperボルトが管理するSSL、キーストアファイル、パスフレーズが完全に設定されます。

Docker Composeとの連携

Keeper Secrets Managerは、KSM Writer Dockerイメージを使用したDocker Composeとの直接連携をサポートしています。

KSM Writer Dockerイメージの詳細は、こちらをご参照ください。

Dockerイメージの例に貢献

このページに貢献できる素晴らしい例をお持ちであれば、Slackでメッセージを送信するか、またはメールでお知らせくださいsm@keepersecurity.com。

最終更新