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, 上游代理, 代码生成, 文档结构分析, 最小权限原则, 权限管理, 模型越狱, 渗透测试工具, 策略生成, 配置扫描, 错误基检测, 静态代码分析