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

更新履歴

2026/04/13 : OCIRにpushできなくなった。知識の整理のため#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$

暗号化する:

[!note]
実施したのはpass方式を使う設定※#Docker 認証情報の保存場所についてのまとめ

個人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/zzzzzzzzzz
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 ファイル)

Docker 認証情報の保存場所についてのまとめ

[!note]
OCIRのようにusernameに/(スラッシュ)を含む場合、/をディレクトリ階層として認識してしまい認証情報を正しく読みだせないというpass方式のバグにあたり、やむなく方式を変更する上での知識整理(チャッピーにまとめてもらった)

Docker の認証情報の保存場所は以下のルールで決まる。

  • DOCKER_CONFIG環境変数 もしくは docker --configコマンド で Docker がどの config.json を読むかをパスで指定できる。デフォルトは~/.docker/config.json
  • config.json のパラメータ: credsStore / credHelpers / auths で どの格納方式を使うかが決まる。
    • authsはファイル内に直接保存する方式、credsStore / credHelpersは保存場所ではなくヘルパーを使う指定。※ヘルパーとは「秘密ストアと会話するための外部プログラム」
  • credsStore / credHelpers の値からDocker が docker-credential-<値> という helper 実行ファイルを呼ぶ。
    • credsStore:デフォルトのhelperを指定する。
    • credHelpers:レジストリ毎にhelperを指定でき、そのレジストリはcredsStoreより優先される。
  • その helper が、pass や Secret Service 系(その実装のひとつが GNOME Keyring)に 実際の秘密の保存・取得を依頼する。

優先順位:Docker の docker login docs では、Linux では既定で pass を探し、なければ secretservice を探し、どちらもなければ config.json に base64 保存すると説明されています。

DOCKER_CONFIG / --config
        ↓
Docker が読む設定ディレクトリ
        ↓
config.json
 ├─ auths                 ← ファイル内に直接保存する場所
 ├─ credsStore            ← デフォルト helper を決める
 └─ credHelpers           ← レジストリ別 helper を決める
        ↓
docker-credential-<name>  ← Docker が実行する helper
 ├─ docker-credential-pass
 └─ docker-credential-secretservice
        ↓
実際の保存基盤
 ├─ pass                  ← ~/.password-store の GPG 暗号化ファイル
 └─ Secret Service        ← D-Bus 上の秘密ストア API
      └─ GNOME Keyring などの実装(Secret Service = GNOME Keyring ではなく、GNOME Keyringは選択肢の一つらしい)
           └─ gnome-keyring-daemon が動く

pass

  • 公式には “The Standard Unix Password Manager” とされる password manager 。
  • GPG で暗号化されたファイルとして秘密を持ち、既定では ~/.password-store に保存さる。

Secret Service

  • これは D-Bus 上の秘密保存 API / 規格。
  • 仕様書では、クライアントアプリケーションが ユーザーのログインセッション内で動くサービスに対して秘密を安全に保存・取得するための API と説明されています。
  • また、GNOME と KDE の開発者が共通の秘密保存方法を持つことを目的に設計したとも説明されています。

GNOME Keyring

  • GNOME の中で secrets / passwords / keys / certificates を保存してアプリに提供する仕組み。
  • gnome-keyring-daemon→ GNOME Keyring の daemon プロセス。
  • libsecret→ GNOME の Secret Service D-Bus client library

Secret Serviceの実際の流れは、Docker → docker-credential-secretservice(helper) → libsecret → Secret Service API → gnome-keyring-daemon → GNOME Keyring

config.json例

{
  "credsStore": "pass",
  "credHelpers": {
    "ghcr.io": "secretservice"
  }
}