Credentials Store for Docker Client


這篇文章說明 Linux 系統環境下 Docker client 的配置,關於 Credentials Store 的部分。Credentials Store 可用來以進階加密方式管理登入 registry 後的密碼,是一種增強 Docker client 安全性的措施。

docker login 命令用來在進行映像文件倉庫 ( image registry ) 操作 docker push/ docker pull 前的登入命令,

docker login [registry-url]


[registry-url] 可以是叢集內部私有的 image registry 例如像是 DTR (Docker Trusted Registry)
如果省略 [registry-url] ,那麼預設就是登入到官方 Docker Hub (https://hub.docker.com) 。

docker login 到 registry 的時候需要輸入帳號密碼。
如沒有先配置 credentials store,(預設情況是沒有配置的), 則每次 docker login 任意 registry 之後都會出現下列警告訊息,

WARNING! Your password will be stored unencrypted in $HOME/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store



上述警告訊息意思時說用來登入 registry 的密碼已經被保存在家目錄下的 config.json 文件裡,但是是以非加密的形式保存。而那是不安全的。
與 docker login 命令相對的命令是 docker logout, 登出 registry ,這會移除保存在 config.json 文件內的密碼資料。
如果 docker login 但是後續沒有做 docker logout, 密碼資料就會一直保存在家目錄裏面的 config.json ,即使退出當前的 shell session ,下次又在同一台機器上開啓新的 shell session 進入,由於上次離開 session 時密碼資料一直保存在家目錄裏面的 config.json ,所以仍舊可以用上次最近一次 docker login 的帳號密碼,來對 registry 進行 push/pull 操作。在密碼資料未經過加密且一直保存在家目錄裏面的 config.json 期間,難保中間有特定有心人士進行密碼破解,進而取得控制權來對其原作者的 image 內容做篡改或植入有害內容。這樣在客戶端的密碼保存變成一個較易突破的安全性缺口,因此 docker client 端的 credentials store 設定在企業內機敏單位工作機器上變得相對是比較重要的。

LINUX 系統中, Docker client 的配置文件位在家目錄的
$HOME/.docker/config.json

找到那個文件可看到類似如下內容,這是沒有配置 credentials store 且執行 docker login 某一臺內部私有映像文件倉庫 (舉例 custom.registry.net) 的時候,Docker 自動產生的 auth 以及 identitytoken 內容 ,每個人在自己機器上看到的都不一樣。

# $HOME/.docker/config.json  
{
    "auths": {
        "custom.registry.net": {
            "auth": "YWRtaW44",
            "identitytoken": "f29f1e63-2ce9-4f5d-82f3-6679c75e84ff"
        }
    },
}

沒有配置 credentials store 則在本地 password 有關的機敏資料是沒有另外加密儲存在 $HOME/.docker/config.json 文件中的。
而且每次 docker login 一個新的 registry 映像文件倉庫都會有如上訊息警告。

繼續以下配置前,請先登出之前所有登入過的 registry
docker logout [registry-url]

可以從 $HOME/.docker/config.json 看到 "auths" 裡面的列表都是空的的時候,就代表所有目前這個 client 端已經登出所有的 registry 了。



開始配置 credentials store

先下載 docker-credential-secretservice
wget -c https://github.com/docker/docker-credential-helpers/releases/download/v0.6.0/docker-credential-secretservice-v0.6.0-amd64.tar.gz

docker-credential-secretservice 是針對 LINUX 系統預設使用的 credential stores ,
另一可用的選擇是 pass ( https://www.passwordstore.org/ ) 它在使用前需要另外配置,本篇文章先跳過這部分,日後另外再做說明。

下載後解開文件
tar -tvf docker-credential-secretservice-v0.6.0-amd64.tar.gz

會得到一個靜態連結的執行文件
docker-credential-secretservice

把這個運行文件放置在系統的 $PATH 目錄下, 例如 /usr/local/bin

修改配置家目錄文件
$HOME/.docker/config.json

加上

# $HOME/.docker/config.json  

{
    "credsStore": "secretservice"
}


其中,
key 是 credsStore
value 就是下載得到的運行文件名字,但是去掉 “docker-credential-” ,保留最後的那個字 : “secretservice”。

修改後保存。這樣 credentials store 就生效了。

從此以後,再次執行 docker login custom.registry.net , 不會看到有上述 WARNING 訊息,
而且 $HOME/.docker/config.json 裡 auths 對應的 registry 列表也不會有 auth 以及 token 的內容,

# $HOME/.docker/config.json  

{
    "credsStore": "secretservice", 

    "auths": {
        "custom.registry.net": { }
    },
}


如果要登出,執行 docker logout custom.registry.net 之後,
$HOME/.docker/config.json 會變得如下這樣。


# $HOME/.docker/config.json  

{
    "credsStore": "secretservice", 

    "auths": { },
}



有了以上 credentials store 的配置,docker client 端的安全性獲得了進一步的提升。

留言

這個網誌中的熱門文章

Docker 環境下的 Proxy 配置