pass

出自 ArchWiki

来自 官方网站

密码管理应当简单并遵循 Unix 哲学。使用 pass,每个密码都存在于一个 gpg 加密文件中,该文件的文件名是需要密码的网站或资源的标题。这些加密文件可以组织成有意义的文件夹层次结构,从一台计算机复制到另一台计算机,并且通常可以使用标准命令行文件管理实用程序进行操作。

pass 是一个简单的命令行密码管理器。pass 是一个 shell 脚本,它利用了现有的工具,例如 GnuPGtreeGit

安装

安装 pass 软件包。

可选的 Qt GUI 可通过 qtpass 软件包获得。

基本用法

注意: 要能够使用 pass,请设置 GnuPG。用于 pass 的密钥的信任级别必须为“完全信任”。

要初始化密码存储

$ pass init gpg-id_or_email

要创建新密码,首先提供一个描述性的分层名称。在此示例中,它是archlinux.org/wiki/username

$ pass insert archlinux.org/wiki/username

要查看密码存储,请执行以下操作。请注意示例输出,其中显示了我们刚刚创建的层次结构

$ pass
Password Store
└── archlinux.org
    └── wiki
        └── username

要为上述示例生成新的随机密码,请执行以下操作,其中 n 是所需的密码长度(数字)

$ pass generate archlinux.org/wiki/username n

要检索密码,请在以下提示符处输入 gpg 密码短语,再次使用上面的示例名称

$ pass archlinux.org/wiki/username

安装了 xclip 的 Xorg 用户可以将密码直接检索到剪贴板上(例如,粘贴到 Web 表单中)。在 Wayland 会话中,应使用 wl-clipboard 代替。为此,请执行以下操作(同样使用上面相同的分层名称)

$ pass -c archlinux.org/wiki/username
注意: 喜欢经典中键单击/粘贴的用户可以将以下内容添加到他们各自的 ~/.shellrc 中以实现此行为:export PASSWORD_STORE_X_SELECTION=primary

pass 附带一个 dmenu 包装器,以实现轻松搜索/复制。要使用它,请安装可选依赖项 dmenu 并运行

$ passmenu

然后,选择一个条目将将其密码复制到剪贴板。有关自定义选项(例如不区分大小写)的信息,请参阅 dmenu(1)。您可能希望将其设置为系统范围的快捷键,以便从任何应用程序轻松访问密码。

数据组织

默认情况下,使用 pass insert 创建的凭据文件将仅包含您的密码。但是,这可能不够,因为某些应用程序会要求提供详细数据,例如用户名、URL 等。您可以使用命令 pass edit password_name 以您想要的方式编辑现有文件。以下是 pass-project 页面提供的首选组织方案。当使用选项 -c--clip 与此方案结合使用时,只会复制密码。

