Dockerの認証情報を暗号化する

警告がでるのよ

クラウドのコンテナレジストリにPushする時にdocker loginコマンドでログインするのだが、
login時にこんな警告が出る

[!note]
WARNING! Your password will be stored unencrypted in /home/docker/.docker/config.json.WARNING! Your password will be stored unencrypted in /home/docker/.docker/config.json.

~/.docker/config.jsonにパスワードが平文で保存されているよという内容。
明示的にlogoutするとconfig.jsonからも消えるみたいだけど、逆に明示的にlogoutしないと平文パスワードがそのまま残ってしまいマズいよということらしい。

こんな感じ
初回ログイン時は認証情報が求められるけど、このおかげで2回目以降は認証情報なしでログインできる。

docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$ docker login nrt.ocir.io
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /home/docker/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded
docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$

ホントに平文で入ってる。明示的にlogoutコマンド打つと消える。

docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$ cat ~/.docker/config.json
{
        "auths": {
                "xxxxxxxxxx.xxx.ecr.us-east-1.amazonaws.com": {
                        "auth": "~略~"
                }
        }
}docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$ docker logout xxxxxxxxxx.xxx.ecr.us-east-1.amazonaws.com
Removing login credentials for xxxxxxxxxx.xxx.ecr.us-east-1.amazonaws.com
docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$ cat ~/.docker/config.json
{
        "auths": {}
}docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$

暗号化するのよ

個人PCなのであまり気にしないのだがWARNINGが気になるので対応してみた。

まず、ヘルパー(dockerから呼び出せるAPI的なもの)とバクエンド(パスワード格納庫的な)ものを入れる

sudo apt-get update
sudo apt-get install -y golang-docker-credential-helpers
sudo apt install -y pass gnupg2

パラメータファイルを作って鍵を作成する

  • 鍵の有効期限を無期限に
  • パスフレーズを無にしている
    ※もともとパスフレーズ有効にしようと思ったのだがpinentryなど入れて追加構成が必要そうなのでひとまず無しにした。
cat > gpg-docker-key.par <<EOF
# パスフレーズ無し
%no-protection

# ---- 一次鍵 (本人確認用) ----
Key-Type: ECDSA
Key-Curve: secp521r1
Key-Usage: sign cert

# ---- サブ鍵 (暗号化用) ----
Subkey-Type: ECDH
Subkey-Curve: secp521r1
Subkey-Usage: encrypt

Name-Real: docker-credential
Name-Email: docker-credential@ubuntu24

# 無期限
Expire-Date: 0

%commit
EOF

鍵作成

docker@ubuntu24:~$ gpg --batch --generate-key gpg-docker-key.par
gpg: revocation certificate stored as '/home/docker/.gnupg/openpgp-revocs.d/AE9605FE0E67664BCBC28B279E531AB1DACF0B46.rev'
docker@ubuntu24:~$

生成された鍵ID(上のファイル名)を元にパスワードストアを初期化

docker@ubuntu24:~$ pass init AE9605FE0E67664BCBC28B279E531AB1DACF0B46
Password store initialized for AE9605FE0E67664BCBC28B279E531AB1DACF0B46
docker@ubuntu24:~$

認証情報取得用に

printf '{\n  "credsStore": "pass"\n}\n' > ~/.docker/config.json


docker@ubuntu24:~$ cat ~/.docker/config.json
{
  "credsStore": "pass"
}
docker@ubuntu24:~$

認証情報を入力して一度ログインすると認証情報なしでログインできるようになる。
そしてWarningも出なくなった。

docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$ docker login nrt.ocir.io
Username: zzzzzzzzzz/oracleidentitycloudservice/zzzzzzz
Password:
Login Succeeded
docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$ docker login nrt.ocir.io
Authenticating with existing credentials...
Login Succeeded
docker@ubuntu24:~/fn_projects/oci_logging_usage_notification$

config.jsonにもパスワード情報保存されていない

docker@ubuntu24:~$ cat ~/.docker/config.json
{
        "auths": {
                "nrt.ocir.io": {}
        },
        "credsStore": "pass"
}docker@ubuntu24:~$

パスワード情報とか鍵の情報を見るコマンド
→今の所見る必要がある場面には遭遇してない

docker@ubuntu24:~$ pass show
Password Store
mqq docker-credential-helpers
    mqq zzzzzzz=
        tqq zzzzzzz
        x   mqq oracleidentitycloudservice
        x       mqq zzzzzzz
        mqq zzzzzzz
docker@ubuntu24:~$


docker@ubuntu24:~$ gpg --list-secret-keys
/home/docker/.gnupg/pubring.kbx
-------------------------------
sec   nistp521 2025-06-22 [SC]
      AE9605FE0E67664BCBC28B279E531AB1DACF0B46
uid           [ultimate] docker-credential <docker-credential@ubuntu24>
ssb   nistp521 2025-06-22 [E]

docker@ubuntu24:~$

GPG (鍵) の配置

~/.gnupg/
├─ gpg.conf            # ユーザー個別設定 (任意)
├─ gpg-agent.conf      # gpg-agent の設定 (任意)
├─ pubring.kbx         # すべての公開鍵
├─ trustdb.gpg         # 鍵の信頼度データベース
└─ private-keys-v1.d/  # 秘密鍵ファイル (.key) が鍵 ID 毎に並ぶ

pass ストア(暗号化済みパスワード)
→詳細に確認はしてないが平文では無さそう

~/.password-store/
└─ docker-credential-helpers/
   ├─ registry-1.docker.io.gpg
   ├─ ghcr.io.gpg
   └─ …(レジストリ毎に 1 ファイル)