跳转至内容

GNOME/Keyring

来自 ArchWiki
(重定向自 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-keyringgnome 组的成员,因此通常会出现在运行 GNOME 的系统上。 也可以 单独安装 该软件包。 同时应安装 libsecret 以允许其他应用程序访问您的密钥环。 尽管 libgnome-keyring 已被弃用(并由 libsecret 取代),但某些应用程序可能仍需要它。

gnome-keyring-daemon 会在登录时通过 systemd 用户服务自动启动。它也可以通过套接字请求启动。

与 GNOME Keyring 相关的附加实用程序包括

  • secret-tool — 从命令行访问 GNOME Keyring(以及任何其他实现 DBus Secret Service API 的服务)。
https://wiki.gnome.org/Projects/Libsecret || libsecret
  • lssecret — 使用 *libsecret*(例如 GNOME Keyring)列出所有秘密项。
https://gitlab.com/GrantMoyer/lssecret || lssecret-gitAUR

使用 GUI 管理

您可以使用 Seahorse 管理 GNOME Keyring 的内容;安装 seahorse 软件包。

可以更改甚至删除密钥环的密码(例如,默认密钥环,“Login”)。有关更多信息,请参阅 GNOME 帮助中的 创建新密钥环更新密钥环密码

使用密钥环

PAM 模块 *pam_gnome_keyring.so* 部分初始化 GNOME Keyring,并在过程中解锁 *login* 密钥环。gnome-keyring-daemon 通过 systemd 用户服务自动启动。

PAM 步骤

注意 要使用自动解锁而**不使用自动登录**,用户帐户的密码应与 *login* 密钥环的密码相同。请参阅 #自动更改密钥环密码与用户密码一致
提示
  • 要使用自动登录进行自动解锁,您可以为密钥环设置一个空白密码。请注意,在这种情况下,密钥环的内容将以未加密的形式存储。
  • 或者,如果使用 GDM 和 LUKS,GDM 可以解锁您的密钥环,如果它与您的 LUKS 密码匹配。要实现这一点,您需要在 mkinitcpio.conf 中使用 systemd init 以及 适当的内核参数,并且您应该确保系统的实时时钟设置为 UTC 而不是本地时间(参见 [2])。有关更多详细信息,请参阅 [3]
  • 如果您希望跳过 PAM 步骤,则必须手动或通过其他方法解锁密钥环。请参阅 #在桌面环境之外使用 gnome-keyring-daemon (KDE, GNOME, XFCE, ...)GnomeKeyring wiki

使用显示管理器时,密钥环在大多数情况下都可以即开即用。GDMLightDMLXDMSDDM 已具有必要的 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
注意 如果使用 greetd 登录管理器,则需要修改的文件是 /etc/pam.d/greetd,而不是 /etc/pam.d/login

SSH 密钥

GNOME Keyring 可以作为 ssh-agent 的包装器。在此模式下,每次需要解锁 SSH 密钥时,它都会显示一个 GUI 密码输入对话框。该对话框包含一个复选框,用于记住您输入的密码,如果选中该复选框,则在您的登录密钥环解锁的情况下,将来可以完全免密使用该密钥。

从版本 1:46 开始,SSH 功能在 gnome-keyring-daemon 构建中默认禁用。它已 移至 /usr/lib/gcr-ssh-agent,这是 gcr-4 软件包的一部分。

设置 gcr

您需要做的就是

  1. 启用 gcr-ssh-agent.socket systemd 用户单元
  2. 启动一次 gcr-ssh-agent.socket systemd 用户单元。这将创建套接字文件 $XDG_RUNTIME_DIR/gcr/ssh。创建文件后,第一步足以使套接字单元自动启动。
  3. 如果 gcr-ssh-agent.socket 单元处于活动状态,则无需手动配置 SSH_AUTH_SOCK 环境变量。SSH_AUTH_SOCK 环境变量的值应设置为 $XDG_RUNTIME_DIR/gcr/ssh,用户注销并重新登录后。已知这适用于使用 fish 作为默认 shell 的用户的 Gnome Console 应用程序。

多种方法 来设置环境变量,您使用哪种方法将取决于您的具体设置和偏好。

使用

您可以运行

$ ssh-add -L

以列出正在运行的代理中加载的 SSH 密钥。这有助于确保您已启动适当的服务并正确设置了 SSH_AUTH_SOCK

要永久在密钥环中保存密码,请使用 seahorse 软件包中的 ssh-askpass

$ /usr/lib/seahorse/ssh-askpass my_key
提示 在某些情况下(例如,当您不使用登录管理器或桌面环境时),替代方法是使用 Seahorse *secret-tool* 存储密码

要手动从另一个目录添加 SSH 密钥

$ ssh-add ~/.private/id_rsa
Enter passphrase for ~/.private/id_rsa:
注意 您必须在私钥所在的同一目录中拥有相应的 *.pub* 文件(示例中为 ~/.ssh/id_rsa.pub)。另外,请确保公钥是私钥文件名加上 .pub(例如,my_key.pub)。

要禁用所有手动添加的密钥

$ ssh-add -D

禁用

如果您想运行替代的 SSH 代理(例如,直接运行 ssh-agentgpg-agent),最好禁用 GNOME Keyring 的 ssh-agent 包装器。这样做并非绝对必要,因为每个代理都侦听不同的套接字,并且可以使用 SSH_AUTH_SOCK 在它们之间进行选择,但它可以使调试问题更容易。请注意,GNOME 实现不支持 BatchMode 等许多脚本功能 [4]

要禁用 gcr-ssh-agent,请确保 gcr-ssh-agent.socketgcr-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

自动更改密钥环密码与用户密码一致

注意 这仅影响 *login* 密钥环。

/etc/pam.d/passwd追加 password optional pam_gnome_keyring.so

/etc/pam.d/passwd
...
password	optional	pam_gnome_keyring.so

在桌面环境之外使用 gnome-keyring-daemon (KDE, GNOME, XFCE, ...)

启动

本文或本章节的准确性存在争议。

原因:至少 xinitSDDM 执行 /etc/X11/xinit/xinitrc.d/ 中的所有脚本,而 sway 提供 /etc/sway/config.d/50-systemd-user.conf,因此问题不在于“桌面环境之外”。如果 gnome-keyring 需要 XDG Autostart,则安装/配置部分应说明这一点。(在 Talk:GNOME/Keyring#Launching gnome-keyring-daemon outside desktop environments (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 或 secret service API 的程序,直到 gnome-keyring-daemon --login 退出。

GNOME Keyring XDG Portal

本文或本章节的准确性存在争议。

原因:修改 /usr/share 中的包文件,将在 pacman 升级时被撤销(在 Talk:GNOME/Keyring 中讨论)

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#Backends

故障排除

密码未记住

如果您在登录后被要求输入密码,但发现您的密码未保存,则可能需要创建/设置一个默认密钥环。要使用 Seahorse(又名 Passwords and Keys)执行此操作,请参阅 GNOME 帮助中的 创建新密钥环更改默认密钥环

重置密钥环

如果您收到以下错误消息:“您用于登录计算机的密码不再与您的登录密钥环的密码匹配”,您将需要 更改您的登录密钥环密码

或者,您可以从 ~/.local/share/keyrings/ 中删除 login.keyringuser.keystore 文件。请注意,这将永久删除所有保存的密钥。删除文件后,只需注销并重新登录即可。

无法找到守护进程控制文件

登录后,以下错误可能会出现在 日志

gkr-pam: unable to locate daemon control file

如果不存在其他相关问题,此消息“可以安全地忽略” [5]

路径“/”下不存在秘密集合

如果您尝试使用 Seahorse 添加新密钥环,您可能会收到此错误,原因如下

  • ~/.local/share/keyrings/ 目录不存在。如果缺少,请创建它。
  • 正在使用自定义 ~/.xinitrc。这可以通过添加以下行来解决 [6]
~/.xinitrc
source /etc/X11/xinit/xinitrc.d/50-systemd-user.sh

终端显示消息“discover_other_daemon: 1”

这是由于 gnome-keyring-daemon 被第二次启动。由于 systemd 服务与守护进程一起提供,因此您无需以其他方式启动它。因此,请确保从您的 .zshenv.bash_profile.xinitrcconfig.fish 或类似文件中删除启动命令。或者,您可以 禁用 gnome-keyring-daemon.servicegnome-keyring-daemon.socket 用户单元

密钥环初始化不当

这有几个症状

  • SSH 或 Git 等程序在等待密钥环提供密码时挂起,最终以“代理拒绝操作”等错误超时。
  • Seahorse 不显示任何密钥环,手动创建名为“login”的密钥环似乎无效。
  • Seahorse 的输出中出现以下错误消息
    couldn't load all secret collections: No such secret collection at path: /org/freedesktop/secrets/collection/login

要解决此问题,请执行以下操作

  1. 重启 gnome-keyring-daemon.service systemd 用户单元。这应该可以正确初始化 *login* 密钥环。
  2. 重启 gcr-ssh-agent.service systemd 用户单元(如果使用)。其他代理也可能需要重启。

如果这不能解决问题,请考虑 重置密钥环

SSH 代理不可用

症状:ssh-add -L 返回“连接到代理时出错:连接被拒绝”

确保 gcr-ssh-agent.socket 用户单元 已启用并启动

$ systemctl --user enable --now gcr-ssh-agent.socket

确保 gnome-keyring-daemon 套接字和服务的 用户单元 已启用并启动

$ systemctl --user enable gnome-keyring-daemon.{service,socket} $ systemctl --user start gnome-keyring-daemon.{service,socket}

参见