tcmarkfeld/Conductor
GitHub: tcmarkfeld/Conductor
扫描 C# MassTransit + Amazon SQS/SNS 配置,自动生成最小权限 IAM 策略和 Terraform 资源定义的 CLI 工具。
Stars: 1 | Forks: 0
# Conductor
`Conductor` 是一个 CLI 工具,用于扫描 C# MassTransit + Amazon SQS/SNS 配置并生成最小权限的 IAM policy JSON。
## 功能
- 扫描仓库以查找 MassTransit Amazon SQS 的使用情况。
- 通过常见模式检测队列/主题:
- `UsingAmazonSqs(...)`
- `ReceiveEndpoint(...)`
- `ec.Subscribe(...)`
- `bus.Message(x => x.SetEntityName(...))`
- `EndpointConvention.Map(new Uri(...))`
- 从以下方式解析名称:
- 字符串字面量
- `const` 值
- 简单的 `.Replace("{{env}}", ...)` 模式
- 输出确定性的 IAM JSON policy 或 Terraform(取决于您选择的 `--format`)。
## 系统要求
- 已安装 .NET SDK 10+
- macOS/Linux/Windows shell
检查版本:
```
dotnet --version
```
## 通过 NuGet 安装(全局工具)
安装:
```
dotnet tool install -g Conductor.Tool
```
更新:
```
dotnet tool update -g Conductor.Tool
```
卸载:
```
dotnet tool uninstall -g Conductor.Tool
```
## 从仓库安装
从仓库根目录:
```
dotnet restore Conductor.slnx
dotnet build Conductor.slnx -c Release
```
安装后运行:
```
conductor --help
conductor generate --repo /absolute/path/to/repo --out ./policy.json
```
## 运行
使用构建好的 CLI:
```
dotnet ./src/Conductor.Cli/bin/Release/net10.0/Conductor.dll generate \
--repo /absolute/path/to/your/repo \
--out /absolute/path/to/policy.json
```
## 命令
```
conductor generate --repo --out [options]
```
### 必填标志
- `--repo` 要扫描的仓库路径
- `--out` 输出路径:
- 如果是 `--scope repo`:输出文件路径
- 如果是 `--scope folder`:输出目录路径
### 可选标志
- `--scope` `repo|folder`。默认值:`repo`
- `--format` 输出格式(`iam-json` 或 `terraform`)。默认值:`iam-json`
- `--strict` `true|false`。默认值:`true`
- `--region` ARN 区域令牌/值。默认值:`${region}`
- `--account-id` ARN 账户令牌/值。默认值:`${account_id}`
- `--env` 保留用于未来扩展。默认值:`${env}`
## 示例
### 1) 默认令牌化输出
```
dotnet ./src/Conductor.Cli/bin/Release/net10.0/conductor.dll generate \
--repo /Users/me/source/my-service \
--out ./policy.json
```
### 2) 在 ARN 中指定具体的账户 + 区域
```
dotnet ./src/Conductor.Cli/bin/Release/net10.0/conductor.dll generate \
--repo /Users/me/source/my-service \
--out ./policy.prod.json \
--region us-east-2 \
--account-id 123456789012
```
### 3) 非严格模式(警告并继续)
```
dotnet ./src/Conductor.Cli/bin/Release/net10.0/conductor.dll generate \
--repo /Users/me/source/my-service \
--out ./policy.json \
--strict false
```
### 4) Monorepo 模式(每个顶层文件夹生成一个策略)
```
dotnet ./src/Conductor.Cli/bin/Release/net10.0/conductor.dll generate \
--repo /Users/me/source/repos/ \
--scope folder \
--out ./policies \
--strict false
```
这会创建如下文件:
- `./policies/Company.Api.policy.json`
- `./policies/Company.BlogAgent.policy.json`
- 等等(针对检测到 MassTransit SQS/SNS 使用情况的文件夹)
当选择 `--format terraform` 时,生成的文件将使用 `.policy.tf` 扩展名。
## 严格模式行为
当 `--strict true` 时:
- 未解析的队列/主题名称将被视为错误
- 命令以非零状态码退出
- 诊断信息及源文件路径将打印到 stderr
## 测试
```
dotnet test Conductor.slnx -c Release
```
## 输出
- `scope=repo`:在 `--out` 路径下输出一个策略(`iam-json` 格式输出 JSON,`terraform` 格式输出 HCL)
- `scope=folder`:仓库中每个顶层文件夹输出一个策略(`iam-json` 格式为 `.policy.json`,`terraform` 格式为 `.policy.tf`)
## 生成输出示例
示例输入假设:
- 检测到的队列:`order-submit`
- 检测到的主题:`order-events`
- 默认令牌化 ARN 部分:`region=${region}`,`account_id=${account_id}`
- 启用了错误发布行为(因此包含了 MassTransit fault topics)
### IAM JSON (`--format iam-json`)
```
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SqsManageQueues",
"Effect": "Allow",
"Action": [
"sqs:ChangeMessageVisibility",
"sqs:CreateQueue",
"sqs:DeleteMessage",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl",
"sqs:PurgeQueue",
"sqs:ReceiveMessage",
"sqs:SendMessage",
"sqs:SetQueueAttributes",
"sqs:TagQueue"
],
"Resource": [
"arn:aws:sqs:${region}:${account_id}:order-submit",
"arn:aws:sqs:${region}:${account_id}:order-submit_error",
"arn:aws:sqs:${region}:${account_id}:order-submit_skipped"
]
},
{
"Sid": "SnsManageTopics",
"Effect": "Allow",
"Action": [
"sns:CreateTopic",
"sns:GetTopicAttributes",
"sns:Publish",
"sns:SetTopicAttributes",
"sns:Subscribe",
"sns:TagResource",
"sns:Unsubscribe"
],
"Resource": [
"arn:aws:sns:${region}:${account_id}:MassTransit-Fault*",
"arn:aws:sns:${region}:${account_id}:MassTransit-ReceiveFault",
"arn:aws:sns:${region}:${account_id}:order-events"
]
}
]
}
```
### Terraform HCL (`--format terraform`)
```
data "aws_iam_policy_document" "conductor_sqs" {
statement {
sid = "SqsManageQueues"
effect = "Allow"
actions = [
"sqs:ChangeMessageVisibility",
"sqs:CreateQueue",
"sqs:DeleteMessage",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl",
"sqs:PurgeQueue",
"sqs:ReceiveMessage",
"sqs:SendMessage",
"sqs:SetQueueAttributes",
"sqs:TagQueue",
]
resources = [
"arn:aws:sqs:${region}:${account_id}:order-submit",
"arn:aws:sqs:${region}:${account_id}:order-submit_error",
"arn:aws:sqs:${region}:${account_id}:order-submit_skipped",
]
}
}
data "aws_iam_policy_document" "conductor_sns" {
statement {
sid = "SnsManageTopics"
effect = "Allow"
actions = [
"sns:CreateTopic",
"sns:GetTopicAttributes",
"sns:Publish",
"sns:SetTopicAttributes",
"sns:Subscribe",
"sns:TagResource",
"sns:Unsubscribe",
]
resources = [
"arn:aws:sns:${region}:${account_id}:MassTransit-Fault*",
"arn:aws:sns:${region}:${account_id}:MassTransit-ReceiveFault",
"arn:aws:sns:${region}:${account_id}:order-events",
]
}
}
```
## 当前限制
- 专注于常见的 MassTransit SQS/SNS 模式(并非涵盖所有动态/元编程风格)。
- 如果 endpoint 名称是完全动态的/仅在运行时确定,严格模式将按设计执行失败。
## 路线图(计划中)
- 扩展分析器以覆盖更多 MassTransit 模式。
## 贡献
1. 创建功能分支
2. 添加/调整测试
3. 运行构建 + 测试
4. 提交 PR
标签:Amazon SNS, Amazon SQS, AWS IAM, DevSecOps, EC2, ECS, IaC, MassTransit, NuGet工具, Terraform, 上游代理, 代码生成, 文档结构分析, 最小权限原则, 权限管理, 模型越狱, 渗透测试工具, 策略生成, 配置扫描, 错误基检测, 静态代码分析