跳转到内容

KDE Wallet

来自 Arch Linux 中文维基

KDE Wallet Manager 是一个用于管理 KDE Plasma 系统上密码的工具。使用 KWallet 子系统,用户既可以保存自己的机密信息,也可以访问所有与 KWallet 集成的应用所保存的密码。

钱包(wallet,在 KDE 的术语中有时也称 vault 或 keyring)是一个由用户自定义密码保护的加密卷,用户和/或软件可以在其中保存机密信息(通常是用户在应用中勾选 “记住账户” 后的凭据)。这些加密卷既可以由用户手动创建和使用,也可以由某些集成了钱包子系统的软件(例如邮件应用或游戏)在后台自动创建和使用。加密卷通常会在用户登录时通过 PAM 模块自动解密(见下文)。

提示:

  • 如果你只是想让使用钱包的应用能有一个可用的钱包,建议使用默认名称(即 kdewallet),并让钱包密码与用户密码相同(方便 PAM 使用)。
  • 钱包默认以 .kwl 扩展名的加密文件形式存放在 ~/.local/share/kwalletd 目录中。
注意:自 KDE Frameworks 5.97.0 起,KDE Wallet 支持 org.freedesktop.secrets DBus API,libsecret 现在可以通过 Secret Service API 使用它来存储和获取密码及其他机密信息。

安装

KDE Wallet 通常随 KDE Plasma 桌面环境一起提供。钱包子系统也可以通过 kwallet包 软件包手动安装。

可选安装 kwalletmanager包 软件包以获得钱包管理工具。该工具可用于以图形化方式创建和管理 KDE 钱包。

配置

在 Plasma 6(KF6)上配置 PAM

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

原因: 配置 PAM 似乎并非使 KWallet 正常工作所必需。此外也未提及 Plasma Login Manager(SDDM 已不再是首选的显示管理器)。(在 英文讨论页 中讨论)


Plasma 6 使用 ksecretd 作为 kwallet 的 secret service API。因此 PAM 必须显式指向该守护进程。

在相关的 PAM 文件中添加以下内容(例如视具体配置选择 system-login、sddm 或 login):

auth            optional        pam_kwallet5.so
session         optional        pam_kwallet5.so auto_start kwalletd=/usr/bin/ksecretd

如果不指定 kwalletd= 参数,pam_kwallet5.so 会回退到默认值,尝试使用 kwallet5。

根据你的情况编辑 PAM 配置:

  • 对于 SDDM:无需进一步修改,因为 /etc/pam.d/sddm 中已经包含这些行。
  • 对于 LightDM:无需进一步修改,因为 /etc/pam.d/lightdm 和 /etc/pam.d/lightdm-autologin 中已经包含这些行。
  • 对于 GDM:相应地编辑 /etc/pam.d/gdm-password。
  • 对于 greetd:相应地编辑 /etc/pam.d/greetd。
  • 若要在 tty 登录时解锁(没有显示管理器,或使用 greetd-tuigreet包 之类),请相应地编辑 /etc/pam.d/login。此时需要指定 force_run 参数。
/etc/pam.d/login
auth            optional        pam_kwallet5.so
session         optional        pam_kwallet5.so auto_start force_run kwalletd=/usr/bin/ksecretd
/etc/pam.d/greetd
#%PAM-1.0

auth       required     pam_securetty.so
auth       requisite    pam_nologin.so
auth       include      system-local-login
auth       optional     pam_kwallet5.so
account    include      system-local-login
session    include      system-local-login
session    optional     pam_kwallet5.so auto_start force_run kwalletd=/usr/bin/ksecretd

Plasma 5(KF5)——旧版

较旧的 Plasma 版本使用 kwalletd5,不需要指定守护进程。

/etc/pam.d/login
auth     optional  pam_kwallet5.so
session  optional  pam_kwallet5.so auto_start

登录时自动解锁 KDE Wallet

要随登录自动解锁 KDE Wallet,请安装 kwallet-pam包 以获得兼容 PAM 的模块。所选 KWallet 密码必须与当前用户密码相同。

注意:
  • kwallet-pam包 不兼容 GnuPG 密钥,KDE Wallet 必须使用标准的 blowfish 加密方式。
  • 使用自动登录时,只有自动登录方式保存了密码,钱包才能被解锁。例如 pam_autologin 就会保存。
  • 使用指纹阅读器登录时无法解锁钱包。
  • 钱包必须命名为 kdewallet(默认名称)。它不会解锁任何其他钱包。
  • 如果使用 KDE,建议在 KDE Wallet 设置中关闭 Close when last application stops using it,以防钱包在每次使用后(如解锁 Wi-Fi 密码等)被关闭。
  • 可能需要先删除默认创建的钱包,这样会一并删除所有已保存的条目。
  • 如果 kwallet Migration Assistant 在每次登录后都要求输入密码,请重命名或删除 ~/.kde4/share/apps/kwallet 文件夹。
提示:另一种做法是使用 KWalletManager 并把 KWallet 密码设为空,这样解锁钱包时就无需输入密码。只需在 Change Password.. 中两个字段都留空即可。不过这可能导致他人对用户钱包的非预期(读/写)访问。强烈建议在 Access Control 中启用 Prompt when an application accesses a wallet,以防止对钱包的非预期访问。

使用 Plasma Login Manager 自动登录与 LUKS 加密

把 /usr/lib/pam.d/plasmalogin-autologin 复制为 /etc/pam.d/plasmalogin-autologin,然后在 pam_kwallet5.so 之前添加 pam_systemd_loadkey(8):

/etc/pam.d/plasmalogin-autologin
-auth       optional    pam_systemd_loadkey.so
-auth       optional    pam_gnome_keyring.so
-auth       optional    pam_kwallet5.so

