elastic/harp
GitHub: elastic/harp
一个「契约式」密钥管理工具链,通过不可变容器和流水线方式实现密钥的可重现生成、转换与多后端分发。
Stars: 154 | Forks: 19
[](https://opensource.org/licenses/Apache-2.0)
[](https://goreportcard.com/report/github.com/elastic/harp)
[](http://golang.org)
[](https://github.com/elastic/harp/releases/)
[](https://github.com/elastic/harp/graphs/commit-activity)
- [Harp](#harp)
- [TL;DR.](#tldr)
- [Visual overview](#visual-overview)
- [Why harp?](#why-harp)
- [Use cases](#use-cases)
- [How does it work?](#how-does-it-work)
- [Like a Data pipeline but for secret](#like-a-data-pipeline-but-for-secret)
- [Immutable transformation](#immutable-transformation)
- [What can I do?](#what-can-i-do)
- [FAQ](#faq)
- [License](#license)
- [Homebrew install](#homebrew-install)
- [Build instructions](#build-instructions)
- [Clone repository](#clone-repository)
- [Manual dev environment](#manual-dev-environment)
- [Check your go version](#check-your-go-version)
- [Go 1.17/1.16](#go-117116)
- [Go 1.18 (beta)](#go-118-beta)
- [Install mage](#install-mage)
- [From source](#from-source)
- [Daily](#daily)
- [With nix-shell](#with-nix-shell)
- [Bootstrap tools](#bootstrap-tools)
- [Docker](#docker)
- [For Tools](#for-tools)
- [For CLI](#for-cli)
- [Plugins](#plugins)
- [Community](#community)
# Harp
Harp 源自 Harpocrates(古希腊语:Ἁρποκράτης),他是希腊化宗教中的沉默、秘密和保密之神。- [Wikipedia](https://en.wikipedia.org/wiki/Harpocrates)
## TL;DR
Harp 是一个通过契约来管理机密信息的工具集。其目标是通过提供技术栈来描述如何根据契约和流水线管理数据,从而以`可重现`的方式处理机密数据,进而减少以数值为中心的管理。此外,我们知道`命名很难`,因此机密信息可以`一致地`关联到一个`可预测的`机密标识符,该标识符用作引用该机密值的键。最后,机密信息可以包含额外的元数据(所有权、轮换周期、泄露严重性等),这些元数据可在流水线执行期间被使用。
这些键/值关联(path ⇒ value)构成了存储在名为 `Container` 的不可变文件中的 `Bundle`。该 `Container` 充当枢纽格式,允许 Harp 命令进行通信并创建数据管理流水线。
除此之外,它还提供了一个`模板引擎`,用于生成各种可信数值(password、passphrase、crypto keys 等),并允许进行更复杂的渲染操作(配置文件等)。
最后,它提供了一个 `SDK`,允许开发者在其产品中集成 `Harp` 功能,和/或通过创建新[plugins](#plugins)来扩展 Harp 流水线功能。
## 可视化概览

## 为什么选择 Harp?
* 机密管理本质上是一系列流程的集合,为了满足信息安全(infosec)和操作要求,这些流程必须是可审计、可执行且可重现的;
* 机密分发必须将机密轮换作为首要任务来设计,因为机密数据必须定期轮换以保持其机密属性;
* `Developers` 应该根据基于路径(对机密的引用)的契约和他们正在开发的机密使用者的值规范(用于代码契约)来协商机密值,而无需了解最终部署的值;
* `Secret Operators` 使用不同的工具集来实现机密管理操作,由于过程中涉及的工具数量增加(不兼容性、变更等),这增加了错误/机密泄露的概率;
* 如果没有定义明确的机密命名约定,机密存储将随着时间推移变得难以处理(命名很难),且机密命名难以获得一致、可靠且灵活的机密树;
* 机密存储后端可以在不同环境中使用各种实现,并且应保持一致地供应。
## 使用案例
* 你想要一个`单一的机密值`,并且你在问自己`如何生成一个强密码` —— Harp 拥有一个带有机密值生成功能的模板引擎,允许你生成此类值。
* 你有`成千上万个机密`需要处理,以便在`多个云提供商`上部署你的平台/客户,且拥有`不同的机密存储` —— Harp 将帮助你定义一致的机密分发 Bundle 和流水线。
* 你需要一个`临时的机密存储`来`引导`你的长期云机密存储 —— Harp 将帮助你创建可以在部署时使用的机密容器。
* 你想将机密从一个机密存储`大规模迁移`到另一个 —— Harp 为你提供了一个机密容器来存储这些机密,以便它们被分发到其他机密存储实现中。
* 你必须`更改/修改`一个机密(轮换/弃用/更新) —— Harp 为你提供了一个`GitOps 友好`且`存储无关的操作集`,这样你就可以定义一个规范来描述你的机密操作将如何离线应用于机密容器。
## 它是如何工作的?

### 像 Data pipeline 但用于 secret
`harp` 允许你使用确定性流水线来处理机密,这些流水线通过一系列原子 CLI 操作表达,应用于一个通用的共享容器——一个不可变且独立的文件系统,用于存储根据用户规范通过模板引擎生成的机密集合(Bundle),或来自文件或外部机密存储的外部机密值。

这些流水线使用不可变容器文件系统作为数据交换协议,并且可以通过使用 `harp` SDK 创建的插件来扩展新的输入、中间操作或输出。
### 不可变转换
每次应用的转换都会创建一个包含转换后数据的容器。这将通过消除应用于同一容器的累积副作用来增强容器的可重现性。
容器为你处理应用于存储在其中的机密集合的机密性和完整性保护,并在流水线执行期间通过复制进行操作。
## 我能做什么?
Harp 提供 :
* 一种设计机密管理的方法论;
* 机密命名约定(CSO);
* 一种定义的通用语言和完整流程来实现机密管理操作;
* 一个 SDK,用于创建你自己的工具来编排机密管理流水线;
* 一个容器操作库,公开为 `github.com/elastic/harp/pkg/container`;
* 一个机密 Bundle 规范,用于存储和操作机密,公开为 `github.com/elastic/harp/pkg/bundle`;
* 一个`增强版`模板引擎,公开为 `github.com/elastic/harp/pkg/template`
* 一个路径名称验证库,公开为 `github.com/elastic/harp/pkg/cso`
* 一个用于机密管理实现的 CLI
* CI/CD 集成;
* 基于人类可读的定义(YAML);
* 用于创建可审计和可重现的流水线。
* 一个可扩展的工具,可以通过 [plugins](https://github.com/elastic/harp-plugins) 进行增强。
并允许 :
* Bundle 级别的操作
* 从头开始/模板/JSON 创建 Bundle(更多通过 plugins);
* 使用 YAML 描述符(`BundleTemplate`)生成完整的 Bundle,以描述机密及其用法;
* 读取存储在 K/V 虚拟文件系统中的值;
* 更新 K/V 虚拟文件系统;
* 应用于不可变容器(copy-on-write)的可重现补丁;
* 导入/导出到 Vault。
* 不可变容器级别的操作
* Seal / Unseal 容器,以保持完整性和机密性属性,从而强制执行静态加密(aes256-gcm96 或 chacha20-poly1305);
* 多身份密封算法;
## 常见问题
* Elastic 内部是否在使用?- 是的。它用于生成引导新区域基础设施组件所需的引导机密。#ChickenEggProblem
* Harp 只支持 `Vault` 吗?- 不,发布时仅内置了 Vault 支持,但它通过插件支持许多其他机密存储实现。
* 与 `Vault` 有什么区别?- HashiCorp Vault 是一个加密的高可用 K/V 存储,具有高级授权引擎,它不会为你处理机密分发。你不能要求 Vault 为你的应用程序生成机密并使用定义的逻辑存储它们。Harp 填补了这一需求。
## 许可证
`harp` artifacts and source code is released under [Apache 2.0 Software License](LICENSE).
# Homebrew 安装
下载 [release](https://github.com/elastic/harp/releases) 或从源代码构建。
对于稳定版本
```
brew tap elastic/harp
brew install elastic/harp/harp
```
# 构建说明
下载 [release](https://github.com/elastic/harp/releases) 或从源代码构建。
## 克隆仓库
```
$ git clone git@github.com:elastic/harp.git
$ export HARP_REPOSITORY=$(pwd)/harp
```
## 手动开发环境
### 检查你的 go 版本
#### Go 1.17/1.16
`Harp` 编译使用 :
```
$ go version
go version go1.17.8 linux/amd64
```
#### Go 1.18 (beta)
Go 1.18 编译已启用以进行测试,但 `golangci-lint` 似乎会卡住,因此暂时已禁用。
### 安装 mage
[Mage](https://magefile.org/) 是 Make 的替代品,使用的语言是 Go。
你可以使用 2 种不同的方法安装它。
#### 从源代码
```
# 安装 mage
git clone https://github.com/magefile/mage
cd mage
go run bootstrap.go
```
### 每日构建
```
export PATH=$HARP_REPOSITORY/tools/bin:$PATH
# 在 bin 文件夹中构建 harp
mage
```
## 使用 nix-shell
在你的系统上安装 `nix`,如果尚未安装。
```
$ sudo install -d -m755 -o $(id -u) -g $(id -g) /nix
$ curl -L https://nixos.org/nix/install | sh
```
```
$ cd $HARP_REPOSITORY
$ nix-shell
```
## Bootstrap 工具
```
# 进入 tools submodule
cd $HARP_REPOSITORY/tools
# 解析依赖
go mod tidy
go mod vendor
# 拉取 tools 源代码,编译它们并将可执行文件安装到 tools/bin
mage
```
## Docker
### 针对 Tools
在执行 artifact 流水线之前,你必须构建此镜像一次。
```
mage docker:tools
```
或者你可以从 GitHub registry 下载 `harp-tools`
```
# 标准用例
$ docker pull ghcr.io/elastic/harp/harp-tools:latest
# 符合 FIPS 的 go toolchain
$ docker pull ghcr.io/elastic/harp/harp-tools-fips:latest
```
使用 `cosign` 和公钥 `build/artifact/cosign.pub` 检查镜像完整性
```
cosign verify --key build/artifact/cosign.pub ghcr.io/elastic/harp/harp-tools:latest
Verification for ghcr.io/elastic/harp/harp-tools:latest --
The following checks were performed on each of these signatures:
- The cosign claims were validated
- The signatures were verified against the specified public key
- Any certificates were verified against the Fulcio roots.
[{"critical":{"identity":{"docker-reference":"ghcr.io/elastic/harp/harp-tools"},"image":{"docker-manifest-digest":"sha256:1be31528e7b00c9e836479aadfdf49319f3b4d7916e705c43ffd0b14965763a8"},"type":"cosign container image signature"},"optional":{"ref":"40714fef947d018e6053991f5ddb54283f466b04","repo":"elastic/harp","workflow":"Build and push docker tools"}}]
```
### 针对 CLI
```
# 或 docker 镜像 [distroless:static, rootless, noshell]
mage docker:harp
# 在容器中执行
docker run --rm -ti --read-only elastic/harp:
```
# Plugins
你可以在以下地址找到更多 Harp 功能扩展 -
# 社区
以下是作为灵感来源的外部项目列表:
* [Kubernetes](https://github.com/kubernetes/)
* [Helm](https://github.com/helm/)
* [Open Policy Agent ConfTest](https://github.com/open-policy-agent/conftest)
* [SaltPack](https://github.com/keybase/saltpack)
* [Hashicorp Vault](https://github.com/hashicorp/vault)
* [AWS SDK Go](https://github.com/aws/aws-sdk-go)
标签:CLI, DevSecOps, DNS解析, Docker, EC2, EVTX分析, EVTX分析, Go, Golang, IaC, NIDS, Ruby工具, Secret Management, SIEM 集成, StruQ, Vault, WiFi技术, 上游代理, 不可变基础设施, 人工智能安全, 合规性, 契约式管理, 安全管理, 安全编程, 安全防御评估, 容器化, 密码库, 工具链, 开源项目, 数据加密, 数据管道, 数据脱敏, 日志审计, 机密数据, 网络调试, 自动化, 请求拦截, 调试插件, 软件工程