9 个版本
0.4.2 | 2022 年 8 月 29 日 |
---|---|
0.4.1 | 2022 年 8 月 28 日 |
0.4.0 | 2021 年 9 月 8 日 |
0.3.4 | 2020 年 7 月 1 日 |
0.2.0 | 2020 年 5 月 31 日 |
#1304 in 密码学
每月 22 次下载
31KB
445 行
隐藏在明眼之下
hips
是一个小巧、独立的实用程序,允许用户在代码中加密存储他们的秘密。它可以作为一个二进制文件或库使用,具体取决于您的需求。您想知道些什么?
哲学
我+代码=秘密
对于所有那些小商店,低调的目标,涉及到的个人开发者数量有限,我们建议在文件或文件夹数据库中与您的代码一起跟踪您的秘密。
这将减少分布式系统中的真理来源,有助于“基础设施即代码”,将访问秘密变为本地事务。您将不必依赖任何远程基础设施来管理您的秘密。
如果以下情况不适用于您,此解决方案将不起作用:
- 有众多开发者(主密码策略扩展性不好)
- 高规模/复杂基础设施(需要作为服务的秘密)
- 高知名度商店(合规原因、需要保险)
在这个数据库中,您可以存储您的 AWS 凭证或用于连接生产环境的 ssh 密钥。您可以存储您的服务层需要的秘密,并使用像 ansible 或 ssh 这样的工具将它们推送出去。
安装
您需要 cargo 来安装 hips
。一旦您有了它,请按照以下步骤操作:
export PATH=$PATH:$HOME/.cargo/bin
cargo install hips
hips --help
教程
在本教程中,您将了解 hips
支持的所有不同命令和数据库格式。
数据库和密码配置
我们使用环境变量将数据库和密码传递给 hips
$ export HIPS_DATABASE=secrets.yaml
$ export HIPS_PASSWORD=pw
存储、加载、列出、删除、重命名
store
接收一个名称和一个秘密,并将它们存储在数据库中。
$ hips store aws_access_key_id BUIO1IXUAK3OQ9ACAHSX
$ hips store aws_secret_access_key UwioixhaklufhhWbaXoSLwbxb2dj7/AJs92bdsXh
$ cat secrets.yaml
---
- name: aws_access_key_id
secret: c58C04qkTDQhg86piVlmg7EXcz66i3C3GSdHjmZW5v2Pa6Froo69gbuDNSICXh4w
salt: OH3/mX3e/3ODwSLBYzFiK92PztSgLLmIf5S8mqenwXo=
- name: aws_secret_access_key
secret: asrhBl8bMTPGj8Cua6LzyseRBLmhmNrivaCjW53NcNRUyKSYOkoLdq9PHSPHKdgosO6/acOn3hv+vnkciwLj0tio0ac=
salt: 4GP2GtoRhaf6NKtanBm9aLjUefuNH+otFDFfHF1Utns=%
load
接收一个名称,并打印出匹配的秘密。
$ hips load aws_access_key_id
BUIO1IXUAK3OQ9ACAHSX
$ hips load aws_secret_access_key
UwioixhaklufhhWbaXoSLwbxb2dj7/AJs92bdsXh
list
打印出按字母顺序排序的 db 中存储的秘密的名称。
$ hips ls
aws_access_key_id
aws_secret_access_key
remove
(rm
) 接收一个名称,从数据库中删除该密钥。
$ hips store remove_me_soon unimportant-secret
$ hips ls
aws_access_key_id
aws_secret_access_key
remove_me_soon
$ hips remove remove_me_soon
$ hips ls
aws_access_key_id
aws_secret_access_key
rename
根据 (原名称, 目标名称) 名称对重命名密钥。
$ hips store move_me_please unimportant-secret
$ hips ls
aws_access_key_id
aws_secret_access_key
move_me_please
$ hips rename move_me_please thats_better
$ hips ls
aws_access_key_id
aws_secret_access_key
thats_better
旋转
您可以通过一个命令旋转密钥数据库,使用不同的密码重新加密所有内容。
$ cat secrets.yaml | grep secret:
secret: c58C04qkTDQhg86piVlmg7EXcz66i3C3GSdHjmZW5v2Pa6Froo69gbuDNSICXh4w
secret: asrhBl8bMTPGj8Cua6LzyseRBLmhmNrivaCjW53NcNRUyKSYOkoLdq9PHSPHKdgosO6/acOn3hv+vnkciwLj0tio0ac=
$ hips rotate new-pw
$ cat secrets.yaml | grep secret:
secret: Sb8BznQqjYr+q+lis2uVKPZ/j+qmNIMuXbjr/MElIAYkupyUCGHPbY+N/NTpTxKr
secret: FlWQvkzidFa8mStgoEbQXt4MobHPQFT7NFnImKIjgfNZ7xFhPGjj3kD0z3x4YNzLTjBMJykk57JooYCojhOH/GlqeEk=
$ export HIPS_PASSWORD=new-pw
$ hips load aws_access_key_id
BUIO1IXUAK3OQ9ACAHSX
您可以看到,加密后的密钥和盐与之前的 secrets.yaml
数据库不同。我们现在可以使用新密码读取所有密钥。
模板
很多时候,当将密钥导出到生产环境中时,它们需要以特定的方式显示,作为配置文件的一部分等。为此,我们使用 tiny template 库。更多信息请参见他们的语法页面。我们将通过以下两个示例介绍我们的模板功能。
AWS 凭据文件
让我们生成 .aws/credentials
,这是亚马逊密钥的传统存储位置。我们将使用模板框架的 "map" 功能,该功能允许我们按名称打印特定的密钥。
$ hips template '[default]\naws_access_key_id={map.aws_access_key_id}\naws_secret_access_key={map.aws_secret_access_key}'
[default]
aws_access_key_id=BUIO1IXUAK3OQ9ACAHSX
aws_secret_access_key=UwioixhaklufhhWbaXoSLwbxb2dj7/AJs92bdsXh
加载所有密钥的 shell 脚本
这次,由于我们的模板比较复杂,我们将它存储在一个文件中
$ cat shell-template
#!/bin/sh
{{ for secret in list -}}
{{- if not @first }}\n{{ endif -}}
export {secret.name|capitalize}={secret.secret};
{{- endfor -}}
您可以在这里找到有关此语法的更多信息。这将产生以下 shell 脚本
$ hips template shell-template
#!/bin/sh
export AWS_ACCESS_KEY_ID=BUIO1IXUAK3OQ9ACAHSX;
export AWS_SECRET_ACCESS_KEY=UwioixhaklufhhWbaXoSLwbxb2dj7/AJs92bdsXh;
数据库格式
到目前为止,我们一直使用 YAML 文件作为数据库。但我们支持多种格式。
- 作为目录层次结构(无扩展名)
- 作为单个 YAML 文件(
.yaml
扩展名)
如果我们重复上述实验,使用 secrets/
下的目录层次结构,我们的数据库将如下所示
$ tree secrets/
secrets
├── aws_access_key_id/
│ ├── salt
│ └── secret
└── aws_secret_access_key/
├── salt
└── secret
$ cat secrets/aws_access_key_id/secret
Sb8BznQqjYr+q+lis2uVKPZ/j+qmNIMuXbjr/MElIAYkupyUCGHPbY+N/NTpTxKr
安全性
此项目使用 ring 的 pbkdf2
函数从密码及其 aes256
实现中派生适当的密钥来加密/解密密钥。至少在理论上,这些加密算法不应是暴力可破解的。您可以在这里找到 Cure53 对 ring 库的审计。
话虽如此,仍然重要的是要保护加密后的密钥不被公开。如果您将与代码一起存储密钥,那么这个责任就落在您的代码提供者(例如 GitHub)身上。
最后,考虑以下三个特性
- 您的个人资料(低调目标,高调?)
- 您的威胁模型(您接受信任谁?)
- 您的合规性要求(您是否有 PII 数据?)
在决定密钥管理解决方案之前,您需要考虑所有这些问题(更多)。建议您咨询安全工程师。
依赖关系
~10–18MB
~342K SLoC