#secret #encryption #security #command-line #command-line-tool

app ssclient

SecureStore客户端,用于管理用户机密

3个不稳定版本

0.100.0 2022年8月2日
0.99.1 2020年1月28日
0.99.0 2020年1月21日

密码学 中排名 1815

每月下载量 23

Apache-2.0 OR MIT

99KB
1.5K SLoC

ssclient SecureStore伴随工具

ssclient 是 SecureStore 开放机密格式(rust)实现的伴随工具,尽管它可以用于创建和管理任何兼容 SecureStore 实现的 SecureStore 机密文件。该工具用于在 Rust 代码中创建或消费 SecureStore 机密的伴随包可以在 同一仓库中找到。根据 SecureStore 开放机密协议的承诺,使用此工具创建或修改的保险库也可以由其他语言使用,例如,与 SecureStore.NET 库 一起。

SecureStore开放格式

SecureStore 是一个安全的开放协议,用于在可读文件中存储机密,这些文件与使用它们的代码版本一致,并打算与部署的二进制文件一起分发。为了使开发人员的工作更加轻松愉快,开发了此命令行实用程序,允许通过简单界面创建机密存储库并管理它们的机密。

安装

ssclient 在 crates.io 上作为可安装的二进制 crate 发布,可以直接通过 Rust 包管理器 cargo 进行安装

~> cargo install ssclient

用法

使用 ssclient 的可用命令行选项可以通过运行 ssclient -h 来查看基本选项列表,或者运行 ssclient --help 来查看扩展用法信息

USAGE:
    ssclient [OPTIONS] [SUBCOMMAND]

OPTIONS:
        --export-key <EXPORT_PATH>    Exports a key equivalent to the supplied password.
    -h, --help                        Print help information
    -k, --key <KEYFILE>               Use key stored at path KEYFILE.
        --no-vcs                      Do not exclude private key in vcs ignore file.
    -p, --password                    Prompt for password used to derive key.
                                      In headless environments, takes the password as an argument.
    -s, --store <STORE>               Specify the path to the secrets store to use for all
                                      operations. [default: secrets.json]
    -V, --version                     Print version information

SUBCOMMANDS:
    create    Create a new SecureStore vault for secrets storage.
                  See `ssclient help create` for more info
    delete    Remove a secret from the store.
                  See `ssclient help set` for more info
    get       Decrypt and retrieve secrets.
                  See `ssclient help get` for more info
    help      Print this message or the help of the given subcommand(s)
    set       Add or update an encrypted value to/in the store.
                  See `ssclient help set` for more info

可以通过执行 ssclient --help 来查看帮助的完整版本,而通过运行 ssclient help [create|set|get|delete] 可以获得单个命令的帮助

命令行界面已优化以减少处理机密时的摩擦,应该很容易管理新或现有项目的机密,并且开发人员不应犹豫或推迟保护机密。

创建新的机密存储库

机密信息存储在人类可读、格式化的JSON文件中,旨在与依赖它们的相同代码一起添加到版本控制中。文件格式经过精心设计,以适应版本控制系统,并能够抵抗合并/重新基。可以使用ssclient create子命令创建新的存储库。存储库始终加密(在磁盘和SecureStore API客户端的内存中),API和ssclient前端支持多种加密密钥来源选项,包括基于密码的加密/解密、应用程序/API为您生成加密密钥文件或提供自己的密钥文件。

典型场景是使用密码创建新的存储库,从中自动(且安全地)派生所需的加密密钥,并导出兼容的加密密钥副本。这使您可以使用基于密码的加密/解密功能方便地与ssclient交互,同时将加密密钥安全地部署到生产服务器,在那里可以使用它以无密码方式解密密钥文件。

在命令行中使用基于密码的加密创建新存储库

~> ssclient create secrets.json
Password: ***********
Confirm password: ***********

其中secrets.json是要创建的存储库的名称。如果没有指定存储库名称,则默认使用secrets.json

要使用基于密钥的认证(即没有使用密码解密的选项),请使用以下命令代替

ssclient create secrets.json -k secrets.key

如果secrets.key存在且是有效的密钥文件,它将用于加密位于secrets.json的新存储库。如果secrets.key不存在,将使用CSPRNG为您安全地生成新密钥,并将其副本保存到提供的路径(在此例中为secrets.key),新存储库本身将被保存在提供的路径上(例如本例中的secrets.json)。

