Dockerイメージ
コンテナ化された環境での環境変数置換の使用
Dockerでのシークレット管理

機能
KeeperボルトのシークレットのクレデンシャルをDockerイメージに渡します
ビルド引数を指定し、Keeperボルトのシークレットのクレデンシャルを使用して、Dockerイメージをビルドします
KeeperボルトからDockerコンテナにファイルをコピーします
前提条件
このページでは、Secrets ManagerとDockerイメージのビルドアクションとの連携について説明します。 この連携を利用するための必要条件は以下のとおりです。
Keeper Secrets Managerへのアクセス(詳細は、クイックスタートガイドをご参照ください)
KeeperアカウントのSecrets Managerアドオンの有効化
Secrets Manager強制ポリシーが有効化されたロールを割り当てられたメンバーシップ
シークレットを共有するKeeper Secrets Managerアプリケーション
アプリケーションの作成手順については、クイックスタートガイドをご参照ください
Keeper Secrets Manager(KSM)CLIツール
KSM CLIの設定手順については、こちらをご参照ください
概説
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.xml
とlocalhost-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。
最終更新