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 次下载

MITGPL-3.0-only

31KB
445

隐藏在明眼之下

crates.io

hips 是一个小巧、独立的实用程序,允许用户在代码中加密存储他们的秘密。它可以作为一个二进制文件或库使用,具体取决于您的需求。您想知道些什么?

  1. 为什么要这样做?
  2. 让我们试试看
  3. 教程
  4. 这甚至安全吗

哲学

+代码=秘密

对于所有那些小商店,低调的目标,涉及到的个人开发者数量有限,我们建议在文件或文件夹数据库中与您的代码一起跟踪您的秘密。

这将减少分布式系统中的真理来源,有助于“基础设施即代码”,将访问秘密变为本地事务。您将不必依赖任何远程基础设施来管理您的秘密。

如果以下情况不适用于您,此解决方案将不起作用:

  • 有众多开发者(主密码策略扩展性不好)
  • 高规模/复杂基础设施(需要作为服务的秘密)
  • 高知名度商店(合规原因、需要保险)

在这个数据库中,您可以存储您的 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

安全性

此项目使用 ringpbkdf2 函数从密码及其 aes256 实现中派生适当的密钥来加密/解密密钥。至少在理论上,这些加密算法不应是暴力可破解的。您可以在这里找到 Cure53 对 ring 库的审计。

话虽如此,仍然重要的是要保护加密后的密钥不被公开。如果您将与代码一起存储密钥,那么这个责任就落在您的代码提供者(例如 GitHub)身上。

最后,考虑以下三个特性

  • 您的个人资料(低调目标,高调?)
  • 您的威胁模型(您接受信任谁?)
  • 您的合规性要求(您是否有 PII 数据?)

在决定密钥管理解决方案之前,您需要考虑所有这些问题(更多)。建议您咨询安全工程师。

依赖关系

~10–18MB
~342K SLoC