YwrZSNH35z164ym9pI
URL: *.amazon.com/*
Username: AmazonianChicken@example.com
Secret Question 1: What is your childhood best friend's most bizarre superhero fantasy? Oh god, Amazon, it's too awful to say...
Phone Support PIN #: 84719

迁移到 pass

pass-project 页面上列出了多个脚本,用于从其他程序导入密码

扩展

自 1.7 版本起,pass 支持社区开发的扩展。这些扩展通过支持新命令来扩展 pass 的功能。

  • pass-tomb — 管理加密在 tomb 内的整个密码存储树。
https://github.com/roddhjav/pass-tomb || pass-tombAUR
  • pass-otp — 支持一次性密码 (OTP) 令牌。
https://github.com/tadfisher/pass-otp || pass-otp
  • pass-import — 一个通用的从其他密码管理器导入的工具。
https://github.com/roddhjav/pass-import || pass-importAUR
  • pass-update — 一个用于更新密码的简易流程。
https://github.com/roddhjav/pass-update || pass-updateAUR
  • pass-audit — 用于审计密码仓库的扩展。
https://github.com/roddhjav/pass-audit || pass-auditAUR
  • pass-coffin — 一个密码存储扩展,用于将数据隐藏在签名和加密的 coffin 中
https://github.com/ayushnix/pass-coffin || pass-coffinAUR
  • pass-tessen — 一个与 Xorg/Wayland 兼容的命令行模糊选择工具,带有复制和粘贴功能。
https://github.com/ayushnix/pass-tessen || pass-tessenAUR
  • tessen — 一个用于 Wayland 的 bash 脚本,扩展了对 dmenu 类型应用程序(如 rofi 和 fuzzel)的兼容性。
https://github.com/ayushnix/tessen || tessenAUR

高级用法

环境变量 可用于更改 pass 查找存储和 git 操作的位置,通过

PASSWORD_STORE_DIR=/path/to/store

有关如何使用此功能来支持多个 pass 仓库的更多信息,请参阅 此链接。以下 pw() 示例别名将命名数据库的第二行发送到剪贴板,然后在五秒钟后发送第一行,最后在五秒钟后发送 OTP 代码。假设密码占用第一行,用户名占用第二行,并且 OTP URI 存在于命名数据库中的任何位置,则最终效果是连续将用户名 > 密码 > otp 代码粘贴到可用的(例如,浏览器)条目字段中

pw() {
export PASSWORD_STORE_CLIP_TIME=8
export PASSWORD_STORE_X_SELECTION=primary
pass -c2 $1; sleep 5; pass -c $1; sleep 5; pass otp -c $1; exit
}

多 pass 上下文 (例如,团队协作)

可以使用别名来设置不同的 pass 上下文,这有助于与不同的团队协作。我们已经在 bash 中实现了以下功能

将别名添加到您的 ~/.bashrc

alias passred="PASSWORD_STORE_DIR=~/.pass/red pass"
alias passblue="PASSWORD_STORE_DIR=~/.pass/blue pass"

将这些别名添加到您的 ~/.bash_completion 中,并确保安装了 bash-completion

source /usr/share/bash-completion/completions/pass
_passred(){
    PASSWORD_STORE_DIR=~/.pass/red/ _pass
}
complete -o filenames -o nospace -F _passred passred
_passblue(){
    PASSWORD_STORE_DIR=~/.pass/blue/ _pass
}
complete -o filenames -o nospace -F _passblue passblue

或用于 zsh (来源: /usr/share/zsh/site-functions/_pass)

compdef _pass passred
zstyle ':completion::complete:passred::' prefix "$HOME/.pass/red"
passred() {
  PASSWORD_STORE_DIR=$HOME/.pass/red pass $@
}
compdef _pass passblue
zstyle ':completion::complete:passblue::' prefix "$HOME/.pass/blue"
passblue() {
  PASSWORD_STORE_DIR=$HOME/.pass/blue pass $@
}

现在,您可以初始化到 ~/.pass/red~/.pass/blue 中,并使用 passredpassblue 别名拥有两个 pass 上下文。您可以将其进一步推广到任意数量的上下文。

Git 集成

Git 助手用法

您可以将 pass 用作 git 的凭据助手。安装 pass-git-helperAUR。详细信息请参见 github README 文件

git 配置

通过调用以下命令将 pass-git-helper 配置为 git 凭据助手

$ git config --global credential.helper /usr/bin/pass-git-helper

映射文件

创建文件 ~/.config/pass-git-helper/git-pass-mapping.ini。它用于将 git 远程主机映射到您的 pass 数据库。格式如下所示

[github.com]
target=dev/github

[*.fooo-bar.*]
target=dev/fooo-bar

您可以在主机部分中使用通配符,如示例所示。

密码存储布局

与 pass 一样,助手假定密码包含在密码存储条目的第一行中。此外,如果存在第二行,则该行将被解释为用户名。

为此,您必须使用 pass insert --multiline 创建多行密码存储条目。

用于 pass 的中央 Git 服务器与 GnuPG 结合使用 (SSH 示例)

您可以通过设置一个用于 pass 的中央 Git 服务器来设置密码管理系统。这允许您通过多个客户端环境同步您的中央密码仓库。

在服务器上安装一个用于 pass 的裸 Git 仓库

在服务器上运行 git init --bare ~/.password-store 以创建一个您可以推送到的裸仓库。

导入授权的公钥 SSH 密钥

请参阅 SSH 密钥#将公钥复制到远程服务器

在客户端

本节假定您已配置 GnuPG 并拥有用于加密密码的密钥对。在您的本地客户端上,确保您在客户端上有一个本地密码存储,然后启用通过 Git 管理本地更改,添加您的远程 Git 仓库,并推送您的本地 pass 历史记录。

创建一个本地密码存储

$ pass init gpg_key_id

启用通过 Git 管理本地更改

$ pass git init

将远程 git 仓库添加为“origin”

$ pass git remote add origin user@server:~/.password-store

推送您的本地 pass 历史记录

$ pass git push -u --all

现在您可以使用标准 Git 命令,以 pass 为前缀。例如:pass git pushpass git pull。当您使用 pass 修改密码存储时,pass 将自动创建提交。

故障排除

加密失败:无法使用的公钥

尝试插入新条目时可能会发生以下错误

$ pass insert archlinux.org/wiki/username
Enter password for archlinux.org/wiki/username:
Retype password for archlinux.org/wiki/username:
gpg: XXXXXXXXX: There is no assurance this key belongs to the named user
gpg: [stdin]: encryption failed: Unusable public key
Password encryption aborted.

如果 GnuPG 密钥的信任级别设置为“完全信任”以外的任何级别,则会发生这种情况。编辑用于 pass 的密钥,将其信任级别设置为“完全信任”

$ gpg --edit-key your_key_id
> trust
> 5

参见