naumanAhmed3/bedrock
GitHub: naumanAhmed3/bedrock
Bedrock 用 Pulumi 构建了一个无需云账户即可运行的多环境基础设施即代码平台基础层,演示了组件资源、类型化配置、机密管理和策略即代码等核心机制。
Stars: 0 | Forks: 0
# Bedrock — 使用 Pulumi 实现基础设施即代码
Bedrock 为多服务平台提供了基础层配置 —
**网络拓扑、TLS 证书颁发机构、服务级机密信息以及
渲染后的配置** — 全部使用 TypeScript 和 [Pulumi](https://www.pulumi.com) 完成。
它由**可复用的组件资源**构建而成,并通过类型化的、针对每个 stack 的配置在**多个环境**中运行。
**在线演示:** https://bedrock-ecru.vercel.app
## 为什么无需云账户即可运行
基础设施即代码通常针对需要付费的云平台。Bedrock 刻意设计为任何人都可以构建:
它使用**无需云账户和凭据**的 provider 进行配置 —
- **`tls`** — 真实的私有 CA 和由 CA 签名的叶子证书(真实的密钥
和 X.509 证书,在 state 中跟踪),
- **`random`** — 加密强度高的服务 token,
- **`command`** — 渲染后的配置文件和 catalog,写入 `dist/`。
这里展示的 Pulumi 机制 — 组件资源、类型化的多 stack
配置、资源依赖、机密信息、stack 输出以及策略即代码 —
与你在 AWS 或 GCP 上使用的完全相同。只是 provider 有所不同。
## 组件模型
```
Platform (bedrock:platform:Platform)
├── Pki (bedrock:platform:Pki)
│ ├── tls.PrivateKey ─ CA key
│ └── tls.SelfSignedCert ─ root CA … .issue() → CA-signed leaf certs
│
├── Service ×4 (bedrock:platform:Service)
│ ├── Pki.issue() → tls.PrivateKey + CertRequest + LocallySignedCert
│ ├── ServiceSecrets → random.RandomPassword (token, a Pulumi secret)
│ └── command.local.Command → dist/config/.env
│
└── command.local.Command ×2 → dist/index.html + dist/platform.json
```
每个框都是一个真实的 `pulumi.ComponentResource`。`Pki` 暴露了一个 `issue()` 方法,
这样服务就可以在不知道其运作方式的情况下从 CA 请求证书 —
这正是封装,就像你封装一个 VPC 或数据库一样。
渲染后的配置文件引用的是机密信息 (`SERVICE_TOKEN_REF=secret://…`)
而不是直接嵌入它:**token 的值仅存在于加密的 Pulumi state 和机密 stack 输出中**,绝不会出现在明文文件中。
## 多环境
两个 stack,两个配置文件,同一个程序:
| | `dev` | `prod` |
|---|---|---|
| 域名 | `dev.bedrock.internal` | `bedrock.example.com` |
| 网络 | `10.10.0.0/16` | `10.20.0.0/16` |
| 证书有效期 | 720 h | 2160 h |
| 副本数 (总计) | 4 | 12 |
`lib/config.ts` 将松散的 Pulumi 配置包转换为经过校验的
`BedrockConfig`,这样格式错误的 stack 文件就会快速失败并给出明确的错误提示。
## 策略即代码
`policy/` 是一个 Pulumi **CrossGuard** 策略包 — 在
`pulumi preview` 时强制执行的安全规则:
| 策略 | 规则 | 级别 |
|---|---|---|
| `random-password-strength` | token 长度 ≥ 32 个字符 | 强制执行 |
| `private-key-strength` | 仅限 ECDSA / ED25519 / RSA-2048+ | 强制执行 |
| `certificate-validity-bounded` | 没有证书有效期 > 1 年 | 建议 |
```
$ pulumi preview --stack prod --policy-pack ./policy
Policies:
✅ bedrock-platform@v1.0.0 (local: policy)
```
## 运行
需要 Node 20+ 和 [Pulumi CLI](https://www.pulumi.com/docs/install/)。
```
pnpm install
pulumi login --local # state on the local filesystem
export PULUMI_CONFIG_PASSPHRASE=... # encrypts secrets in state
pulumi stack select dev # or: pulumi stack init dev
pulumi up
# 强制执行 policy pack
pulumi preview --policy-pack ./policy
```
`pulumi up` 会配置 CA、每个服务的密钥 + 证书 + token,
并将 catalog 渲染到 `dist/` — 这正是在线演示所提供的内容。
```
$ pulumi up --stack prod
+ tls:index:SelfSignedCert bedrock-pki-ca-cert created
+ tls:index:LocallySignedCert api-cert created
+ random:index:RandomPassword api-secrets-token created
+ command:local:Command api-config created
+ command:local:Command bedrock-catalog-html created
...
Outputs:
caFingerprint: "49:D2:54:8F:26:D3:B2:E2:1D:31:62:E1:46:3B:C9:C6"
environment : "prod"
Resources:
+ 35 created
```
## 项目结构
```
bedrock/
├── Pulumi.yaml project definition
├── Pulumi.dev.yaml dev stack config
├── Pulumi.prod.yaml prod stack config
├── index.ts program entry — builds one Platform
├── lib/
│ ├── config.ts typed multi-stack configuration
│ └── render.ts catalog HTML + JSON rendering
├── components/
│ ├── pki.ts the certificate authority component
│ ├── secrets.ts per-service secret generation
│ ├── service.ts one service: cert + secrets + config
│ └── platform.ts composes the whole environment
└── policy/ Pulumi CrossGuard policy pack
```
## 设计说明
- **`dist/` 是构建输出,而非源代码。** 它被 git 忽略,并由
`pulumi up` 生成。部署的演示是 `prod` stack 渲染后的 catalog。
- **State 在本地** (`pulumi login --local`),因此该项目是自包含的;
将其指向 Pulumi Cloud 或 S3 后端只需修改一行代码。
- **机密信息永远不会以明文形式写入磁盘** — 仅渲染 `secret://` 引用;
值保留在加密的 state 中。
- 将 `tls` / `random` / `command` 替换为 `aws` / `gcp` provider 不会
改变组件结构 — 拓扑、配置和策略层保持
原样。
## 许可证
MIT
标签:MITM代理, Pulumi, TLS/PKI证书管理, TypeScript, 安全插件, 组件化开发, 自动化攻击