关于 iac-security
iac-security 是一项基础设施即代码安全扫描技能,用于在部署前发现配置错误并指导修复。它支持多种 IaC 格式,并涵盖严重性分析与复扫验证。
主要功能
- 01扫描 Terraform、Kubernetes 和云模板
- 02支持 Terraform 计划与变量文件
- 03按严重性和安全领域归类问题
- 04提供安全配置修改建议
- 05复扫以验证修复结果
适用场景
- 01应用基础设施变更前查找配置错误
- 02按严重性和领域排列 IaC 问题
- 03检查配置修复是否消除问题
MCP 相关
该技能说明如何使用 `snyk_iac_scan` 工具扫描基础设施即代码。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ snyk/ studio-recipes --skill iac-security安装后在 Claude Code 中输入/iac-security确认已加载。
附带文件references/kubernetes-security-patterns.mdreferences/terraform-security-patterns.md
详细介绍
基础设施即代码安全
全面扫描基础设施即代码,及时发现配置错误,防止其演变为生产环境漏洞。
核心原则:在代码中修复安全问题,比在生产环境中修复成本更低。
快速开始
1. Identify IaC files (Terraform, K8s, CloudFormation, ARM)
2. Run snyk_iac_scan on the directory
3. Analyze misconfigurations by severity
4. Provide secure configuration alternatives
支持的 IaC 格式
| 平台 | 文件类型 |
|---|---|
| Terraform | .tf、.tf.json、.tfvars |
| Terraform Plan | JSON 计划输出(terraform show -json) |
| Kubernetes | 包含 apiVersion 和 kind 的 .yaml / .yml |
| Helm | Chart 模板(需要 Chart.yaml) |
| AWS CloudFormation | 包含 AWSTemplateFormatVersion 的 .json / .yaml |
| Azure ARM | 包含 $schema ARM URL 的 .json |
| Serverless Framework | serverless.yml |
阶段 1:发现
目标:识别所有需要扫描的 IaC 文件。
检查以下标志以确认 IaC 类型:
- Terraform:
.tf文件、terraform.tfstate、provider块 - Kubernetes:包含
apiVersion/kind的 YAML,名称为k8s、manifests的目录 - CloudFormation:
AWSTemplateFormatVersion键,以及包含 AWS 类型的Resources节 - Azure ARM:包含
deploymentTemplate的$schema
然后确定扫描范围:单个文件、目录或递归扫描。
阶段 2:执行扫描
目标:运行适当的 IaC 安全扫描。
基本扫描
Run snyk_iac_scan with:
- path: <directory or file path>
带变量的 Terraform
Run snyk_iac_scan with:
- path: <terraform directory>
- var_file: <path to .tfvars if using variables>
Terraform Plan(更准确)
terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
Run snyk_iac_scan with:
- path: tfplan.json
- scan: "planned-values" # or "resource-changes"
自定义规则
Run snyk_iac_scan with:
- path: <directory>
- rules: <path to custom rules bundle>
阶段 3:分析结果
目标:理解并分类配置错误。
严重性评估
| 严重性 | 风险级别 | 示例 |
|---|---|---|
| 严重 | 即时风险 | S3 公开访问、开放的安全组 |
| 高 | 显著风险 | 缺少加密、权限过多 |
| 中 | 中等风险 | 缺少日志记录、IAM 权限过宽 |
| 低 | 最佳实践 | 缺少标签、配置未优化 |
生成摘要
## IaC Security Scan Results
### Overview
| Severity | Count | Status |
|----------|-------|--------|
| Critical | X | 🔴 Block |
| High | Y | 🟠 Fix Required |
| Medium | Z | 🟡 Recommended |
| Low | W | 🔵 Optional |
### Critical Issues
| Resource | Issue | Location |
|----------|-------|----------|
| aws_s3_bucket.data | Public access enabled | main.tf:45 |
| aws_security_group.web | Open to 0.0.0.0/0 on port 22 | network.tf:23 |
### High Issues
| Resource | Issue | Location |
|----------|-------|----------|
| aws_rds_instance.db | Encryption not enabled | database.tf:12 |
按领域分类
将问题分组,以便更轻松地修复:
- 网络安全:安全组、网络 ACL、负载均衡器配置、VPC 设置
- 数据保护:静态/传输中加密、备份配置、密钥管理
- 访问控制:IAM 策略、服务账号、RBAC 设置、API 权限
- 日志记录与监控:CloudTrail / 审计日志、访问日志、告警配置
阶段 4:修复
目标:提供安全的配置修复方案。对每个发现的问题应用以下模式;下方提供了代表性示例。
Terraform 修复
S3 存储桶 — 阻止公开访问
# Insecure
resource "aws_s3_bucket" "data" {
bucket = "my-bucket"
}
# Secure
resource "aws_s3_bucket" "data" {
bucket = "my-bucket"
}
resource "aws_s3_bucket_public_access_block" "data" {
bucket = aws_s3_bucket.data.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
安全组 — 限制访问
# Insecure - open to world
resource "aws_security_group" "web" {
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"] # BAD
}
}
# Secure - restricted to VPN/internal range
resource "aws_security_group" "web" {
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["10.0.0.0/8"]
}
}
RDS — 启用加密
# Secure
resource "aws_db_instance" "main" {
engine = "postgres"
instance_class = "db.t3.micro"
storage_encrypted = true
kms_key_id = aws_kms_key.rds.arn
deletion_protection = true
}
Kubernetes 修复
Pod 安全 — 使用非 Root 用户并设置资源限制
apiVersion: v1
kind: Pod
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
containers:
- name: app
image: myapp
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "200m"
memory: "256Mi"
网络策略 — 限制流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-network-policy
spec:
podSelector:
matchLabels:
app: myapp
policyTypes:
- Ingress
- Egress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: allowed-namespace
CloudFormation 修复
S3 存储桶 — 加密并阻止公开访问
Resources:
DataBucket:
Type: AWS::S3::Bucket
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: aws:kms
KMSMasterKeyID: !Ref DataBucketKey
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
阶段 5:验证
目标:确认修复有效。
更改后重新扫描
Run snyk_iac_scan with:
- path: <same directory>
对于 Terraform,重新生成并扫描计划:
terraform plan -out=tfplan.new
terraform show -json tfplan.new > tfplan.new.json
报告改进情况
## Fix Verification
| Severity | Before | After | Change |
|----------|--------|-------|--------|
| Critical | 2 | 0 | -2 ✅ |
| High | 5 | 1 | -4 ✅ |
| Medium | 8 | 6 | -2 ✅ |
### Remaining Issues
- 1 High: Third-party module - opened issue
- 6 Medium: Accepted risk (documented)
最佳实践
预防
- 在 CI/CD 中扫描:发现严重问题时,让构建失败
- 提交前钩子:在提交前发现问题
- 模块安全:扫描可复用模块
- 策略即代码:为组织标准定义自定义规则
策略文件用法
创建 .snyk 以管理例外:
ignore:
SNYK-CC-TF-123:
- '*':
reason: 'Accepted risk - internal development environment'
expires: 2025-06-01
created: 2024-01-15
自定义规则
针对组织特定要求:
- 使用 Rego(OPA)格式编写规则
- 打包为
.tar.gz - 使用
--rules选项传递给扫描命令
错误处理
| 错误 | 解决方案 |
|---|---|
| 无法读取 Terraform 状态 | 运行 terraform init;检查状态后端;直接扫描 .tf 文件 |
| HCL 语法无效 | 运行 terraform validate;检查语法;确保已定义所有变量 |
| 无法解析计划文件 | 使用 terraform show -json 重新生成;检查 Terraform 版本兼容性;验证 JSON 是否有效 |
约束
- 先扫描再应用:绝不应用未经扫描的 IaC
- 阻止存在严重问题的操作:必须修复严重问题
- 记录例外情况:使用
.snyk策略接受风险 - 验证计划:对于 Terraform,优先扫描计划而非文件
- 持续监控:依赖项更新时重新扫描
评论
支持 Markdown