KDE Wallet
KDE Wallet Manager 是一个用于管理 KDE Plasma 系统上密码的工具。使用 KWallet 子系统,用户既可以保存自己的机密信息,也可以访问所有与 KWallet 集成的应用所保存的密码。
钱包(wallet,在 KDE 的术语中有时也称 vault 或 keyring)是一个由用户自定义密码保护的加密卷,用户和/或软件可以在其中保存机密信息(通常是用户在应用中勾选 “记住账户” 后的凭据)。这些加密卷既可以由用户手动创建和使用,也可以由某些集成了钱包子系统的软件(例如邮件应用或游戏)在后台自动创建和使用。加密卷通常会在用户登录时通过 PAM 模块自动解密(见下文)。
提示:
- 如果你只是想让使用钱包的应用能有一个可用的钱包,建议使用默认名称(即
kdewallet),并让钱包密码与用户密码相同(方便 PAM 使用)。 - 钱包默认以
.kwl扩展名的加密文件形式存放在~/.local/share/kwalletd目录中。
安装
KDE Wallet 通常随 KDE Plasma 桌面环境一起提供。钱包子系统也可以通过 kwallet包 软件包手动安装。
可选安装 kwalletmanager包 软件包以获得钱包管理工具。该工具可用于以图形化方式创建和管理 KDE 钱包。
配置
在 Plasma 6(KF6)上配置 PAM
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文件夹。
使用 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 加密
当系统使用 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
其他替代方案和更多细节见 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
自动 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