如果没有提供-p/--password-/--keyfile,则ssclient默认使用基于密码的加密/解密以提高方便性。

在基于密码的加密中,您可以使用--export-key PATH将密码派生的密钥副本导出到PATH,以便可以使用密钥文件与SecureStore API一起以无密码方式解密单个机密,同时您可以使用密码而不是密钥文件,通过ssclient在命令行中继续添加、删除或更新机密。

~> ssclient create secrets.json --export-key secrets.key
Password: ***********
Confirm password: ***********

# Now you can use `ssclient -p` with your old password
# or `ssclient -k secrets.key` to encrypt/decrypt with
# the same keys.

添加或更新机密

创建存储库后,您自然想要向其中添加一个机密。机密通过ssclient set子命令逐个添加。

机密可以直接作为命令行参数提供(提示:在命令前加一个空格可以将它排除在大多数shell的历史文件之外)

ssclient set aws:s3:accesskey 715a868e-3c83-11ea-99bd-af944d8d3940

或交互式地以增加安全性(以避免shell历史记录)

~> ssclient set aws:s3:accesskey
Password: ********
Value: 715a868e-3c83-11ea-99bd-af944d8d3940

如果已存在相同名称的机密,它将不进行确认而覆盖。幸运的是,您正在遵循SecureStore的最佳实践,将机密文件与代码一起存储和版本控制,因此您可以通过使用git checkout或您VCS提供的任何等效操作来轻松撤销此类错误!

检索和解密单个机密

ssclient set 相似,ssclient get 可以用来检索单个密钥。与其他所有子命令一样,可以使用 -s/--store 指定要使用的存储库名称,默认为 secrets.json,加密/解密模式可以通过 -p/--password-k/--key KEY 选择,在交互式环境中默认为 --password

~> ssclient -k secrets.key get aws:s3:accesskey
715a868e-3c83-11ea-99bd-af944d8d3940

虽然 ssclient 接口仅支持将基于文本的密钥保存到安全存储库中,但 SecureStore API 可以用来(例如通过 securestore 或 (SecureStore.NET)https://github.com/neosmart/SecureStore)将二进制密钥存储到安全存储库。 ssclient 可以检索这些二进制密钥,并以 base64 编码的字符串形式返回,前面加上 base64:,例如 base64:cGFzc3dvcmQ=

在无头环境中使用时,密码可以直接作为命令行参数指定(在 -p/--password 之后)。我们不推荐这样做,请导出并使用密钥文件!

导出所有密钥

ssclient get 支持可选的 -/--all 参数,可以导出存储库中的所有 (key, secret) 对。SecureStore 是一种开放格式,我们相信您应该始终能够以通用格式获取数据,但请谨慎使用此选项!

可选的 --format 开关可以用来影响导出数据的输出格式。默认为 json,但可以使用 text 代替(请记住,在 text 模式下,不会进行转义,正确解析结果可能很复杂)。

~> ssclient get --all -k secrets.key
[
  {
    "key": "aws:s3:accesskey",
    "value": "715a868e-3c83-11ea-99bd-af944d8d3940"
  },
  {
    "key": "secret",
    "value": "password"
  }
]

json 模式下,输出保证是有效的 JSON,是一个包含对象的 JSON 数组,每个对象都有一个 key(密钥名称)和一个 value(密钥本身)。

在文本模式下,每个结果都打印在新的一行上

~> ssclient get --all --format text --key secrets.key
aws:s3:accesskey: 715a868e-3c83-11ea-99bd-af944d8d3940
secret: password

注意,简单的基于 : 的文本分割并没有正确解析结果。

删除密钥

可以通过 ssclient delete 子命令从存储库中删除密钥。如果请求的密钥在存储库中找不到,将显示错误。

~> ssclient delete aws:s3:accesskey
Password: ********

ssclient 由 NeoSmart Technologies 的 Mahmoud Al-Qudsi 创建,版权所有 NeoSmart Technologies 2019-2022。《ssclient》公开发布,没有任何保证,希望它可能有益,双重许可(您可选择)在 MIT 和 Apache 2.0 公共许可证下。

贡献

欢迎以错误报告和拉取请求的形式提交贡献,以及实现 SecureStore 的其他语言的新项目。

依赖关系

~3.5–5.5MB
~111K SLoC