然后向 plasmalogin.service 添加以下内容:

/etc/systemd/system/plasmalogin.service.d/keyringmode.conf
[Service]
KeyringMode=inherit

使用 SDDM 自动登录与 LUKS 加密

本文或本章节可能需要合并到#使用 Plasma Login Manager 自动登录与 LUKS 加密。

附注: 前提条件和配置相同,具体取决于桌面环境使用哪个登录管理器。(在 Talk:KDE Wallet 中讨论)

当系统使用 dm-crypt 加密时,可以使用解密磁盘的口令来自动解锁 KDE Wallet。配置 SDDM#自动登录 后,钱包依然可以自动解锁。编辑 /etc/pam.d/sddm-autologin,加入 pam_systemd_loadkey(8):

/etc/pam.d/sddm-autologin
-auth       optional    pam_systemd_loadkey.so
-auth       optional    pam_gnome_keyring.so
-auth       optional    pam_kwallet5.so
-session    optional    pam_gnome_keyring.so auto_start
-session    optional    pam_kwallet5.so auto_start kwalletd=/usr/bin/ksecretd

然后编辑 sddm.service,添加:

/etc/systemd/system/sddm.service.d/keyringmode.conf
[Service]
KeyringMode=inherit

提示与技巧

使用 KDE Wallet 存储 SSH 密钥口令

安装 ksshaskpass包 软件包。

将 SSH_ASKPASS 环境变量设为 ksshaskpass,并将 SSH_ASKPASS_REQUIRE 设为 prefer(优先使用 askpass 程序而不是 TTY)。要在每次登录时自动设置,请创建以下 environment.d(5) 文件:

~/.config/environment.d/ssh_askpass.conf
SSH_ASKPASS=/usr/bin/ksshaskpass
SSH_ASKPASS_REQUIRE=prefer

重启会话(即重新登录)以使环境变量生效。

首次尝试使用某个 SSH 密钥时,会提示输入其口令。请务必勾选 Remember password 复选框。下次口令将从 KDE Wallet 读取。

使用 KDE Wallet 存储 Git 凭据

Git 可以把凭据处理委托给凭据助手。通过把 ksshaskpass包 用作凭据助手,HTTP/HTTPS 和 SMTP 密码可以安全地保存在 KDE Wallet 中。

安装 ksshaskpass包 软件包。

通过设置 GIT_ASKPASS 环境变量来配置 Git:

~/.config/environment.d/git_askpass.conf
GIT_ASKPASS=/usr/bin/ksshaskpass
提示:如果 SSH_ASKPASS 环境变量已设为 ksshaskpass,则无需再额外设置 GIT_ASKPASS。

其他替代方案和更多细节见 gitcredentials(7)。

存储 GPG 密钥口令

可以使用原生 KDE 窗口提示输入 GPG 密钥口令,并将其保存到 KDE Wallet 中。

配置 gpg-agent 使用 /usr/bin/pinentry-qt。

启用 Secret Service 接口。有两种方式:

  • 打开 系统设置 > KDE Wallet,启用 Use KWallet for the Secret Service interface。
  • 编辑 KDE Wallet 配置文件:
~/.config/kwalletrc
[org.freedesktop.secrets]
apiEnabled=true

关闭钱包再重新打开,这些更改才会生效。你可以使用 kwalletmanager包 完成,也可以直接向 Qt D-Bus 发送命令:

$ qdbus org.kde.kwalletd6 /modules/kwalletd6 closeAllWallets
$ qdbus org.kde.kwalletd6 /modules/kwalletd6 open kdewallet 0 $0

在 Chromium 和 VSCode 中使用 KDE Wallet

基于 Chromium 的浏览器内置了钱包集成。基于 VSCode 的 IDE 依赖同样的 Chromium oscrypt 模块来检测密钥环。 [1]

要启用该功能,请以 --password-store=kwallet5、--password-store=kwallet6 或 --password-store=detect 参数运行程序。 [2]

要永久保留该改动,见 Chromium#使 flag 持久化(设置 CHROMIUM_USER_FLAGS 不会生效)。

从终端查询密码

与其把密码保存在纯文本文件中,你可以在钱包中手动添加新条目,然后用 kwallet-query 取回。

例如,你想用 Podman 登录 Docker Hub 仓库,而它支持通过 --password-stdin 标志从标准输入读取密码,那么可以用下面的命令登录:

$ kwallet-query -r folder_entry wallet_name -f folder_name | podman login docker.io -u dockerhub_username --password-stdin

这样,你的密码既不会保存在任何文本文件中,也不会进入终端历史记录文件。

如果要在图形会话之外运行 kwallet-query(例如作为无人值守备份脚本的一部分),请设置 QT_QPA_PLATFORM=offscreen 环境变量:

$ QT_QPA_PLATFORM=offscreen kwallet-query -r folder_entry wallet_name -f folder_name

在窗口管理器中自动解锁 KWallet

要解锁由登录密码保护的 KWallet,除了配置 PAM 之外,还必须在窗口管理器配置文件的自启动部分启动 /usr/lib/pam_kwallet_init。

禁用 KWallet

如果你希望永久禁用 kwallet:

~/.config/kwalletrc
[Wallet]
Enabled=false
注意:可以把 KWallet 用作其他钱包管理器的代理,这样 plasma-nm包 之类的应用就不会出问题。参见此讨论。

自动 D-Bus 激活

大多数应用使用 org.freedesktop.secrets.service 这个 D-Bus 服务。KWallet 并未开箱即用地提供对应的服务文件。

你可以创建这样的服务文件来实现自动激活:

~/.local/share/dbus-1/services/org.freedesktop.secrets.service
[D-BUS Service]
Name=org.freedesktop.secrets
Exec=/usr/bin/kwalletd6

另见