1 个稳定版本
1.4.0 | 2024年5月19日 |
---|
#21 在 #secret-key
每月下载量71次
44KB
493 行
✅ 自动化您的密钥和秘密验证工作流程
🤠 支持30多个不同的提供商
🤖 导出为 JSON,通过 CSV 进行审计
🔑 Keyscope
Keyscope 是一个用 Rust 编写的密钥和秘密工作流程(验证、失效等)工具,由 service_policy_kit
驱动。
当前支持的工作流程
- 验证
🦀 为什么选择 Rust?
- 使用 Rust,"如果它能编译,它就能运行。" 此外,它还可以编译到许多平台。
- Rust 是 快速 的,没有 VM,也没有不必要的冗余(通常 5-8mb 的二进制文件,包含大量的代码和库)。
- 多功能、安全且通用——使代码健壮且易于表达 关键任务代码。添加代码或抽象不会增加冗余,不会损害性能,也不会以极端的方式增加错误的机会(边缘情况更少)。
- 出色的包管理器:
Cargo
。高效安装和运行任务和示例。 - Rust 正在安全社区中占据头条,成为安全工具的首选语言。同样有趣的是攻击性安全 + Rust 这里 和 这里。
🚀 快速入门
从 发布 中获取版本,或者通过 Homebrew 安装
brew tap spectralops/tap && brew install keyscope
使用 keyscope
您可以尝试验证某个提供商的密钥,例如 Github(假设密钥在 GITHUB_TOKEN
环境变量中)
$ keyscope validate github $GITHUB_TOKEN
运行以下命令以查看支持的其他提供商
$ keyscope validate --list
.
:
.
twilio:validation
keyscope validate twilio -p twilio_1 twilio_2
twitter:validation
keyscope validate twitter -p twitter_1
zendesk:validation
keyscope validate zendesk -p zendesk_1 zendesk_2
Total 44 providers available.
$
运行以下命令(例如 stripe
)以查看特定提供商所需的参数
$ keyscope validate stripe --requirements
provider stripe requires:
- param: p1
desc: stripe key
$
最后,validate
命令的一般结构如下
$ keyscope validate PROVIDER -p PARAM1 PARAM2 .. PARAM_N
✅ 验证:密钥应该是活动的
您可以通过以下方式验证特定提供商
$ keyscope validate twilio -p $TWILIO_KEY
使用以下通用模式
$ keyscope validate PROVIDER -p PARAM1 PARAM2 ...
密钥/参数的数量将根据身份验证类型而变化
Bearer
- 通常只有一个密钥(令牌)Basic Auth
- 通常有两个密钥:用户名,密码OAuth
- 通常有两个密钥:客户端 ID,客户端密钥- 以及其他。
Keyscope中的每个提供者都会使用requirements
来告诉您它们的需求。
$ keyscope validate twilio --requirements
您将获得一份报告。
$ keyscope --verbose validate stripe -p $STRIPE_KEY
✔ stripe:validation: ok 766ms
Ran 1 interactions with 1 checks in 766ms
Success: 1
Failure: 0
Error: 0
Skipped: 0
以及一个表示成功/失败的可执行退出代码。
您可以使用--verbose
标志来查看API响应。
$ keyscope --verbose validate stripe -p $STRIPE_KEY
✗ stripe:validation: failed 413ms
status_code: 200 != 401 Unauthorized
Ran 1 interactions with 1 checks in 413ms
Success: 0
Failure: 1
Error: 0
Skipped: 0
在这种情况下,退出代码是1
(失败)。
❌ 验证:密钥应不活跃
当您正在验证应不活跃的密钥时,可以使用flip
标志。在这种模式下,失败的API访问是一个好事,退出代码将反映这一点。
$ keyscope --flip validate stripe -p $STRIPE_KEY
✔ stripe:validation: ok 766ms
Ran 1 interactions with 1 checks in 766ms
在这种情况下,密钥是活跃的——这对我们来说很不好。使用--flip
,退出代码将是1
(失败)。
🏃 设置验证作业
审计活跃密钥
您可以通过从专门的CSV文件读取所有参数来设置CI作业(或其他您喜欢的预定作业)以执行审计,如下所示
$ keyscope validate --csv-in report.csv
您需要准备的CSV格式应包括一个标题行,并看起来像这样
provider,key1,key2,key3
twilio,tw-key1,,,
您可以指定任意数量的密钥列,只要为没有这么多密钥的提供者提供一个空值,并且所有行包含相同数量的单元格。
审计不活跃密钥
如果您有从您的保险库中导出的过时密钥的快照,这些密钥已经过期并且应该已经轮换,您想测试它们是否全部过时。
$ keyscope --flip validate --csv-in my-key-audit.csv
🔗 支持的提供者
我们一直在添加新的提供者,保留此列表的链接或关注此存储库以获取更新。
我们使用我们的service_policy_kit
库来指定与服务和其策略的交互,如果您发现一个不在此列表中的服务,请随时打开一个问题或贡献回来。
测试器 |
验证 |
|
| ||
infura |
验证 |
|
| ||
covalenthq |
验证 |
|
| ||
asana |
验证 |
|
| ||
bitly |
验证 |
|
| ||
ipstack |
验证 |
|
| ||
localytics |
验证 |
|
| ||
algolia |
验证 |
|
| ||
branchio |
验证 |
|
| ||
browserstack |
验证 |
|
| ||
buildkite |
验证 |
|
| ||
datadog |
验证 |
|
| ||
github |
验证 |
|
| ||
github-ent |
验证 |
|
| ||
dropbox |
验证 |
|
| ||
gitlab |
验证 |
|
| ||
heroku |
验证 |
|
| ||
mailchimp |
验证 |
|
| ||
mailgun |
验证 |
|
| ||
pagerduty |
验证 |
|
| ||
circleci |
验证 |
|
| ||
facebook-access-token |
验证 |
|
| ||
salesforce |
验证 |
|
| ||
jumpcloud |
验证 |
|
| ||
saucelabs-us |
验证 |
|
| ||
saucelabs-eu |
验证 |
|
| ||
sendgrid |
验证 |
|
| ||
slack |
验证 |
|
| ||
slack-webhook |
验证 |
|
| ||
stripe |
验证 |
|
| ||
travisci |
验证 |
|
| ||
twilio |
验证 |
|
| ||
twitter |
验证 |
|
| ||
zendesk |
验证 |
|
| ||
firebase |
验证 |
|
| ||
aws |
验证 |
|
| ||
elastic-apm-secret |
验证 |
|
| ||
artifactory |
验证 |
|
| ||
ibm-cos |
验证 |
|
| ||
ibm-iam |
验证 |
|
| ||
ibm-cloudant |
验证 |
|
| ||
softlayer |
验证 |
|
| ||
square |
验证 |
|
| ||
telegram-bot |
验证 |
|
| ||
bingmaps |
验证 |
|
| ||
buttercms |
验证 |
|
| ||
wakatime |
验证 |
|
| ||
calendly |
验证 |
|
| ||
shodan |
验证 |
|
| ||
opsgenie |
验证 |
|
| ||
pendo |
验证 |
|
| ||
hubspot |
验证 |
|
| ||
lokalise |
验证 |
|
|
🍰 添加您自己的提供者
您可以指定自定义定义文件(在此处是一个示例)
$ keyscope -f your-definitions.yaml validate --list
适用于添加您自己的内部服务、密钥发行策略和基础设施。
您还可以使用自定义定义来测试您希望贡献给keyscope的新提供者 😄
定义的基本知识
所有定义都表示一个交互。一个请求被提交,以及一个与它进行比较的策略。
providers:
hookbin:
validation:
#
# the request part
#
request:
params:
- name: hookbin_1
desc: hookbin ID (https://hookb.in)
- name: hookbin_2
desc: fake key to put as a query param
id: "postbin:validation"
desc: "Postbin: valid key"
# variable interpolation is good for all fields
uri: "https://hookb.in/{{hookbin_1}}?q={{hookbin_2}}"
method: post
# you can also use headers, body, form, basic_auth and more (see defs.yaml)
#
# the policy part: all values are actually regular expressions and are matched against service response
#
response:
status_code: "200"
body: ok
如有疑问,您可以查看keyscope自己的defs.yaml以获取使用此基础设施的真实示例。
教程:添加Dropbox
为了验证dropbox API密钥是否有效,我们首先需要了解对该API进行认证的标准方式。
第一站,API文档
- Dropbox有一个API探索器,非常有用
下一站,我们要找到一个代表性的API调用
- 必须经过认证
- 必须表明当我们使用候选密钥成功访问时,密钥具有一些权威性。这意味着,如果泄露,将存在重大风险。
对于此示例,获取我们的当前账户听起来像是只有当我们确定我们是谁时才能做到的。
我们将选择get_current_account。
让我们开始形成我们的交互。首先是最需要的框架:包含提供者的名称(dropbox
)、其ID和描述,以及所需参数及其名称和描述
dropbox:
validation:
request:
id: "dropbox:validation"
desc: "dropbox: valid API credentials"
params:
- name: dropbox_1
desc: dropbox token
我们保留参数名称的特殊约定,以帮助自动向keyscope提供数据
PROVIDER_N
Where 'N' starts in 1 e.g.:
dropbox_1
dropbox_2
aws_1
...
然后,根据Dropbox的要求,提供实际进行HTTP调用的详细信息(Bearer令牌认证)。
uri: https://api.dropboxapi.com/2/users/get_current_account
method: post
headers:
Authorization:
- Bearer {{dropbox_1}}
请注意,根据标准,所有HTTP头部字段实际上都是数组。如果你只有一个值(最常见的情况),总是创建一个大小为一个的数组是可以的。
我们在这里也看到了变量插值。其中,{{dropbox_1}}
将在实际调用之前被keyscope替换。
最后,我们想确保我们回答以下问题
- 成功调用意味着什么?
在我们的例子中,Dropbox API调用在成功时返回HTTP OK
,这意味着200
状态码。
最终完整的结果如下
dropbox:
validation:
request:
id: "dropbox:validation"
desc: "dropbox: valid API credentials"
params:
- name: dropbox_1
desc: dropbox token
uri: https://api.dropboxapi.com/2/users/get_current_account
method: post
headers:
Authorization:
- Bearer {{dropbox_1}}
response:
status_code: "200"
同时,你可以在自己的providers.yaml
文件中添加此提供程序并运行keyscope
$ keyscope -f providers.yaml validate dropbox -p MY_KEY
现在你可以将它保存在你的私人providers.yaml
文件中,或者如果你认为其他人可能会喜欢使用它,可以将其贡献回keyscope - 我们很高兴接受拉取请求。
谢谢
所有贡献者 - 你让这一切成为可能,谢谢!
版权
依赖关系
~21–36MB
~603K SLoC