mcpField
I
iac-security

iac-security

github.com/snyk安全68151 次安装1 周前更新
代码仓库

关于 iac-security

iac-security 是一项基础设施即代码安全扫描技能,用于在部署前发现配置错误并指导修复。它支持多种 IaC 格式,并涵盖严重性分析与复扫验证。

主要功能

  1. 01扫描 Terraform、Kubernetes 和云模板
  2. 02支持 Terraform 计划与变量文件
  3. 03按严重性和安全领域归类问题
  4. 04提供安全配置修改建议
  5. 05复扫以验证修复结果

适用场景

  1. 01应用基础设施变更前查找配置错误
  2. 02按严重性和领域排列 IaC 问题
  3. 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 PlanJSON 计划输出(terraform show -json)
Kubernetes包含 apiVersion 和 kind 的 .yaml / .yml
HelmChart 模板(需要 Chart.yaml)
AWS CloudFormation包含 AWSTemplateFormatVersion 的 .json / .yaml
Azure ARM包含 $schema ARM URL 的 .json
Serverless Frameworkserverless.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)

最佳实践

预防
  1. 在 CI/CD 中扫描:发现严重问题时,让构建失败
  2. 提交前钩子:在提交前发现问题
  3. 模块安全:扫描可复用模块
  4. 策略即代码:为组织标准定义自定义规则
策略文件用法

创建 .snyk 以管理例外:

ignore:
  SNYK-CC-TF-123:
    - '*':
        reason: 'Accepted risk - internal development environment'
        expires: 2025-06-01
        created: 2024-01-15
自定义规则

针对组织特定要求:

  1. 使用 Rego(OPA)格式编写规则
  2. 打包为 .tar.gz
  3. 使用 --rules 选项传递给扫描命令

错误处理

错误解决方案
无法读取 Terraform 状态运行 terraform init;检查状态后端;直接扫描 .tf 文件
HCL 语法无效运行 terraform validate;检查语法;确保已定义所有变量
无法解析计划文件使用 terraform show -json 重新生成;检查 Terraform 版本兼容性;验证 JSON 是否有效

约束

  1. 先扫描再应用:绝不应用未经扫描的 IaC
  2. 阻止存在严重问题的操作:必须修复严重问题
  3. 记录例外情况:使用 .snyk 策略接受风险
  4. 验证计划:对于 Terraform,优先扫描计划而非文件
  5. 持续监控:依赖项更新时重新扫描

评论

支持 Markdown