10 个版本
0.4.0 | 2020 年 5 月 4 日 |
---|---|
0.3.2 | 2020 年 1 月 25 日 |
0.3.1 | 2019 年 6 月 12 日 |
0.2.1 | 2019 年 4 月 16 日 |
0.1.3 | 2019 年 3 月 30 日 |
#629 在 身份验证
每月 26 下载
125KB
3K SLoC
knox
通过 GPG 加密并具有 TOTP 功能的结构化密钥管理器。
在达到 1.0.0 之前,存储格式可能会发生破坏性更改。
摘要
架构
密钥库由一个根目录下的 _vault.meta 文件组成,其中包含用于加密数据的 GPG 身份以及索引,将虚拟密钥路径映射到文件系统文件。密钥库中的所有文件系统路径相对于此元数据文件。
当创建一个具有虚拟路径 one/two/three 的密钥时,会生成一个随机 UUID,例如,2aef7bc6-856c-492d-aaee-07e0f2579812,密钥的属性将存储在名为 2a/2aef7bc6-856c-492d-aaee-07e0f2579812 的文件中。
虚拟路径与文件系统路径之间的映射保存在元数据文件中,允许根据熟悉用户定义的路径检索数据。因此,元数据文件对于使用密钥库至关重要,应与数据一起备份。密钥文件仍然可以手动解密和读取,但您将失去通过虚拟路径引用它们的能力。
由于文件系统路径是随机的,并且密钥和元数据文件都使用您的 GPG 公钥加密,因此文件系统不会提供有关密钥库内部存储内容的任何信息。
所有文件都使用 Protocol Buffers 打包并通过 gpg-agent 加密,生成加密的密文。
当初始化密钥库时,在其目录中创建一个本地 Git 仓库,以记录所有操作。
Crates
此项目由两个不同的 Crates 组成
- libknox:一个包含管理密钥库所有逻辑的库。您可以使用此 API 来开发自己的密钥库界面。
- knox:一个使用上述库的二元文件,提供对密钥库的 CLI 界面。
安装
Knox可以通过cargo
进行安装。
$ cargo install knox
作为一个库,您可以将此段落添加到您的Cargo.yaml
中。
[dependencies]
libknox = "^0.3"
创建密钥库
以下命令创建一个空的安全库,并使用该库的GPG身份进行加密。
$ knox init [email protected]
INFO libknox::commands::init > vault initialized successfully
INFO knox::commands::init > local git repository initialized
默认情况下,安全库将创建在$HOME/.knox
。您可以通过设置环境变量KNOX_PATH
来更改此路径。
在您的安全库目录中也会创建一个本地Git仓库(有关更多信息,请参阅Git集成)。可以通过将--no-git
传递给init
来禁用此行为。
添加密钥
$ knox add dir/subdir/website.com username=apognu password=Str0ngP@ss
INFO libknox::commands::write > entry personal/website was successfully added to the vault
vault
对属性不敏感,没有对例如password
属性的特殊处理。您可以为条目添加任意数量的属性。
机密属性
一种特殊的属性类型是机密属性。它们的不同之处在于默认情况下不会打印到控制台,并且是交互式输入的。任何没有设置值的属性都会触发提示,并且在没有使用-p
选项的情况下永远不会打印。
$ knox add website.com username=apognu password=
Enter value for 'password':
INFO libknox::commands::write > entry personal/website was successfully added to the vault
生成密码
可以使用属性语法attr=-
生成随机字母数字密码。默认情况下,将为该属性生成一个随机的16位密码。生成的属性将自动设置为机密。
--symbols
选项将特殊字符添加到混合中。
$ knox add personal/website username=apognu password=-
可以使用-l
/ --length
选项生成不同大小的密码。
文件属性
可以使用语法attr=@/path/to/file
将整个文件嵌入到属性中。文件属性永远不会打印到控制台,并且需要使用-w
才能使用。
$ knox add personal/ssh pubkey=@/home/apognu/.ssh/id_rsa.pub privkey=@/home/apognu/.ssh/id_rsa
INFO libknox::commands::write > entry personal/ssh was successfully added to the vault
$ knox show personal/ssh
🔒 Knox » ssh » keys
privkey = <file content>
pubkey = <file content>
列出密钥
$ knox list
🔒 Knox
» one
» two
/ subdir1
/ subdir2
» secret1
» secret2
» secret3
» secret4
$ knox list subdir1/subdir2
🔒 Knox
/ subdir1
/ subdir2
» secret1
» secret2
» secret3
» secret4
您可以过滤要列出密钥的名称前缀,例如,vault list subdir1/subdir2
。
搜索密钥
您可以搜索匹配子字符串的密钥
$ knox search social
🔒 Knox (search for social):
» personal/social/facebook
» personal/social/twitter
» personal/social/linkedin
打印密钥
$ knox show dir/subdir/website.com
🔒 Knox / dir / subdir / website.com
password = <redacted>
username = apognu
url = http://example.com/login
可以使用-
选项显示已编辑的属性。
可以使用-
选项将一个属性复制到剪贴板。默认情况下,将复制名为password
的属性。如果您想复制另一个属性到剪贴板,请使用-
选项。
当您将-
选项与显示包含文件属性的密钥结合使用时,该密钥的所有文件属性都将写入以密钥路径命名的目录中的文件。
$ knox show my/secret/file
🔒 Knox » my » secret » file
file = <file content>
$ knox show -w my/secret/file
默认情况下,所有文件属性都写入匹配的文件。如果您想限制要写入哪些属性,请使用-
选项。
$ knox show -w -a file1 -a file2 my/secret/files
对于文件属性,-
(对于--stdout
)也可以用来将单个属性的内容打印到标准输出。
$ knox show -w -a privkey -s sshkeys/corporate | ssh-add -
编辑密钥
修改现有密钥的语法与创建密钥时使用的语法完全相同,只是增加了一个可选的属性列表,用于删除。
$ knox edit website.com -d url username=newlogin password=
INFO libknox::commands::write > entry website.com was successfully edited
此命令将从密钥中删除 url
属性,将 username
属性更改为 newlogin
,并提示输入被删除属性的值 password
重命名密钥
可以通过 rename
命令来重命名密钥
$ knox rename my/first/secret new/location/secret
INFO libknox::commands::write > entry my/first/secret was successfully renamed to new/location/secret
删除密钥
$ knox delete dir/subdir/website.com
INFO libknox::commands::delete > entry 'dir/subdir/website.com' was successfully deleted from the vault
检查是否被黑
Vault 集成了 Troy Hunt 的 Have I Been Pwned,以检查您的某些密码是否出现在已知的数据泄露中。目前,您可以手动检查每个机密属性是否为特定条目
$ knox pwned my/super/password
INFO libknox::commands::pwned > Pwnage status for attributes at pwned/test
:: PWNED my/super/password:password
:: PWNED my/super/password:secure
:: PWNED my/super/password:apikey
在添加或编辑条目时,也会对机密属性进行检查。您可以通过在这些命令中使用 -f
/ --force
标志来跳过此行为。
您也可以省略 PATH
参数以启动针对数据泄露的全局检查。这可能需要一些时间,但会检查您保险库中的所有机密属性
$ knox pwned
INFO libknox::commands::pwned > checking for pwned secret across your vault
:: PWNED test/insecure/test1:password
:: PWNED test/insecure/test1:apikey
:: PWNED test/insecure/test2:password
█████████████████████████████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░ 53/70
[...]
INFO knox::commands::pwned > 5 secrets were found in HIBP's database
管理身份
当您初始化保险库时,它被设置为用于一个特定的 GPG 身份。您可以在保险库中添加和删除任何 GPG 身份,以便其他人可以访问它。
警告:请根据您的威胁模型检查此操作是否适合您。当有人获得一个用他们的 GPG 公钥加密的保险库副本时,无法回溯,他们将能够永久解密该特定保险库快照的内容。
如果您使用的是多身份保险库,单个私钥足以解密保险库,但需要 所有 公钥才能写入。
当您向保险库添加或删除身份时,所有条目(包括元数据)都将使用新的一组公钥(作为 GPG 接收者)重新加密。这可能需要一些时间,具体取决于您的保险库大小。
$ knox init [email protected]
INFO libknox::commands::init > vault initialized successfully at /vault
[...]
$ knox identities add [email protected]
INFO libknox::commands::identities > Writing metadata file...
:: re-encrypting entry company/secret1
:: re-encrypting entry personal/secret2
:: re-encrypting entry company/secret2
:: re-encrypting entry personal/secret1
:: re-encrypting entry personal/secret3
$ knox identities delete [email protected]
配置 TOTP
您的保险库中的每个条目都可以存储一个用于生成 TOTP 代码的 TOTP 配置。首先,配置 TOTP 参数(除了密钥作为 base32 字符串外,所有参数都是可选的)
$ knox totp configure secure/website --secret abcdefghijklmnop --interval 30 --length 6 --hash sha1
INFO knox::commands::totp > the TOTP configuration for secure/website has been saved successfully
TOTP 将作为条目上的虚拟红字属性出现,并且还会使用特定命令打印出来
$ knox show -p secure/website
🔒 Knox / secure / website
username = apognu
password = password
@totp = 123456 (expires in 22s)
$ know totp show secure/website
🔒 Knox / secure / website
TODO = 123456 (expires in 13s)
您可以通过命令 knox totp inspect
检查现有的 TOTP 配置,它将打印出来。
Git 集成
每次您编辑保险库时,无论是添加、编辑或删除密钥,还是更改身份,都会在您的保险库目录中创建一个 git 提交。您的密钥的任何识别信息 永远不会存储在提交信息中,这样就不会泄露任何有关您在保险库中存储的内容的见解。
如果您愿意,可以手动设置远程并推送您的仓库
$ knox git remote [email protected]:passwords.git
INFO knox::commands::git > git remote URL set to '[email protected]:passwords.git'
$ knox git push
INFO knox::commands::git > vault modifications successfully pushed upstream
目前,唯一支持的认证方法是使用由 ssh-agent
提供的 SSH 密钥。
作为库
examples
目录包含一个示例,展示如何使用 libknox
来操作保险库。您可以通过以下方式运行示例
$ cargo run --example simple
依赖项
~31–43MB
~809K SLoC