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

このライターは、ボルトからファイルをコピーし、シークレットを含むファイルを作成するために使用されます。情報をディスクに書き込むため、漏洩のリスクが常にあります。別の手段としては、Dockerコンテナイメージとexecコマンドがあります。

パラメータ

パラメータは、コンテナに環境変数を渡すことによって処理されます。

パラメータ説明

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記録が含まれてしまいます。

最終更新