#validation #key #secret-key #provider #workflow #security #built

bin+lib keyscope

Keyscope 是一个密钥和秘密工作流程工具

1 个稳定版本

1.4.0 2024年5月19日

#21#secret-key

Download history 180/week @ 2024-05-16 21/week @ 2024-05-23 3/week @ 2024-05-30 4/week @ 2024-06-06 10/week @ 2024-06-13 38/week @ 2024-06-20 6/week @ 2024-06-27 47/week @ 2024-07-11 11/week @ 2024-07-18

每月下载量71次

Apache-2.0

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库来指定与服务和其策略的交互,如果您发现一个不在此列表中的服务,请随时打开一个问题或贡献回来。

测试器
测试器:有效密钥

验证

tester_1 - hookbin ID (https://hookb.in)
tester_2 - 作为查询参数放入的伪造密钥

keyscope validate tester -p TESTER_1 TESTER_2

infura
infura API密钥

验证

infura_1 - infura API密钥

keyscope validate infura -p INFURA_1

covalenthq
Covalent:有效密钥

验证

covalenthq_1 - covalent令牌

keyscope validate covalenthq -p COVALENTHQ_1

asana
Asana:有效令牌

验证

asana_1 - asana令牌

keyscope validate asana -p ASANA_1

bitly
Bit.ly:有效访问令牌

验证

bitly_1 - bit.ly令牌

keyscope validate bitly -p BITLY_1

ipstack
ipstack访问密钥

验证

ipstack_1 - ipstack访问密钥

keyscope validate ipstack -p IPSTACK_1

localytics
Localytics:有效API凭据

验证

localytics_1 - localytics用户
localytics_2 - localytics密钥

keyscope validate localytics -p LOCALYTICS_1 LOCALYTICS_2

algolia
Algolia:有效API凭据

验证

algolia_1 - algolia应用程序ID
algolia_2 - algolia索引
algolia_3 - algolia API密钥

keyscope validate algolia -p ALGOLIA_1 ALGOLIA_2 ALGOLIA_3

branchio
branch.io:有效API凭据

验证

branchio_1 - branch.io密钥
branchio_2 - branch.io密钥

keyscope validate branchio -p BRANCHIO_1 BRANCHIO_2

browserstack
browserstack:有效API凭据

验证

browserstack_1 - browserstack密钥
browserstack_2 - browserstack密钥

keyscope validate browserstack -p BROWSERSTACK_1 BROWSERSTACK_2

buildkite
Buildkite:有效令牌

验证

buildkite_1 - Buildkite令牌

keyscope validate buildkite -p BUILDKITE_1

datadog
datadog:有效API凭据

验证

datadog_1 - datadog API密钥

keyscope validate datadog -p DATADOG_1

github
github: 有效的API凭证

验证

github_1 - github令牌

keyscope validate github -p GITHUB_1

github-ent
Github Enterprise: 有效的API令牌

验证

github-ent_1 - github enterprise实例(不包括http)
github-ent_2 - github令牌

keyscope validate github-ent -p GITHUB-ENT_1 GITHUB-ENT_2

dropbox
dropbox: 有效的API凭证

验证

dropbox_1 - dropbox令牌

keyscope validate dropbox -p DROPBOX_1

gitlab
gitlab: 有效的API凭证

验证

gitlab_1 - gitlab令牌

keyscope validate gitlab -p GITLAB_1

heroku
heroku: 有效的API凭证

验证

heroku_1 - heroku令牌

keyscope validate heroku -p HEROKU_1

mailchimp
mailchimp: 有效的API凭证

验证

mailchimp_1 - mailchimp数据中心ID
mailchimp_2 - mailchimp密钥

keyscope validate mailchimp -p MAILCHIMP_1 MAILCHIMP_2

mailgun
mailgun: 有效的API凭证

验证

mailgun_1 - mailgun密钥

keyscope validate mailgun -p MAILGUN_1

pagerduty
pagerduty: 有效的API凭证

验证

pagerduty_1 - pagerduty令牌

keyscope validate pagerduty -p PAGERDUTY_1

circleci
circleci: 有效的API凭证

验证

circleci_1 - circleci密钥

keyscope validate circleci -p CIRCLECI_1

facebook-access-token
facebook: 有效的API令牌

验证

facebook-access-token_1 - facebook令牌

keyscope validate facebook-access-token -p FACEBOOK-ACCESS-TOKEN_1

salesforce
salesforce: 有效的API凭证

验证

salesforce_1 - salesforce实例名称
salesforce_2 - salesforce令牌

keyscope validate salesforce -p SALESFORCE_1 SALESFORCE_2

jumpcloud
jumpcloud: 有效的API凭证

验证

jumpcloud_1 - jumpcloud密钥

keyscope validate jumpcloud -p JUMPCLOUD_1

saucelabs-us
saucelabs-us: 有效的API凭证

验证

saucelabs-us_1 - saucelabs用户
saucelabs-us_2 - saucelabs密钥

keyscope validate saucelabs-us -p SAUCELABS-US_1 SAUCELABS-US_2

saucelabs-eu
saucelabs-eu: 有效的API凭证

验证

saucelabs-eu_1 - saucelabs用户
saucelabs-eu_2 - saucelabs密钥

keyscope validate saucelabs-eu -p SAUCELABS-EU_1 SAUCELABS-EU_2

sendgrid
sendgrid: 有效的API凭证

验证

sendgrid_1 - sendgrid密钥

keyscope validate sendgrid -p SENDGRID_1

slack
slack: 有效的API凭证

验证

slack_1 - slack密钥

keyscope validate slack -p SLACK_1

slack-webhook
slack-webook: 有效的API凭证

验证

slack-webhook_1 - slack webhook

keyscope validate slack-webhook -p SLACK-WEBHOOK_1

stripe
stripe: 有效的API凭证

验证

stripe_1 - stripe密钥

keyscope validate stripe -p STRIPE_1

travisci
travisci: 有效的API凭证

验证

travisci_1 - travisci域名,选择'org'或'com'
travisci_2 - travisci密钥

keyscope validate travisci -p TRAVISCI_1 TRAVISCI_2

twilio
twilio: 有效的API凭证

验证

twilio_1 - twilio账户sid
twilio_2 - twilio令牌

keyscope validate twilio -p TWILIO_1 TWILIO_2

twitter
twitter: 有效的API凭证

验证

twitter_1 - twitter API令牌

keyscope validate twitter -p TWITTER_1

zendesk
zendesk: 有效的API凭证

验证

zendesk_1 - zendesk域名
zendesk_2 - zendesk密钥

keyscope validate zendesk -p ZENDESK_1 ZENDESK_2

firebase
firebase: 有效的API凭证

验证

firebase_1 - firebase API密钥
firebase_2 - firebase ID令牌

keyscope validate firebase -p FIREBASE_1 FIREBASE_2

aws
aws: 有效的API凭证

验证

aws_1 - AWS ID
aws_2 - AWS密钥

keyscope validate aws -p AWS_1 AWS_2

elastic-apm-secret
Elastic APM: 密钥验证

验证

elastic-apm-secret_1 - Elastic APM主机地址和端口,包括'http/s'部分
elastic-apm-secret_2 - Elastic APM密钥

keyscope validate elastic-apm-secret -p ELASTIC-APM-SECRET_1 ELASTIC-APM-SECRET_2

artifactory
Artifactory: 令牌验证

验证

artifactory_1 - Artifactory主机(包括http(s)部分)
artifactory_2 - Artifactory令牌

keyscope validate artifactory -p ARTIFACTORY_1 ARTIFACTORY_2

ibm-cos
IBM: 云对象存储密钥验证(HMAC)

验证

ibm-cos_1 - IBM HMAC ID
ibm-cos_2 - IBM HMAC密钥

keyscope validate ibm-cos -p IBM-COS_1 IBM-COS_2

ibm-iam
IBM:云密钥验证(IAM)

验证

ibm-iam_1 - IBM云密钥

keyscope validate ibm-iam -p IBM-IAM_1

ibm-cloudant
IBM:cloudant密钥验证(旧版)

验证

ibm-cloudant_1 - IBM cloudant主机名
ibm-cloudant_2 - IBM cloudant用户
ibm-cloudant_3 - IBM cloudant密钥

keyscope validate ibm-cloudant -p IBM-CLOUDANT_1 IBM-CLOUDANT_2 IBM-CLOUDANT_3

softlayer
Softlayer:验证凭据

验证

softlayer_1 - Softlayer主机名
softlayer_2 - Softlayer令牌

keyscope validate softlayer -p SOFTLAYER_1 SOFTLAYER_2

square
Square:有效令牌

验证

square_1 - Square令牌

keyscope validate square -p SQUARE_1

telegram-bot
telegram-bot:有效机器人令牌

验证

telegram-bot_1 - 机器人密钥

keyscope validate telegram-bot -p TELEGRAM-BOT_1

bingmaps
Bing Maps API:有效访问令牌

验证

bingmaps_1 - Bing Maps令牌

keyscope validate bingmaps -p BINGMAPS_1

buttercms
ButterCMS:有效机器人令牌

验证

buttercms_1 - ButterCMS API密钥

keyscope validate buttercms -p BUTTERCMS_1

wakatime
wakatime:有效API令牌

验证

wakatime_1 - WakeTime API密钥

keyscope validate wakatime -p WAKATIME_1

calendly
calendly:有效API凭据

验证

calendly_1 - calendly API密钥

keyscope validate calendly -p CALENDLY_1

shodan
shodan:有效API令牌

验证

shodan_1 - Shodan API密钥

keyscope validate shodan -p SHODAN_1

opsgenie
opsgenie:有效API令牌

验证

opsgenie_1 - opsgenie API密钥

keyscope validate opsgenie -p OPSGENIE_1

pendo
pendo:有效API令牌

验证

pendo_1 - pendo API密钥

keyscope validate pendo -p PENDO_1

hubspot
hubspot:有效API令牌

验证

hubspot_1 - hubspot API密钥

keyscope validate hubspot -p HUBSPOT_1

lokalise
lokalise:有效API令牌

验证

lokalise_1 - lokalise令牌

keyscope validate lokalise -p LOKALISE_1

🍰 添加您自己的提供者

您可以指定自定义定义文件(在此处是一个示例

$ 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文档

下一站,我们要找到一个代表性的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 - 我们很高兴接受拉取请求。

谢谢

所有贡献者 - 你让这一切成为可能,谢谢!

版权

版权(c)2021 @jondot。有关更多信息,请参阅许可协议

依赖关系

~21–36MB
~603K SLoC