docker默认登录是将密码明文存在本地的~/.docker/config.json,随便找个base64的解码器就能还原,存在安全隐患。此文通过pass实现更安全的docker登录方式。

测试平台:Raspberry Pi 3B with ubuntu 18.04.2 server aarch64
由于官方只发布了amd64的helper,所以其他架构需要从源码编译。另外secretservice需要X11,所以没有桌面的server还是用pass

安装依赖

1
sudo apt install golang-go libsecret-1-dev gpg pass

取得源码并编译docker-credential-helpers

1
2
3
4
5
go get github.com/docker/docker-credential-helpers
cd ~/go/src/github.com/docker/docker-credential-helpers
make pass
cd bin
chmod +x docker-credential-pass && sudo mv docker-credential-pass /usr/local/bin/

编辑docker配置文件。

1
vi ~/.docker/config.json

添加以下内容。

1
2
3
{
"credsStore": "pass"
}

生成gpg2 key

1
gpg --generate-key

不要使用passphrase,记住你的uid。

pass初始化

1
pass init "你的uid"

登录docker

1
docker login

debug

push fails: ‘denied: requested access to the resource is denied’

原因是创建gpg key时使用了passphrase,而helper并不会弹出让你输入passphrase的选项。
方法一:登录。

1
2
pass
pass docker-credential-helpers/<一些字串>/<用户名>

第一个命令列出pass文件夹结构。第二个命令执行后输入passphrase。
然后再试。
方法二:删掉passphrase。不建议这么做,这比上面的明文保存安全性更差。

gpg --edit-key "你的uid"
passwd

输入passphrase,然后设置新passphrase为空。最后quit退出。

参考资料

Getting rid of Docker plain text credentials
docker login credentials-store