AWS 和 GCP 的密钥管理器
项目描述
谨慎地
AWS 和 GCP 的密钥管理器
$ discreetly set acme/github/api-token my-secret-api-key
$ discreetly get acme/github/api-token
my-secret-api-key
$ discreetly --profile prod list acme/
['acme/prod/postgres/passwd', 'acme/prod/github/api-token']
应用程序通常需要访问机密信息,例如数据库密码或 API 密钥。管理这些秘密的一个非常糟糕的方法是将它们烘焙到您的代码中,然后将它们检查到源代码控制中。将秘密存储在环境变量中会更好一些。如果您的应用程序在 AWS 或 GCP 上运行,这两个平台都提供了用于更好地管理机密的工具。
discreetly为跨 AWS 和 GCP 管理机密提供一致的 API。它鼓励您对秘密和加密密钥进行分区,以便您的 Web 应用程序只能访问其运行所需的秘密,而不是例如访问基础设施管理工具所需的基础设施秘密。
安装
discreetly不会为您设置任何基础设施。您至少需要拥有 i) 可用于通过 AWS 和/或 Google 进行身份验证的凭证,ii) 使用 KMS 加密和解密机密的权限,以及 iii) 读取/写入底层存储的权限。
要安装discreetly支持 AWS 和 GCP 的 cli:
$ pip install discreetly[cli]
要用作库,请安装discreetly指定您需要支持的后端,例如:
$ pip install discreetly[aws,gcp]
配置
discreetly可以使用 JSON 文件进行配置,例如:
{
"acme": {
"type": "aws"
},
"default": {
"type": "gcp",
"datastore_project": "acme-corp",
"keyid": "projects/acme-corp-kms/locations/global/keyRings/discreetly/cryptoKeys/default"
}
}
在上面的示例中,配置包含两个配置文件,“acme”和“default”。配置文件必须指定type“aws”或“gcp”。
因为配置文件可以指定 a keyid,所以您不仅可以为不同的云提供商命名配置文件,还可以为不同的 KMS 密钥命名配置文件,例如一个用于开发,另一个用于生产。
discreetly将在环境变量提供的位置搜索配置文件DISCREETLY_CONFIG_FILE,回退到discreetly.json当前目录中命名的文件。
常见问题 (FAQ)
-
credstash/Chamber/Vault/等呢?
discreetly实际上是受到 credstash 的启发。但是,credstash 仅支持 AWS,并且早于 Parameter Store。也就是说,有些用例可能首选 DynamoDB 后端(例如,大于 4096 个字符的参数)。Chamber 是绝佳的选择,尤其是在 Go 环境中或仅需要 AWS 支持的情况下。
如果您有资源支持 Vault,它就很棒。
故障排除
大多数问题与您的云提供商的身份验证或权限有关。
使用discreetlycli,您还可以通过设置LOGLEVEL环境变量来更改日志记录级别,例如
$ LOGLEVEL=DEBUG discreetly get my/super/secret
AWS
如果您安装了 AWS CLI,请确认您可以使用它来访问 Parameter Store,例如:
$ aws ssm get-parameter /path/to/parameter --with-decryption
如果可行,那么问题很可能就在于此discreetly,您应该考虑打开一个问题。
但是,如果这不起作用,则可能是配置或身份验证问题。在引擎盖下,discreetly使用 Boto 3,因此请查阅他们关于设置身份验证凭据的文档。
GCP
不幸的是,gcloud不支持大部分 Datastore API,因此在本地环境中对任何问题进行健全性测试有点困难。
确认您已按照手动获取和提供服务帐户凭据中的步骤进行操作,尤其是:
- 创建服务帐号
- 在本地保存服务帐号的 JSON 文件
- 在环境变量中设置 JSON 文件的路径,
GOOGLE_APPLICATION_CREDENTIALS
图书馆使用
$ pip install discreetly[aws,gcp]
import discreetly
cfg = {
"default": {
"type": "gcp",
"datastore_project": "acme-corp",
"keyid": "projects/acme-corp-kms/locations/global/keyRings/discreetly/cryptoKeys/default"
},
"acme-aws": {
"type": "aws",
"keyid: "alias/discreetly_key",
}
}
d = discreetly.Session.create(cfg) # uses the 'default' profile
d.set('my-service/my-key', 'my_value')
d.get('my-service/my_key')
acme = discreetly.session.create(config=cfg, profile='acme-aws') # uses the 'acme-aws' profile
acme.set('acme/dev/postgres/password', 'open-sesame')
acme.get('acme/dev/postgres/password')
acme.set('acme/prod/postgres/password', 'super-secret', keyid='alias/prod_key')
acme.get('acme/prod/postgres/password') # no need to specify the keyid for get
发展
discreetly用 Python 编写,支持 Python 2.7 和 3.6+
克隆 repo 后,运行pip install -r requirements.txt安装所需的开发依赖项(例如 pytest、flake8 等)
您可以 runpytest在本地运行单元测试,也tox可以在 Python 2.7 和 3.x 下运行所有测试。
注意从版本0.2.0开始,discreetly只支持 Python 3.6+
发布
-
CHANGELOG.md在新的发布分支中查看和更新-
以下将显示自最后一个以“v”开头的标签以来的提交:
$ git log $(git describe --tags --match "v*" --abbrev=0)..HEAD`
-
替换
[Unreleased]为新的semver和发布日期,例如[0.1.2] - 2019-12-13 -
[Unreleased]在刚刚创建的新版本之上添加一个新的占位符
-
-
创建一个新的 PR
-
下面列出了自最后一个标签以来的所有提交,这对于包含在 PR 描述中可能很有用:
git log --pretty=format:"* %h %s" $(git describe --tags --abbrev=0 @^)..@
-
-
一旦 PR 合并到 master 并通过所有状态检查,创建并推送一个新的签名、注释标签,例如:
$ LAST_VERSION=$(git describe --tags --match "v*" --abbrev=0) $ VERSION=v0.1.1 $ awk "/^## \[${VERSION}/{flag=1;}/## \[${LAST_VERSION}/{flag=0} flag" CHANGELOG.md | git tag -s -a ${VERSION} --cleanup=whitespace -F - $ git push --follow-tags
上面的
awk命令获取 CHANGELOG 的内容,$VERSION以作为带注释的 git 标签的消息。它对 CHANGELOG 格式的假设相当脆弱。所以你可能只运行 awk 命令:awk "/^## \[${VERSION}/{flag=1;}/## \[${LAST_VERSION}/{flag=0} flag" CHANGELOG.md作为创建和推送标签之前的健全性检查。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。