如何在无头 CentOS Docker 容器中启用 Secret-tool 命令(由 gnome-keyring、libsecret 和 dbus 支持)?

如何在无头 CentOS Docker 容器中启用 Secret-tool 命令(由 gnome-keyring、libsecret 和 dbus 支持)?

我正在尝试使用该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 等桌面管理器自动创建的密钥环。

因此,您必须:

  1. 首先手动创建密钥环,然后
  2. 手动启动密钥环守护程序

创建时,该命令需要来自标准输入的密码来初始化密钥环。在这个 docker 示例中,因为它只是用于测试而不是由真实用户实际使用,所以我使用换行符的虚拟密码,\n该密码通过管道传输到--unlock场景(第一次调用时创建密钥环)和--start实际启动守护进程的场景。

这是最终的工作命令集。请注意,未使用官方基础centosdocker 映像 - 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重新启动守护进程、终止进程并重新启动之后也是如此。即使名称不同,我也无法获取任何新的秘密,也无法检索存储的秘密。
错误“秘密工具:无法在锁定的集合中创建项目”

相关内容