#secret #env-var #session-token #passwords #session-keys

bin+lib rudric

安全方式管理机密信息的 CLI 工具

5 个版本

0.1.7 2024 年 6 月 20 日
0.1.6 2024 年 6 月 4 日
0.1.5 2024 年 3 月 8 日
0.1.4 2024 年 1 月 25 日
0.1.3 2024 年 1 月 24 日

#680 in 密码学

每月下载 39

MIT 许可证

55KB
1K SLoC

鲁德里奇

一个简单的机密存储库。

鲁德里奇使从命令行管理机密变得简单直观。机密信息以加密形式存储在磁盘上,并在需要时快速解密并添加到所需的环境中。明文机密信息仅在内存中存储。

目的

我经常使用 .env 文件来存储敏感数据,如 API 密钥和个人访问令牌。虽然 .env 文件在 Linux 和 Mac 上默认“隐藏”,但这并不是真正的 安全。任何人都可以在文件系统中使用 grep 查找各种明文机密信息。将机密信息加密存储,并在需要时解密,将是一个更好的解决方案。

安装

目前支持以下安装方法

  • cargo安装 rudric
  • nix install github:mike-lloyd03/rudric (需要启用 Flakes)

使用方法

.env 文件可以用 .renv 文件替换,它使用类似 bash 的语法来定义环境变量。

GITHUB_TOKEN={{personal_github_token}}
GITHUB_API=https://api.github.com

这将创建一个名为 GITHUB_TOKEN 的环境变量,其值设置为您的保险库中名为 personal_github_token 的机密值。此外,还可以在此处存储非机密值,并且它们也将被设置到环境中。

可以在单个环境变量中使用多个机密信息。此外,还支持字符串插值。

DATABASE_URL=postgres://{{pg_user}}:{{pg_pass}}@localhost:5432

使用 rudric env <shell_name>,可以将这些变量设置到您的环境中。

fish:

rudric env fish | source

bash:

source <(rudric env bash)

可以通过在配置文件中设置来指定默认的 shell。

入门指南

初始化

第一步是使用 rudric init 生成一个新的保险库。您将被要求设置主密码。完成后,您的保险库将被创建。

与保险库交互

可以创建、检索、编辑和删除机密信息。

rudric create <new_secret_name>

将打开一个文本编辑器(由EDITORVISUAL环境变量定义)。用户可以选择使用--file标志从文件内容创建一个秘密。或者,如果会话处于活动状态,用户可以通过从另一个进程管道文本来创建秘密。

pwgen -1 14 | rudric create <new_secret_name> -

[!重要] 为了正确地从管道中读取,必须设置有效的会话令牌。目前,Rustcrate dialoguer存在一个bug,这阻止了在将数据管道输入程序时正确显示输入提示。

以下其他命令也受到支持

  • 编辑
  • 列出
  • 删除(要求确认)
  • 更改密码

会话

为了避免每次与保险库交互时都输入主密码,您可以创建一个会话令牌,该令牌必须设置为环境变量中的RUDRIC_SESSION。这个简写可能看起来像这样。

set -x RUDRIC_SESSION $(rudric session)

会话令牌默认有效期为8小时,但可以配置。可以使用rudric session end命令撤销当前会话令牌。

加密

主密码使用Argon2i算法进行加盐和散列。

在写入数据库之前,使用XChaCha20Poly1305加密秘密值。

使用基于Argon2i的密钥派生函数从主密码派生出一个更高阶的密钥。此密钥用于加密和解密秘密。

会话令牌

会话令牌生成是一种便利,显然为了实现这种便利而做出了一些安全妥协。然而,通过适当管理您的会话令牌,风险很低。永远不要将您的会话令牌存储在磁盘上。如果有人能够获取您的保险库数据库和您的会话令牌,那么您的所有秘密都可以被解密。

会话令牌生成

会话令牌使用以下方法生成

  • 设置一个过期时间。
  • 生成一个随机密钥(会话密钥)并将其写入保险库。
  • 从主密码和存储的盐中派生出用户的密钥。
  • 将密钥与过期时间连接起来。使用会话密钥进行加密。
  • 再次将加密的过期时间和密钥与会话密钥的UUID连接起来。将其进行base64编码并返回给用户作为会话令牌。

如果环境设置了RUDRIC_SESSION令牌

  • 使用会话令牌中找到的UUID从数据库中获取会话密钥
  • 使用会话密钥从会话令牌中解密过期时间和密钥
  • 如果令牌未过期,则使用密钥与保险库中的秘密交互。

配置

Rudric可以通过一个toml文件进行配置。默认情况下,此文件存储在XDG_CONFIG/rudric/config.toml(Linux和Mac上的$HOME/.config/rudric/config.toml)。所有配置选项都是可选的。一个示例配置文件可能看起来像这样

# Options are: bash, zsh, fish, nu (default "bash")
default_shell = "fish"

# Specify the default length of time that a session token is valid for (default "8h")
session_lifetime = "6h"

# Specify the name of the file to use in the CWD for setting environment variables (default ".renv")
renv_filename = ".env"

direnv

Rudric包括对direnv的支持。但是,为了使用它,您必须在使用direnv之前启动一个Rudric会话。

只需将以下内容添加到您的.envrc文件中

$(rudric env direnv)

将目录更改为同时包含.envrc.renv文件的目录,将自动将加密的秘密导入到环境变量中。

【重要】FISH 用户:如果未设置有效的会话令牌,切换到具有受信任 .envrc 的目录将会提示您输入密码。这将失败,并且您的终端将会挂起,因为输入不会传递给 Rudric。这是由于 direnvfish 中无法读取 stdin 的一个错误。

作为解决方案,您可以在 .envrc 文件的顶部添加 stty sane

stty sane
$(rudric env direnv)

参见
https://github.com/direnv/direnv/issues/967
https://github.com/direnv/direnv/issues/1237

Crates

加密全部通过使用出色的 Orion 库完成。

使用的其他 crates

  • clap
  • sqlx
  • dialoguer
  • serde
  • colored_json
  • tabled

依赖

~65MB
~1M SLoC