发现、风险评估并修复 AWS、Azure 和 GCP 中的非人类身份,采用离线基于规则的分析、权限提升检测和权限边界遏制。
一个企业级、离线优先的安全自动化平台,可跨 AWS、Azure 和 Google Cloud Platform(GCP) 发现、清点、分析、风险评估并安全修复 非人类身份(NHI)——服务主体、服务账号、机器角色、访问密钥和凭证。
⭐️ 如果您觉得此工具有助于审计和保护跨云的非人类身份,请考虑为仓库加星!
| 云提供商 | 覆盖的身份类型 | 发现引擎 | 密钥/凭证检查 | 活动规则 | 状态 |
|---|---|---|---|---|---|
| 🟧 AWS | IAM 角色、机器用户、组、策略 | Boto3 + 会话缓存 | 访问密钥(CreateDate、LastUsed) | 13 条规则(AWS_01–16、TAG_01) | ✅ 支持 |
| 🟦 Azure | Entra ID 服务主体、应用注册、托管标识 | 纯 REST(Graph 与 ARM) | 客户端密钥(passwordCredentials)、证书(keyCredentials) | 5 条规则(AZURE_01–05) | ✅ 支持 |
| 🟥 GCP | 服务账号、工作负载身份、IAM 角色 | 纯 REST(IAM 与 Resource Mgr) | 服务账号密钥(validAfterTime、用户托管) | 6 条规则(GCP_01–06) | ✅ 支持 |
🧪 测试套件状态: 所有提供商和引擎均 102 项通过,4 项子测试通过(100% 全绿)。
NHI 风险分析器 解决了一个关键的多云安全挑战:现代企业云环境会积累数百个机器和非人类身份(服务账号、自动化角色、CI/CD 凭证、跨云信任角色),而对这些身份中哪些权限过高、处于休眠状态或引入权限提升风险,可见性极低。
该平台在三个不同阶段强制执行严格的架构解耦:
inventory.json 快照中。企业多云环境通常包含以下非人类身份:
NHI 风险分析器使用云 API 和离线规则处理,跨云提供商自动化发现、安全分析和针对性修复。
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ AWS IAM │ │ Azure Entra │ │ GCP IAM │
│ (Boto3) │ │ (Pure REST) │ │ (Pure REST) │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────────────┐ │ ┌────────────────┘
▼ ▼ ▼
┌───────────────────────────┐
│ inventory.py │
│ (Multi-Cloud Collector) │
└─────────────┬─────────────┘
▼
┌───────────────────────────┐
│ inventory.json │
│ (Unified State Snapshot) │
└─────────────┬─────────────┘
│
▼
┌───────────────────────────┐
│ risk.py │
│ (--cloud Orchestrator) │
└─────────────┬─────────────┘
│
┌────────────────────────┼────────────────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ aws.py sub- │ │ azure.py sub-│ │ gcp.py sub- │
│ runner │ │ runner │ │ runner │
│ (13 Rules) │ │ (5 Rules) │ │ (6 Rules) │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
└────────────────────────┼────────────────────────┘
▼
┌───────────────────────────┐
│ dispatch.py │
│ (Containment Dispatcher) │
└─────────────┬─────────────┘
│
┌────────────────────────┴────────────────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────┐
│ policy_surgery.py & │ │ credential.py │
│ policy.py (Boundaries) │ │ (Deactivate Key) │
└─────────────────────────┘ └─────────────────────┘
nhi/services/inventory.py): 跨 AWS、Azure 和 GCP 查询云 API,丰富凭据元数据(访问密钥最后使用时间、密钥过期时间),并将干净的状态快照序列化到 inventory.json。nhi/risk/risk.py): 接受 --cloud {aws,azure,gcp,all} 以选择性地针对云提供商,节省不必要的 API 调用并避免跨租户速率限制。nhi/risk/runners/): 解耦的执行引擎(aws.py、azure.py、gcp.py)根据模块化安全规则处理提供商清单,并带有针对部分或缺失云负载的防御性保护。nhi/services/export.py、nhi/remediation/diff.py): 针对历史基线扫描计算安全漂移,将执行工件上传到云存储,并将发现结果导出为 CSV 和 OASIS SARIF v2.1.0 以供审计流水线使用。nhi/remediation/): AST 级策略语句分区(policy_surgery.py)以及非破坏性遏制边界/密钥停用,支持试运行模拟模式和 nhi-ignore.yaml 豁免。为消除清单收集期间冗余的 AWS STS 身份验证调用,已通过身份验证的 boto3.Session 对象会在 Python 进程的生命周期内缓存在 nhi/aws/session.py 中。
AssumeRole 调用减少: 35 → 179.58s → 45.67s(约 43% 运行时改进)session.py 内部,无需对发现或规则模块进行任何逻辑更改。多云发现层没有捆绑笨重且碎片化的云 SDK(azure-mgmt-*、msgraph-sdk、google-cloud-iam + grpcio),而是采用统一的轻量级 纯 HTTP(requests)+ Bearer 令牌设计:
grpcio),将容器镜像大小从 >300MB 减少到 <50MB。https://graph.microsoft.com/v1.0 以获取 Entra ID 用户、安全组、服务主体和应用注册。https://management.azure.com 以获取角色分配、角色定义和用户分配的托管标识。该平台在 AWS、Azure 和 GCP 上强制执行 26 条活跃安全规则,针对权限提升途径、过度宽松的策略和休眠的机器凭据。
| 规则 ID | 名称 | 类别 | 严重性 | 状态 | 修复 / 影响 |
|---|---|---|---|---|---|
AWS_01 | 策略中的通配符操作 | 策略分析 | HIGH | ✅ 已实现 | 附加权限边界(nhi-permissions-boundary) |
AWS_02 | 策略中的通配符资源 | 策略分析 | HIGH / LOW | ✅ 已实现 | 附加权限边界 / AST 语句分区 |
AWS_03 | 完全管理员访问权限 | 策略分析 | CRITICAL | ✅ 已实现 | 附加权限边界(计划在阶段 5 中分离) |
AWS_04 | 通过 iam:PassRole 进行权限提升 | 权限提升 | HIGH | ✅ 已实现 | 附加权限边界(显式拒绝) |
AWS_05 | 通过 iam:CreatePolicyVersion 进行权限提升 | 权限提升 | CRITICAL | ✅ 已实现 | 附加权限边界(显式拒绝) |
AWS_06 | 通过策略附加(Attach*/Put*)进行直接提升 | 权限提升 | CRITICAL | ✅ 已实现 | 附加权限边界(显式拒绝) |
AWS_07 | 通过 iam:CreateAccessKey 进行权限提升 | 权限提升 | CRITICAL | ✅ 已实现 | 附加权限边界(显式拒绝) |
AWS_08 | 控制台访问提升(Create/UpdateLoginProfile) | 权限提升 | CRITICAL | ✅ 已实现 | 附加权限边界(显式拒绝) |
AWS_09 | 通过 iam:SetDefaultPolicyVersion 进行权限提升 | 权限提升 | CRITICAL | ✅ 已实现 | 附加权限边界(显式拒绝) |
AWS_10 | 宽松的角色信任策略(* AssumeRole 主体) | 信任策略分析 | CRITICAL | ✅ 已实现 | 附加权限边界(nhi-permissions-boundary) |
AWS_11 | 过期的访问密钥(超过 90 天) | 凭证安全 | HIGH / LOW | ✅ 已实现 | 停用密钥(Status: Inactive) |
AWS_12 | 未使用且休眠的访问密钥(超过 30 天) | 凭证安全 | HIGH | ✅ 已实现 | 停用密钥(Status: Inactive) |
AWS_14 | 不受限制的 S3 数据外泄(s3:GetObject*、s3:*) | 数据边界 | HIGH | ✅ 已实现 | 附加权限边界(nhi-permissions-boundary) |
AWS_15 | 安全防御规避(CloudTrail/GuardDuty/KMS 篡改) | 资源保护 | CRITICAL | ✅ 已实现 | 附加权限边界(nhi-permissions-boundary) |
AWS_16 | 不受限制的 KMS 解密(kms:Decrypt、kms:*) | 数据边界 | HIGH | ✅ 已实现 | 附加权限边界(nhi-permissions-boundary) |
TAG_01 | 缺少强制性治理标签(Owner、Environment) | 治理与标签 | LOW | ✅ 已实现 | 应用强制性标签 |