The Complete Guide to Docker Secrets - Earthly Blog

検証

Dockerの状態

OSはMacOS

$ docker version | grep -5 Client
Client:
 Cloud integration: v1.0.35-desktop+001
 Version:           24.0.5
 API version:       1.43
 Go version:        go1.20.6
 Git commit:        ced0996

Swarmの状態

$ docker info | grep Swarm
 Swarm: inactive

Swarmの起動

$ docker swarm init
Swarm initialized: current node (8rp9qhtxxxx) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-227rgzhbbhxxxx 192.168.65.4:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

$ docker info | grep Swarm
 Swarm: active

To add a manager to this swarm...をすることにより何が行われるか不明。

Secretを作成

$ echo 'This is secret one!' > secure_one.txt

Docker composeを起動

docker-compose.ymlを作成

version: '3'

services:
  server:
    image: alpine:3.11.6
    command: /bin/sh -c 'cat /run/secrets/secure_one'
    secrets:
        - secure_one

secrets:
  secure_one:
    file: secure_one.txt

起動すると期待する値が表示される

$ docker-compose up
[+] Running 1/0
 ✔ Container test-server-1  Created 0.0s 
Attaching to test-server-1
test-server-1  | This is secret one!
test-server-1 exited with code 0

できた。

Tips

unsupported external secret secure_one

$ echo 'This is secret one!' | docker secret create secure_one -にて値を設定する。 docker-compose.ymlに下記を宣言するとunsupported externalが表示される。

secrets:
  secure_one:
    external: true

secretの設定状況は下記の通り可能。

$ docker secret ls                                              
ID                          NAME         DRIVER    CREATED          UPDATED
wxwt8voxxxxxxxxxxxxxxxxxx   secure_one             21 minutes ago   21 minutes ago

Secrets top-level elementをみると、external: trueは利用できる風に記載されている。 How to use secrets in Docker Composeには記載ない。前者はdocker-composeのことかと思ったが違う???

対応方法

Docker – how do you manage secret values with docker-compose v3.1 – iTecNoteをみると、docker-composeの記述をdockerコマンドで読み込んで利用している。(未検証です)どういう場合に利用するか不明。stdin方式はdocker-composeを利用している間は無視して良さそう。

考察

Secret機能は、The Complete Guide to Ruby on Rails Encrypted Credentialsのようなものだと思い込みがあり理解が難航した。値を暗号化して誤ってコミットした時も安全である類のものと。 だがやっていることは、秘匿の値をファイルをボリュームにアタッチしている感じ。利用したい場合はそのファイルを読み込む。暗号化とかしているわけではない。

The Complete Guide to Docker Secrets - Earthly Blogを読むと一般的に利用される環境変数への秘匿情報の埋め込みがいけない理由が記載されている

分かる

Secrets stored in an environment variable are more vulnerable to accidental exposure.

予期せず秘匿情報を含めるのはあるある

These variables are available to all processes, and it can be difficult to track access. Secrets can be shared with subprocesses with little oversight.

ローカルで動作させるなどの場合は気にしないかな。

なるほど

Applications might accidentally print the entire collection of .env variables during debugging.

個人的には.envを細かく分割するなどして運用して回避もできそうとは思った。

所感

使ってみて思ったが、Secretsを利用することをDockerイメージが対応している必要がある。 例えば、MySQLの場合はUSERなどのENV変数に値を入れて指定する。 Secretsの場合はファイルを読み込ませる必要があるので、USER_FILEのように変更する必要あり。(対応しているしていないが分かれるのでSecretsはあまり気乗りしない)