关于 iac-security
面向 Azure 基础设施即代码流水线安全规划与加固的技能,适用于使用 Bicep、ARM 或 Terraform 的团队。它将扫描、策略门禁、流水线身份和供应链控制纳入部署前流程。
主要功能
- 01配置 OIDC 流水线身份
- 02规划 IaC 与密钥扫描
- 03设置 Azure Policy 部署门禁
- 04强化 Bicep 与 Terraform 流程
- 05检测基础设施漂移
适用场景
- 01将流水线机密迁移到 OIDC 联合身份
- 02在 PR 阶段检查 IaC 配置
- 03部署前评估 Azure Policy 拒绝规则
- 04定期检测 Terraform 状态漂移
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ vinayaklatthe/ microsoft-security-skills --skill iac-security安装后在 Claude Code 中输入/iac-security确认已加载。
详细介绍
Azure 上的基础设施即代码安全
如今,大多数云安全漏洞都源于通过代码配置的基础设施存在错误配置。加固 IaC 流水线——包括 Bicep、ARM、Terraform 以及运行它们的 CI/CD——可以将安全防护前移到部署之前:在 PR 审查时发现错误配置,而不是等到三周后才在 Defender for Cloud 中发现问题。
适用场景
为 Azure 设计或加固 IaC 流水线(GitHub Actions / Azure DevOps / GitLab),包括扫描、策略即代码、流水线身份和供应链控制。
请勿将此技能用于单独的 K8s 准入控制(defender-for-containers)、通用 CI/CD 架构或应用层安全。
能力栈
| 层 | 能力 |
|---|---|
| 流水线身份 | OIDC 联合(无需客户端密钥)、Workload Identities Premium |
| 提交前 / PR 时扫描 | Microsoft Security DevOps (MSDO) Action / Extension;Bicep linter;tflint;checkov;trivy;密钥扫描 |
| 策略即代码门禁 | 部署时以 Audit 和 Deny 模式使用 Azure Policy;通过 az policy what-if 进行 CI 评估,使用 Terraform azapi 进行策略预览 |
| 态势回连 | Defender for Cloud DevOps Security 连接器,连接到 GitHub / Azure DevOps |
| 漂移检测 | Defender for Cloud;在定时 CI 中运行 Terraform plan;在 AKS 上使用 GitOps 控制器(Flux/ArgoCD) |
| 供应链 | 签名提交、依赖项审查、制品签名(Notation/cosign)、允许使用的模块注册表 |
方法
-
用 OIDC 联合身份替换流水线密钥。 每种现代 Azure CI 集成都支持联合工作负载身份:
- GitHub Actions → Azure:在用户分配的 MI 上配置联合凭据;无需使用
AZURE_CREDENTIALSJSON 密钥。 - Azure DevOps → Azure:使用 Workload Identity 联合身份服务连接。
将联合凭据固定到特定环境 / 分支
(
environment:prod,而不是repo:org/repo:*)。参见entra-workload-identity。
- GitHub Actions → Azure:在用户分配的 MI 上配置联合凭据;无需使用
-
限制流水线身份的权限范围。 为每条流水线配置服务主体 / MI,并在 RG / 资源范围内分配角色,而不是授予订阅 Owner 权限。使用部署堆栈(Bicep)控制影响范围。
-
采用 Microsoft Security DevOps (MSDO) Action / Extension。 集成多种开源扫描器(template-analyzer、checkov、terrascan、trivy、bandit、ESLint security),以及密钥扫描(CredScan)。只需一个集成点;发现严重问题时阻止 PR。
-
Bicep 具体做法。
- 在 CI 中使用
bicep build+bicep lint。 - 使用模板规格共享模式,并对其进行版本管理。
- 使用部署堆栈和
denySettings,防止人员在流水线之外修改堆栈资源。 - 使用带签名模块的模块注册表(私有 ACR 或 Bicep 注册表)。
- 在 CI 中使用
-
Terraform 具体做法。
- 加固后端:将状态存储在 Azure Storage 中,并配置专用终结点、Customer Lockbox + RBAC 范围限定、软删除 + 版本控制 + 锁定。
- 固定提供程序版本(次要版本使用 ~>,安全关键的依赖项使用精确版本)。
- 在 CI 中使用
tflint+checkov;tfsec已弃用 — 已由 trivy 取代。 - 将
terraform plan产物发布到 PR,供审核者查看;Apply 需经批准后才能执行。 - 通过定期运行
terraform plan并与当前状态比对来检测漂移。
-
策略即代码门禁。 对不可妥协的控制项,将 Azure Policy 设为拒绝模式:
- VM 不得配置公共 IP。
- Storage / SQL / Key Vault 必须配置专用终结点。
- 必须配置加密 + 诊断设置 + 标记。
在 CI 中运行
az deployment what-if(Bicep/ARM),或通过Get-AzPolicyComplianceForResource根据策略进行评估,以便在应用之前发现拒绝模式导致的失败。
-
密钥卫生。
- 每次推送都运行 CredScan / GitHub Advanced Security 密钥扫描。
- 不得在
.tfvars或parameters.json中存放密钥 — 使用 Key Vault 引用 / GitHub Environments / 标记为机密的流水线变量组。 - 阻止引入密钥的 PR(启用推送保护)。
- 轮换任何历史泄露的密钥;清理 Git 历史很困难,应直接更换密钥。
-
供应链。
- 尽可能按摘要固定模块版本(Bicep 注册表摘要、固定 GitHub Action 的 SHA)。
- 允许的注册表:在订阅上使用 Azure Policy,将容器 / Bicep 模块限制在私有注册表中。
- 签名产物:使用 Notation / cosign 为容器映像签名;在 AKS 的准入控制中验证(
defender-for-containers)。
-
Defender for Cloud DevOps Security。 将 GitHub / Azure DevOps 连接到 Defender for Cloud:
- 将 IaC 发现、密钥扫描结果、代码扫描结果和依赖项漏洞汇总到 Defender for Cloud 的统一视图中。
- 标记、所有权和优先级管理方式与云发现项相同。
- 按仓库 / 流水线跟踪安全态势趋势。
-
漂移检测。 即便采用策略 + IaC,仍会发生漂移(人员操作、ClickOps)。 检测方式:
- 使用 Defender for Cloud 检查非流水线创建的资源所产生的安全态势发现项。
- 定期运行 Terraform plan 作业,并对非空差异发出警报。
- 使用 GitOps(Flux/ArgoCD)对 AKS 集群进行协调,并针对协调情况发出警报。
防护措施
- 不要将云凭据存储为长期有效的流水线密钥。 始终使用 OIDC 联合。
- 不要以订阅所有者身份运行流水线。 严格限制范围;使用部署堆栈进行隔离。
- 成熟后,只有
critical级别问题才会导致 PR 失败,标准过于宽松。 基线噪声调整完成后,将阈值提高到中危及以上。 - Bicep
what-if不是安全审查。 它会显示变更;安全审查则需要解读这些变更。 - Terraform 状态文件以明文形式包含密钥。 必须加固后端存储。
- 不要让
provider "azurerm" { ... features {} }在各流水线中漂移,且不固定版本。 可复现性就是安全性。 - 仅使用
Audit模式的 Azure Policy 有必要,但还不够。 关键控制措施需要Deny。 - 没有必需审阅者的分支保护,无法管控 IaC 合并。 必须落实人工审查。
- MSDO 不能取代各语言的代码检查工具。 应分层使用。
- Defender DevOps Security 需要连接器,而且每个仓库都需要一位负责人。 否则发现的问题会被搁置。
常见反模式
- “在 GitHub Actions 中使用服务主体客户端密钥” — 这是大多数流水线泄露事件的根源。
- “为流水线 SP 授予订阅范围的 Contributor 权限” — 一个失误就可能导致整个订阅中断。
- “跳过 what-if;先部署 Bicep,看看会出什么问题” — 未经预览就变更生产环境。
- “Terraform 状态存放在默认存储帐户,且使用公共终结点” — 密钥暴露。
- “因为‘我们有 CI 扫描’,所以禁用了推送保护” — 在 CI 发现之前,密钥仍会泄露到历史记录中。
- “将操作固定到 @ main” — 供应链攻击会借此渗透。应固定到经验证的 SHA 或标签。
- “Terraform 使用随机的提供程序版本” — 相同代码,不同结果。
- “没有人负责处理 Defender DevOps Security 发现的问题” — 这与无人负责处理 Defender for Cloud 发现的问题如出一辙。
- “为保持稳定,在生产环境中禁用 GitOps 协调” — 配置漂移会变得不可见。
示例提示词
将我们所有 GitHub Actions Azure 部署中的客户端密钥服务主体迁移到 OIDC 联合,并固定环境主体。在 80 个仓库中推出 Microsoft Security DevOps,并在发现中危及以上级别的问题时阻止 PR。将 Azure DevOps 和 GitHub 组织连接到 Defender for Cloud DevOps Security,并建立逐仓库的负责人机制。加固 Terraform 后端存储:专用终结点、Customer Lockbox、RBAC、软删除。为 Landing Zone 的不可妥协要求编写 Azure Policy 拒绝模式策略,并在部署前的 PR 阶段进行评估。实施 Bicep 部署堆栈,并使用 denySettings 隔离生产环境的爆炸半径。配置漂移检测流水线:定期运行 Terraform plan、检查 Defender for Cloud 差异,并路由警报。加固供应链:将 GitHub Actions 固定到 SHA、在专用注册表中签署 Bicep 模块,并使用 cosign 对容器映像进行签名。
Microsoft Learn
- Defender for Cloud DevOps 安全性:https://learn.microsoft.com/azure/defender-for-cloud/defender-for-devops-introduction
- Microsoft Security DevOps(MSDO):https://learn.microsoft.com/azure/defender-for-cloud/azure-devops-extension
- 连接 GitHub:https://learn.microsoft.com/azure/defender-for-cloud/quickstart-onboard-github
- 连接 Azure DevOps:https://learn.microsoft.com/azure/defender-for-cloud/quickstart-onboard-devops
- Bicep 部署堆栈:https://learn.microsoft.com/azure/azure-resource-manager/bicep/deployment-stacks
- Bicep 模板规范:https://learn.microsoft.com/azure/azure-resource-manager/bicep/template-specs
- 工作负载标识联合(GitHub OIDC):https://learn.microsoft.com/entra/workload-id/workload-identity-federation
- 将 Azure Policy 作为代码:https://learn.microsoft.com/azure/governance/policy/concepts/policy-as-code
- Azure 上的 Terraform 最佳实践:https://learn.microsoft.com/azure/developer/terraform/overview
- GitHub Advanced Security:https://learn.microsoft.com/azure/devops/repos/security/configure-github-advanced-security-features
- Bicep Linter:https://learn.microsoft.com/azure/azure-resource-manager/bicep/linter