我正在尝试使用该secret-tool
命令将秘密安全地存储在正在运行的无头 CentoS 7.5.1804 Docker 容器中,但似乎无法找到成功完成此工作所需的包和/或配置。
具体来说,我希望能够运行此命令:
printf "aPassword" | secret-tool store --label="test" foo bar
并能够通过运行查看该密码:
secret-tool lookup foo bar
当我运行secret-tool store
命令时,我得到以下信息:
printf 'aPassword' | secret-tool store --label="test" foo bar
** Message: Remote error from secret service: org.freedesktop.DBus.Error.UnknownMethod: No such interface 'org.freedesktop.Secret.Collection' on object at path /org/freedesktop/secrets/collection/login
secret-tool: No such interface 'org.freedesktop.Secret.Collection' on object at path /org/freedesktop/secrets/collection/login
我已经按照ArchLinux Gnome/Keyring 维基页面并尝试通过以下步骤在 CentOS Docker 容器上执行相同的操作:
docker run --privileged -it centos:centos7.5.1804 /bin/bash
# remainder of commands are in the container bash shell:
printf 'search localhost.localdomain\nnameserver 8.8.8.8\nameserver 8.8.4.4' > /etc/resolv.conf
yum -y update
yum -y install sudo gnome-keyring libsecret dbus-x11
yum clean all && rm -rf /var/cache/yum
export DISPLAY=“:0.0”
eval "$(dbus-launch --sh-syntax)"
mkdir -p ~/.cache
mkdir -p ~/.local/share/keyrings
eval $(gnome-keyring-daemon --start)
export SSH_AUTH_SOCK
据我所知,这应该提供允许命令secret-tool store
成功所需的一切(gnome-keyring 守护进程、dbus 会话和秘密工具 + libsecret),但如果失败。
我缺少什么?
答案1
一年后,我能够重新审视这一点。经过一整天的研究和尝试各种事情后,我终于弄清楚了这一点。我希望这个答案可以帮助其他人挽救我失去的生产力!
链中缺少的环节是必须先创建密钥环,然后才能将条目保存到其中。在这个 docker 上下文中,没有用户帐户,没有登录等 - 因此没有由 Gnome 等桌面管理器自动创建的密钥环。
因此,您必须:
- 首先手动创建密钥环,然后
- 手动启动密钥环守护程序
创建时,该命令需要来自标准输入的密码来初始化密钥环。在这个 docker 示例中,因为它只是用于测试而不是由真实用户实际使用,所以我使用换行符的虚拟密码,\n
该密码通过管道传输到--unlock
场景(第一次调用时创建密钥环)和--start
实际启动守护进程的场景。
这是最终的工作命令集。请注意,未使用官方基础centos
docker 映像 - systemd 服务必须为 DBus 运行,因此我们必须使用官方centos/systemd
映像:
docker run --privileged -d -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name centos-systemd centos/systemd
docker exec -it centos-systemd /bin/bash
# remainder of commands are in the container bash shell:
yum -y install gnome-keyring libsecret dbus-x11
eval "$(dbus-launch --sh-syntax)"
mkdir -p ~/.cache
mkdir -p ~/.local/share/keyrings # where the automatic keyring is created
# 1. Create the keyring manually with a dummy password in stdin
eval "$(printf '\n' | gnome-keyring-daemon --unlock)"
# 2. Start the daemon, using the password to unlock the just-created keyring:
eval "$(printf '\n' | /usr/bin/gnome-keyring-daemon --start)"
完成此操作后,我们现在可以存储和查找密码:
[root@603a122f7555 /]# secret-tool lookup foo bar
[root@603a122f7555 /]# printf "aPassword" | secret-tool store --label="test" foo bar
[root@603a122f7555 /]# secret-tool lookup foo bar
aPassword
[root@603a122f7555 /]#
答案2
以下是我在 Ubuntu 无头虚拟机上的命令:
apt install dbus-x11 gnome-keyring libsecret # ~79MB
export $(dbus-launch)
eval "$(echo '\n' | gnome-keyring-daemon --unlock)"
echo [email protected] | secret-tool store --label="main" email address
echo $(secret-tool lookup email address)
kill -9 $(pgrep -f gnome-keyring-daemon)
# echo $(secret-tool lookup email address) # no longer gives password
看起来需要在任何脚本中解锁密钥环才能检索秘密。
诀窍实际上是使用 eval 命令,我认为该命令仅适用于 Docker。如果没有这个错误,这个错误在网上没有解决方案,包括几个 GitHub 项目。
“秘密工具:无法在锁定的集合中创建项目”
编辑,这只有效一次。即使在使用-r
重新启动守护进程、终止进程并重新启动之后也是如此。即使名称不同,我也无法获取任何新的秘密,也无法检索存储的秘密。
错误“秘密工具:无法在锁定的集合中创建项目”