Docker Writerイメージ
シークレットを取得するための汎用Dockerイメージ
概要
Docker Writer Image for KSMは、シークレットファイルをダウンロードし、シークレットを含むファイルを生成できるイメージです。
このイメージは、次のコマンドで取得できます。
$ docker pull keeper/keeper-secrets-manager-writer
実行すると、そのパラメータが環境変数で渡されます。
$ docker run \
-v $PWD:/wd --workdir /wd \
-e "KSM_CONIFG=BASE64 CONFIG" \
-e "SECRETS=JfXpSQ2nZG6lkdl1rxB0dg/file/example.crt > file:example.crt"
keeper/keeper-secrets-manager-writer
パラメータ
パラメータは、コンテナに環境変数を渡すことによって処理されます。
KSM_CONFIG
Base64でエンコードされた設定ファイル。
SECRETS
Keeper表記法と代入先の改行区切りのリスト。
SECRETS_FILE
ファイル以外のシークレットを書き込むファイル名。
SECRETS_FILE_TYPE
シークレットファイルの形式。有効な形式は、export、setenv、set、JSONです。デフォルトはJSONです。
CLEANUP_FILE
設定すると、作成されたファイルがすべてシェルファイルに追加され、実行時に削除されます。このファイルを実行すると、作成されたファイルを削除できます。
Secretsリスト
SECRETS
は、Keeper表記法と代入先のリストです。値は改行で区切られています。以下に例を示します。
fXpSQ2nZG6lkdl1rxB0dg/file/example.crt > file:example.crt
cl9a9k0DWP-Iy227rBo5gQ/field/login > MY_LOGIN
gpsBL343CVYMFgOKZ-L2hQ/custom_field/Ip Address > IP_ADDR
各行は、「Keeper表記法 > 代入先」になっています。代入先には、環境変数/JSONキーまたはファイルのパスと名前を指定できます。ファイルの場合、パスの先頭にfile:
テキストが付きます。文字列エンコーディングが不明なため、バイナリデータを環境変数に格納しないことをお勧めします。
Secret File Type
secretsファイルには、環境変数SECRETS
の値が格納されます。ファイル形式は、SECRETS_FILE_TYPE
の値に基づいています。タイプには以下の値を指定できます。
json - JSON形式で格納される値。
export - BASHシェルで一般的に使用されるエクスポートコマンドとして格納される値。
setenv - Cシェルで一般的に使用されるsetenvコマンドとして格納される値。
set - Cシェルで一般的に使用されるsetコマンドとして格納される値。
シェルに関連するタイプを読み込んで、シークレットを環境変数に格納できます。
例
Docker Writer Image for KSMは、多くのアプリケーションで使用できます。いくつかの例を紹介します。
Kubernetes
ライターイメージは、Initコンテナで使用するのが最適です。
initContainers:
- name: my_app
image: keeper/keeper-secrets-manager-writer:latest
env:
- name:SECRETS
value: |
qCAw9dMQgr3Hs7EdfFpfkA/field/password > my_password
qCAw9dMQgr3Hs7EdfFpfkA/file/exmaple.crt > file:/etc/keys/example.crt
qCAw9dMQgr3Hs7EdfFpfkA/file/exmaple.key > file:/etc/keys/example.key
このコンテナでは、ライターイメージを使用してファイルを保存し、メインコンテナがアクセスできるシークレットファイルを作成します。これを行うには、ボリュームをマウントし、ファイルを書き込み、メインコンテナに同じ値をマウントさせます。PodのemptyDirがお勧めです。
Docker Compose
mainサービスでdepends_on
オプションを使用すると、Docker Writer Image for KSMを初期化サービスで使用できます。以下の例では、Docker Writerはボルトからシークレットを取得し、ボリュームマウントでmainイメージと共有します。
---
version:"2"
services:
init:
image: keeper/keeper-secrets-manager-writer:latest
environment:
KSM_CONFIG:R2VwWTVDS ... dmVyUHVibGljS2V5SWQiOiAiMTAiCn0=
SECRETS: |
qCAw9dMQgr3Hs7EdfFpfkA/field/password > file:/etc/keys/global.pass
qCAw9dMQgr3Hs7EdfFpfkA/file/myserver.crt > file:/etc/keys/myserver.crt
qCAw9dMQgr3Hs7EdfFpfkA/file/myserver.key > file:/etc/keys/myserver.key
volumes:
- keys-volume:/etc/keys
main:
image: nginx
restart: always
volumes:
- ./config:/etc/nginx/conf.d
- keys-volume:/etc/keys
ports:
- "80:80"
- "443:443"
environment:
- NGINX_HOST=example.com
depends_on:
init:
condition: service_completed_successfully
volumes:
keys-volume:
通常、サービスは同時に開始されますが、depends_on
オプションを使用すると、サービスの開始を制御できます。上記では、main サービスは、initサービスに依存します。
initサービスが開始し、ファイルを取得してkeys-volumeに保存した後、終了します。service_completed_successfully
条件を使用すると、initサービスが正常終了した後、mainサービスが開始されます。また、mainサービスはkeys-volume
をマウントし、格納された鍵を使用します。
Dockerコマンドライン
ライターイメージは、docker run
を使用してコマンドラインで実行できます。
docker run \
-v $PWD:/wd --workdir /wd \
-e "KSM_CONIFG=BASE64 CONFIG" \
-e "SECRETS=JfXpSQ2nZG6lkdl1rxB0dg/file/example.crt > file:example.crt"
keeper/keeper-secrets-manager-writer
SECRETS
に複数のシークレットが設定されている場合、改行文字(\n)を表記するのは困難です。解決策は、--env,-e
値を$"で囲むことです。以下に例を示します。
-e $'SECRETS=V8lFbio0Bs0LuvaSD5DDHA/file/IMG_0036.png > file:my.png\nIumwT1QYRr8TTCtY8rqzhw/custom_field/S3_BUCKET > s3'
file:my.pngと次のUID記録の間に「\n」があります。値全体を$''で囲まない場合、my.pngファイル名に改行コードと次のUID記録が含まれてしまいます。
最終更新