GNOME/Keyring
GNOME Keyring 是“GNOME 中存储密钥、密码、密钥、证书并使应用程序可用的组件集合。”
它提供了 org.freedesktop.secrets,一个 API,允许客户端应用程序使用用户登录会话中运行的服务安全地存储密钥。
安全性
防范恶意应用程序
过去曾报告过一个关于 GNOME/Keyring API 行为的安全问题(称为 CVE-2018-19358)。如果密钥环已解锁,任何应用程序都可以轻松读取任何密钥。而且,如果用户已登录,则登录/默认集合已解锁。默认情况下不使用可用的 D-Bus 保护机制(涉及 busconfig 和 policy XML 元素),并且无论如何都容易绕过。
GNOME 项目不同意此漏洞报告,因为根据他们声明的安全模型,不得允许不受信任的应用程序与密钥服务通信。
通过 Flatpak 沙盒化的应用程序仅对会话总线具有经过筛选的访问权限。
会话锁定时,密钥环不会锁定
当会话锁定时,密钥环不会自动锁定。[1] 这意味着密码仍然保留在内存中,这会使系统容易受到 DMA 攻击。
安装
gnome-keyring 是 gnome 组的成员,因此通常存在于运行 GNOME 的系统上。该软件包也可以单独安装。libsecret 也应该安装,以允许其他应用程序访问你的密钥环。虽然 libgnome-keyring 已被弃用(并被 libsecret 取代),但某些应用程序可能仍然需要它。
gnome-keyring-daemon 在登录时通过 systemd 用户服务自动启动。它也可以通过套接字在请求时启动。
与 GNOME Keyring 相关的额外实用程序包括
- secret-tool — 从命令行访问 GNOME Keyring(以及任何其他实现 DBus Secret Service API 的服务)。
- lssecret — 使用 libsecret 列出所有密钥项(例如 GNOME Keyring)。
使用图形界面管理
你可以使用 Seahorse 管理 GNOME Keyring 的内容;安装 seahorse 软件包。
密钥环(例如,默认密钥环“Login”)的密码可以更改甚至删除。有关更多信息,请参阅 GNOME 帮助中的创建新密钥环和更新密钥环密码。
使用密钥环
PAM 模块 pam_gnome_keyring.so 部分初始化 GNOME Keyring,在此过程中解锁 login 密钥环。gnome-keyring-daemon 通过 systemd 用户服务自动启动。
PAM 步骤
- 要在自动登录的情况下使用自动解锁,你可以为密钥环设置空白密码。请注意,在这种情况下,密钥环的内容以未加密方式存储。
- 或者,如果使用 GDM 和 LUKS,GDM 可以解锁你的密钥环(如果它与你的 LUKS 密码匹配)。要使此功能正常工作,你需要使用 mkinitcpio.conf 中的 systemd init 以及相应的内核参数。有关更多详细信息,请参阅 [2]。
- 如果你希望跳过 PAM 步骤,则必须手动或通过其他方法解锁密钥环。请参阅#在桌面环境之外使用 gnome-keyring-daemon (KDE, GNOME, XFCE, ...) 和 GnomeKeyring wiki。
当使用显示管理器时,密钥环在大多数情况下开箱即用。GDM、LightDM、LXDM 和 SDDM 已经具有必要的 PAM 配置。对于不自动解锁密钥环的显示管理器,请编辑相应的文件,而不是下面提到的 /etc/pam.d/login
。
当使用基于控制台的登录时,编辑 /etc/pam.d/login
在 auth
部分的末尾添加 auth optional pam_gnome_keyring.so
,在 session
部分的末尾添加 session optional pam_gnome_keyring.so auto_start
。
/etc/pam.d/login
#%PAM-1.0 auth required pam_securetty.so auth requisite pam_nologin.so auth include system-local-login auth optional pam_gnome_keyring.so account include system-local-login session include system-local-login session optional pam_gnome_keyring.so auto_start
SSH 密钥
GNOME Keyring 可以充当 ssh-agent 的包装器。在该模式下,每次你需要解锁 SSH 密钥时,它都会显示一个 GUI 密码输入对话框。对话框包含一个复选框,用于记住你输入的密码,如果选中该复选框,只要你的登录密钥环已解锁,将来就可以完全无密码使用该密钥。
自 1:46 版本以来,gnome-keyring-daemon 构建中默认禁用 SSH 功能。它已被移动到 /usr/lib/gcr-ssh-agent
,它是 gcr-4 软件包的一部分。
设置 gcr
你需要做的就是
- 启用
gcr-ssh-agent.socket
systemd 用户单元。 - 启动 一次
gcr-ssh-agent.socket
systemd 用户单元。这将创建套接字文件$XDG_RUNTIME_DIR/gcr/ssh
。一旦文件被创建,第 1 步就足以让套接字单元自动启动。 - 如果
gcr-ssh-agent.socket
单元处于活动状态,则应不需要手动配置SSH_AUTH_SOCK
环境变量。用户注销并重新登录后,SSH_AUTH_SOCK
环境变量的值应设置为$XDG_RUNTIME_DIR/gcr/ssh
。已知这适用于使用fish
作为默认 shell 的用户的 GnomeConsole
应用程序。
有许多方法可以设置环境变量,你使用的方法将取决于你的特定设置和偏好。
使用
你可以运行
$ ssh-add -L
列出正在运行的代理中加载的 SSH 密钥。这可以帮助确保你启动了适当的服务并正确设置了 SSH_AUTH_SOCK
。
要永久将密码短语保存在密钥环中,请使用 seahorse 软件包中的 ssh-askpass
$ /usr/lib/seahorse/ssh-askpass my_key
要从另一个目录手动添加 SSH 密钥
$ ssh-add ~/.private/id_rsa Enter passphrase for ~/.private/id_rsa:
~/.ssh/id_rsa.pub
)。另外,请确保公钥是私钥的文件名加上 .pub(例如,my_key.pub
)。要禁用所有手动添加的密钥
$ ssh-add -D
禁用
如果你希望运行备用 SSH 代理(例如直接 ssh-agent 或 gpg-agent),禁用 GNOME Keyring 的 ssh-agent 包装器是一个好主意。这样做不是绝对必要的,因为每个代理都监听不同的套接字,并且可以使用 SSH_AUTH_SOCK
在它们之间进行选择,但这可以使调试问题更容易。请注意,GNOME 实现不支持许多脚本功能,例如 BatchMode [3]。
要禁用 gcr-ssh-agent,请确保 gcr-ssh-agent.socket
和 gcr-ssh-agent.service
在 systemd 中均已禁用和停止。
技巧和窍门
与应用程序集成
锁定密钥环
$ dbus-send --session --dest=org.freedesktop.secrets \ --type=method_call \ /org/freedesktop/secrets \ org.freedesktop.Secret.Service.Lock \ array:objpath:/org/freedesktop/secrets/collection/login
此命令执行 D-Bus 方法调用以锁定 login 密钥环。或者,如果你想使用 GUI,可以使用 Seahorse 锁定密钥环。
清除密码
$ gnome-keyring-daemon -r -d
此命令启动 gnome-keyring-daemon,关闭先前运行的实例。
Git 集成
当你通过 HTTPS 推送时,GNOME 密钥环与 Git 结合使用非常有用。libsecret 软件包需要安装才能使此功能可用。
配置 Git 使用 libsecret 助手
$ git config --global credential.helper /usr/lib/git-core/git-credential-libsecret
下次你运行 git push
时,如果你的密钥环尚未解锁,你将被要求解锁它。
GnuPG 集成
几个使用 GnuPG 的应用程序需要设置 pinentry-program
。设置以下内容以使用 GNOME 3 pinentry,以便 GNOME Keyring 管理密码提示。
~/.gnupg/gpg-agent.conf
pinentry-program /usr/bin/pinentry-gnome3
另一种选择是为 GPG 强制环回,这应该允许在应用程序中输入密码。
重命名密钥环
密钥环的显示名称(即,Seahorse 和 file
中显示的名称)可以通过更改未加密密钥环文件中 display-name 的值来更改。密钥环通常会存储在 ~/.local/share/keyrings/
中,文件扩展名为 .keyring。
使用用户密码自动更改密钥环密码
附加 password optional pam_gnome_keyring.so
到 /etc/pam.d/passwd
/etc/pam.d/passwd
... password optional pam_gnome_keyring.so
在桌面环境之外使用 gnome-keyring-daemon (KDE, GNOME, XFCE, ...)
启动
如果你正在使用 sway、i3 或任何不执行以下操作的窗口管理器
/etc/xdg/autostart/gnome-keyring-*.desktop
/etc/X11/xinit/xinitrc.d/50-systemd-user.sh
你的窗口管理器需要在窗口管理器启动期间执行以下命令。这些命令不需要以任何特定顺序执行。
dbus-update-activation-environment DISPLAY XAUTHORITY WAYLAND_DISPLAY
或
dbus-update-activation-environment --all
此命令将环境变量从窗口管理器传递到会话 dbus。如果没有这个,GUI 提示将无法通过 DBus 触发。例如,这是 seahorse 密码提示所必需的。
这是必需的,因为会话 dbus 在图形环境启动之前启动。因此,会话 dbus 不知道你所在的图形环境。必须有人或某物通过将描述图形环境的环境变量传递给会话 dbus,来教导会话 dbus 关于图形环境。
gnome-keyring-daemon --start --components=secrets
在登录期间,PAM 启动 gnome-keyring-daemon --login
,它负责使用登录密码保持 gnome-keyring 解锁状态。如果 gnome-keyring-daemon --login
在几分钟内未连接到会话 dbus,则 gnome-keyring-daemon --login
会死掉。如果在窗口管理器中针对会话 dbus 启动了 gnome-keyring-daemon --start ...
,则 gnome-keyring-daemon --login
将连接到会话 dbus。如果你的登录会话在 gnome-keyring-daemon --login
退出之前未启动 gnome-keyring-daemon --start ...
,你也可以在 gnome-keyring-daemon --login
死掉之前使用任何使用 gnome-keyring 或 secret service API 的程序。
GNOME 密钥环 XDG Portal
GNOME Keyring 公开了一个 XDG Portal 后端(用于通过 flatpak 等沙盒化的应用程序)。为了使其在 GNOME 之外工作,必须通过修改 UseIn
键将他们的桌面环境添加到 /usr/share/xdg-desktop-portal/portals/gnome-keyring.portal
配置文件中。例如,要添加 sway
/usr/share/xdg-desktop-portal/portals/gnome-keyring.portal
[portal] DBusName=org.freedesktop.secrets Interfaces=org.freedesktop.impl.portal.Secret UseIn=gnome;sway
有关 XDG Desktop Portal 后端的更多信息,请参阅 XDG Desktop Portal#后端。
故障排除
密码未被记住
如果你在登录后被提示输入密码,并且发现你的密码未保存,那么你可能需要创建/设置一个默认密钥环。要使用 Seahorse(又名“密码和密钥”)执行此操作,请参阅 GNOME 帮助中的创建新密钥环和更改默认密钥环。
重置密钥环
如果你收到以下错误消息:“你用于登录计算机的密码与你的登录密钥环的密码不再匹配”,你将需要更改你的登录密钥环密码。
或者,你可以从 ~/.local/share/keyrings/
中删除 login.keyring
和 user.keystore
文件。请注意,这将永久删除所有已保存的密钥。删除文件后,只需注销并重新登录即可。
无法找到守护进程控制文件
登录后,以下错误可能会出现在 日志 中
gkr-pam: unable to locate daemon control file
如果没有其他相关问题,则此消息“可以安全地忽略”[4]。
在路径 / 下没有这样的密钥集合
如果你尝试使用 Seahorse 添加新的密钥环,你可能会由于以下原因收到此错误
~/.local/share/keyrings/
目录不存在。如果缺少,请创建它。- 使用了自定义的
~/.xinitrc
。这可以通过添加以下行来解决[5]
~/.xinitrc
source /etc/X11/xinit/xinitrc.d/50-systemd-user.sh
终端显示消息 "discover_other_daemon: 1"
这是由 gnome-keyring-daemon 第二次启动引起的。由于 systemd 服务与守护进程一起交付,因此你无需以其他方式启动它。因此,请确保从你的 .zshenv
、.bash_profile
、.xinitrc
、config.fish
或类似文件中删除启动命令。或者,你可以禁用 gnome-keyring-daemon.service
和 gnome-keyring-daemon.socket
用户单元。
密钥环初始化不正确
这有一些症状
- 像 SSH 或 Git 这样的程序在等待密钥环提供密码时挂起,最终超时并出现诸如“agent refused operation”之类的错误。
- Seahorse 不显示任何密钥环,手动创建一个名为“login”的密钥环似乎没有任何作用。
- 以下错误消息出现在 seahorse 的输出中
couldn't load all secret collections: No such secret collection at path: /org/freedesktop/secrets/collection/login
为了解决这个问题,请执行以下操作
- 重启
gnome-keyring-daemon.service
systemd 用户单元。这应该正确初始化 login 密钥环。 - 重启
gcr-ssh-agent.service
systemd 用户单元(如果使用)。其他代理也可能需要重启。
如果这不能解决问题,请考虑重置密钥环。