大家好 在本文中,我想分享一下我在Linux上设置和使用密码管理器的经验,不仅因为它的简单性,使用系统中已有的工具以及仅在控制台上工作的能力而闻名。 更具体地说,与gpg密钥的生成和存储以及pass,gpg,git,github和浏览器之间的协作设置有关的问题将受到影响。 一切都在Linux,Windows和Android下进行。
它是什么以及如何工作
从技术上讲,pass是用bash编写的GnuPG和git的非常简单的绑定。 每个密码(以及相关信息,例如登录名)都存储在加密文件中。 通过文件名,使用GnuPG进行加密,使用Git在设备之间进行同步来搜索所需的密码。
除了原始通行证外,还有两个与之兼容的流行项目在Windows上运行:
- QtPass 。 您可能会猜到,用Qt编写的GUI应用程序。
- 围棋 。 用go编写的命令行应用程序。 在Windows下,我使用它。 但是,我认为,开发人员开始在此添加太多额外的功能,同时放弃了其直观性。
通行证开发者是Jason Donenfeld,他也是WireGuard的作者(Linus Torvalds认为它是基于现代加密标准的VPN实现,“与OpenVPN和IPSec相比可算是艺术品”,他很可能会出现在Linux 5.6内核中)。
密钥创建
GnuPG-用于加密和电子签名的系统。 尽管存在缺陷(例如, 一篇批评gpg 的文章 ),但它已经成为事实上的标准已有20多年了。 即使是该链接上的文章也发现很难命名一种用于加密文件的替代工具。
例如在habr上描述了在控制台中创建密钥的过程,但是为什么不在GUI中呢? 在KDE项目中,他们成为GPG的前端,称为Kleopatra 。 Linux用户可以在存储库中找到它,而在gpg4win中,Kleopatra是开箱即用的。
在菜单中,选择File
- New Key Pair
- Create a personal OpenPGP key pair
。
输入名称和电子邮件。 无需担心将来会更改它们。 GPG允许您自由地将新的uid添加到密钥中并删除现有的uid。 如果要使用创建的密钥对git commit进行签名,并看到它们对面的“已验证”复选框,则需要在github帐户中指定一个状态为“已确认”的真实电子邮件。
接下来,单击“ Advanced Settings
以配置关键设置。
在“ Key Material
部分中,选择ECDSA/EdDSA
+ ECDH
。 我更喜欢不使用经典的RSA算法,而是基于ed25519 / cv25519椭圆曲线。 从最终用户的角度来看,它们相对于RSA的主要优势是具有相同密码强度的较小密钥大小。 有人认为256位ed25519密钥的强度与3072位RSA密钥的强度差不多。 后者的唯一优势是它的普遍性,特别是在硬件系统中。
您也可以从菜单中选择Brainpool和NIST曲线系列。 但是,后者被怀疑具有NSA后门,而前者也有轻微的投诉。 因此,由著名密码学家Daniel Bernstein提出的ed25519和cv25519是最佳选择。
一个有趣的事实:在积极推广的身份验证标准FIDO U2F(Google积极参与了开发)中,使用了NIST曲线。 另外,例如,Android Keystore有其支持,但不支持ed25519。 为什么会这样呢?
结果,将在椭圆曲线上创建2个子项。 一个用于签名,另一个用于加密,这是我们所需要的。 尽管在算法上是可行的,但GPG不允许将一个子密钥用于两者(例如,在libsodium
库中有相应的函数)。
如果计划使用此密钥与git配合使用,则在“ Certificate Usage
部分中,检查“ Signing
和Authentication
项。
在下一步中,建议提供一个密码,以保护该密码。 由于密钥将用于加密存储中的所有数据,因此该密码是主密码。 值得一试的是他的脚手架。
主密码生成
当然,您总是可以从足够(例如20)个字符中生成一个随机字符串。 但是,几乎不可能记住,并且很难正确输入,尤其是在智能手机上。 因此,EFF建议在指南中使用密码短语。
该方法的工作方式如下:选择足够大的字典(EFF提供了几个字典,例如this ),并从中选择至少6个随机词。 您甚至可以完全不用骰子或硬币就可以随意选择。 此方法称为diceware 。 我还没接触到骰子和硬币,所以我只使用GNU coreutils附带的shuf
实用程序:
$ shuf --random-source=/dev/random -n 6 ./eff_large_wordlist.txt 51345 rendering 24564 edging 65652 vivacious 31343 footprint 55261 snore 24436 earache
我们将此密码保存在计算机外部的安全位置。
结果,将创建一个秘密密钥。 在控制台中工作时,通常必须指出其指纹,值得写下该数字。
现在,您可以配置gpg和git的集成。
GPG,Git和github集成
严格来说,此项是可选的。 密码存储通行证只是一个包含加密文件的目录,这意味着可以根据需要进行同步。 Google云端硬盘,Yandex.Disk等 等 如果您不想使用git,那么建议您注意Syncthing 。 这是一个开源程序,仅需最少的设置即可直接在设备之间传输文件,而无需将其存储在第三方服务器上。
作为git托管,没有人愿意通过放置Gitea来提高自己的服务器,但是,这意味着支持它的成本,并不一定保证很高的安全性和可靠性。 因此,我不希望使用Microsoft产品,只是在github上创建了一个私有存储库。
git中的标准身份验证机制是通过SSH。 通常可以理解,这需要特殊的ssh密钥。 但是,可以在不生成不必要实体的情况下使用在上一步中创建的gpg密钥。 为了使ssh使用gpg-key(更确切地说是子项),必须满足两个条件:
- 它必须设置
A
-Authenticate标志; - 它的密钥必须写在
~/.gnupg/sshcontrol
。
第一项已经完成,您可以使用以下命令获取keygrip
gpg --list-secret-keys --with-keygrip 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7
在gpg输出中,我们对ed25519子项( 05B6641E23D720E87EE6A26020BAB214B842F2B7
)的键05B6641E23D720E87EE6A26020BAB214B842F2B7
。
现在您可以将公钥上传到github。 转到配置文件中的SSH and GPG keys
部分,然后选择New SSH key
。 在控制台中,我们键入
$ gpg --export-ssh-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPfj81nennAoujvw1fLzGx9iED34zk5oDMYKuUcBq5wv openpgp:0x54068AC7
并复制生成的公共ssh密钥。
Git可以使用gpg签署提交,而github支持这一点。 我认为这对安全性很有用。 导出公钥gpg命令
$ gpg --export --armor 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 -----BEGIN PGP PUBLIC KEY BLOCK----- mDMEXcrHrBYJKwYBBAHaRw8BAQdA9+PzWd6ecCi6O/DV8vMbH2IQPfjOTmgMxgq5 RwGrnC+0G0hlbGxvIEhhYnIgPGZha2VAZW1haWwuY29tPoiQBBMWCAA4BQsJCAcC BhUKCQgLAgQWAgMBAh4BAheAFiEEBgnJ3+8aorON7brcwFRLVVQGiscFAl3WO2wC GyMACgkQwFRLVVQGiscg5AEAkh0a6OQS2CPiXq9bWB+wULHUGT6NYZhwZ3eUQCfH Zq0A/iFBJQkAZIFdqH84ksFbvv6K/LQy72NRJzK0tho6qFwHuDgEXcrHrBIKKwYB BAGXVQEFAQEHQEs6UVOtj5yMGxvRcMU577miH/Bh5kZWMJKHxsDBcXV4AwEIB4h4 BBgWCAAgFiEEBgnJ3+8aorON7brcwFRLVVQGiscFAl3Kx6wCGwwACgkQwFRLVVQG isea8wD/X5JSJW0PMu/KucytUZZo8obHa86/TUwH/8+xQ3+djuEBALugbQRmCIr5 /JYO7x5PNA0QYqhh7LIZ9nKYp0mhqpcO =dc89 -----END PGP PUBLIC KEY BLOCK-----
并将发生的事情复制到New GPG key
表格中。
进一步的操作特定于您的操作系统。
集成gpg和git(Linux)
git使用的OpenSSH客户端可以通过两种方式接收密钥:从~/.ssh
以及通过ssh-agent
守护程序创建的套接字。 后者可能是gpg-agent
,我们将使用它。 在~/.gnupg/gpg-agent.conf
您需要编写一行enable-ssh-support
。
使用以下命令重新启动gpg-agent
gpg-connect-agent reloadagent /bye
之后,它将在以下位置创建一个套接字
${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh
此路径(可能取决于发行版)必须写在环境变量$SSH_AUTH_SOCK
,并且ssh会选择它。 我们在控制台中键入命令
ssh -T git@github.com
如果一切顺利,则在输入主密码后,将显示有关成功身份验证的消息。
集成gpg和git(Windows)
最近,Microsoft将OpenSSH添加到可用于安装的Windows组件数量中,并且还实现了对套接字的支持,例如AF_UNIX
,例如相同的SSH_AUTH_SOCK
。 但是,Win32-OpenSSH无法与gpg4win进行交互,因为它仍仅使用命名管道。
因此,您必须安装常绿的腻子。 我们写文件
~/AppData/Roaming/gnupg/gpg-agent.conf
enable-putty-support
然后重新启动gpg-agent。 之后,他将开始伪装成Pageant-钥匙的恶魔。 sshcontrol
文件必须位于同一文件夹中。
为了使git客户端开始使用腻子,您需要使用路径plink.exe
创建GIT_SSH
环境GIT_SSH
。 例如,我有这个
C:\ProgramData\chocolatey\bin\PLINK.EXE
顺便说一下git。 通常git for windows
客户端安装的git for windows
包含很多不必要的东西(至少对于gopass来说是不必要的),例如,它自己的OpenSSH实现。 但是,其开发人员正在开发更轻便的版本,可以从github下载。 例如,MinGit的体积要小2倍,有风险的人可以尝试使用MinGit-busybox。 由于开发人员希望使用不带MSYS2等层的Win32 API创建git客户端,因此出现了busybox版本。 但是,根据他们自己的评论,mingit-busybox仍然包含许多错误。 您可以在故障单中详细了解这些工作。
确保gpg-agent正在运行( gpg-connect-agent /bye
)并检查与github的连接:
plink git@github.com
Git设置
这里没什么异常。 我认为命令可以不加注释地给出:
git config --global user.name "Hello Habr" git config --global user.email fake@email.com git config --global user.signingKey 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 git config --global gpg.program /usr/bin/gpg git config --global commit.gpgSign true
如果gpg不在PATH
中, gpg.program
需要gpg.program
项。
密钥备份
密钥应与密码短语一样安全地存储在计算机外部。 您可以简单地打印一长串数字,但可以识别它或从键盘输入-这不适合胆小的人。 因此,我更喜欢生成易于在任何智能手机上扫描的QR码。 qrencode
有一个特殊的qrencode
程序。 QR码图像生成如下:
gpg --export-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 | qrencode --8bit --output secret-key.qr.png
当然,备份中不必要的信息越少越好。 此处,非常小的密钥大小是ed25519。 感谢Daniel Bernstein!
有一个特殊的paperkey实用程序,可让您将数据量减少到极限。 减少的代价是,只有在存在公共密钥的情况下,才能还原来自此类备份的密钥。 GPG生态系统具有用于存储公共密钥的特殊服务器;您不仅可以在https://eax.me/gpg/中阅读有关公共密钥的信息。
纸密钥备份的创建过程如下:
gpg --export-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 > pubkey.asc gpg --export-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7 | paperkey --output-type raw | qrencode --8bit --output secret-key.qr.png
备份的第二条规则:在确认能够从备份中还原数据之前,备份不存在。 因此,我们进行了压力测试。 使用命令删除密钥
gpg --delete-secret-key 0609C9DFEF1AA2B38DEDBADCC0544B5554068AC7
然后,我们扫描QR码并将密钥导入回GPG。 作为Android的QR码扫描仪,我喜欢BinaryEye ,它是一个具有用户友好界面的免费程序。 在下面的图片中-本文中密钥的备份。
paperkey --pubring pubkey.asc --secrets from_qr.asc > secretkey.asc gpg --import ./secretkey.asc
希望您不会在任何地方使用此密钥。 它仅出于说明目的而创建。
如果一切正常,那么您可以继续。
使用(通过)通行证
现在我们有了一个安全存储和安全的私钥,并且可以与git集成,我们可以开始使用密码本身了。 我更喜欢gopass,因为这种替代绑定在Windows下有效。
使用命令初始化密码存储
gopass init
然后从列表中选择所需的密钥。
使用git的方式与使用常规存储库的方式相同,仅命令行需要添加(go)pass
。 我们初始化存储库并在其中添加所需的来源:
gopass git init gopass git remote add origin git@github.com:xxx/taisho-secrets.git
通过单击“ Clone or download
按钮,可以在github上的存储库页面上找到该地址。
Gopass有特定的命令
gopass sync
同时执行git pull
和git push
,即完全同步。
默认存储是在~/.password-store
文件夹中创建的,但是您也可以指定自己的路径。
要使用密码,控制台支持ls,cp,mv,search,create等命令。 您可以通过键入gopass --help
来获得完整列表,但是我个人不使用控制台,而是使用浏览器插件的时间为95%。
浏览器整合
该浏览器插件称为gopass bridge ,可以在Chrome和Firefox商店中找到(请参阅链接)。
要将插件与gopass本身连接,您将需要一个辅助脚本和清单用于本机消息传递。 它们是由团队创建的。
gopass jsonapi configure
这将使我们能够选择浏览器和脚本的位置。
检查一切。 创建一个新密码:
gopass new habr
我们回答所有问题并保存。 GPG将提示您输入用于使用私钥的主密码。
现在,我们打开带有特色蓝色地鼠的插件菜单,如果一切顺利,我们可以在此处找到密码。
TOTP键
我个人使用FreeOTP ,但是,您可以通过pass使用这些密钥。 原始通行证的用户需要安装pass-otp扩展 ,并且在gopass和APS(请参见下文)中开箱即用了必需的功能。
要使用pass-otp将TOTP密钥添加到密码存储中,我们获取URL(以otpauth://
开头)并输入命令
pass otp insert totp-secret
产生的身份验证是否可以称为两因素是有争议的。 KeePassXC开发人员建议将TOTP密钥存储在受不同密码保护的单独数据库中。 顺便说一句,这也可以做到。
Android整合
Android的GnuPG的实现称为OpenKeychain 。 要对其进行配置,只需转到“密钥管理”菜单并导入先前创建的密钥。 就我个人而言,OpenKeychain的唯一缺点是没有指纹解锁。
Android的pass实现称为android-password-store或简称为APS。
安装并运行APS。 在同步密码存储之前,请转到“设置”菜单。 在那里,我们将需要以下物品:
git
。 生成的URL应与github上存储库页面上指定的URL相同。 授权类型OpenKeychain
。Git utils
。 在本部分中,通过gpg键指定用户名和电子邮件。OpenPGP
。 选择OpenKeychain
。
最新出现的功能包括在Android 8.0+上的应用程序中填写密码。
要注意华为智能手机的用户以及其他所有人: F-Droid中提供了OpenKeychain,APS,BinaryEye,FreeOTP,以及Syncthing,Telegram,Tachiyomi,KDE Connect等。 Google Play用户应对此表示赞赏:该软件目录中没有广告,rootkit或仅出自著名的tonsky文章的垃圾软件。
在APS中自动完成之前,我使用过keepass2android 。 出于原始原因,它不在F-Droid中:它是用Xamarin编写的,但是F-Droid维护人员已经有9个月无法在其构建服务器上安装此框架了。 有人做某事。
现在可以克隆了。 在主屏幕上,选择“从服务器克隆”,指定存储库的所需位置,检查git设置。
如果尝试使用git导致错误(这可能是在APS的早期版本中,由于使用了Eclipse项目中的jgit
库的过时版本),那么仍然存在Syncthing。
结论
当然,通过并不是那么容易配置。 但是,以这个价格,您可以放心,我们使用的工具(以及Linus Torvalds或Edward Snowden之类的人)将不会在某一时刻被弃用,不会更改数据格式,并且不会没有支持。 而且如果这样做的话,pass的简单模块化体系结构鼓励创建任何其他客户端和扩展。
如果您决定不使用pass,那么我希望本文中提到的某些程序将对您自己有用。