面向JD学习AWS云安全6:基于IaC的安全基线构建

admin 2026-01-08 02:15:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文介绍了利用Terraform和AWSCloudShell构建AWS安全基线的实战项目,演示了通过IaC配置安全VPC、加密S3存储桶及CloudTrail。文章强调了IaC在确保默认安全、一致性及防止配置漂移中的关键作用,提供了完整代码与部署流程,旨在帮助学习者掌握云安全工程技能。 综合评分: 86 文章分类: 云安全,安全建设


cover_image

面向JD学习AWS云安全6:基于IaC的安全基线构建

Dubito

云原生安全指北

2026年1月7日 08:36 江苏

注:本文翻译自 LaTerral Williams[1] 的文章《🔒 Building a Secure AWS Environment with Terraform + AWS CloudShell》[2],可点击文末“阅读原文”按钮查看英文原文。

全文如下:

⭐ 我为什么构建这个项目

(项目 6/6:Terraform 安全模块:使用基础设施即代码构建安全的 AWS 基线)

与孤立地学习云安全概念不同,我将 真实的职位描述 作为路线图,并动手构建直接映射到云安全、云运维和安全工程师角色的项目。

这个包含 6 部分的系列专注于实用的云安全技能,包括:

  • • 身份强化与多因素认证(MFA)强制执行
  • • IAM 治理与访问权限审计
  • • 云资源的持续监控
  • • 错误配置检测与漂移分析
  • • 日志分析、审计就绪与证据收集
  • • 基础设施即代码(IaC)安全基线与防护栏
  • • 利用 AWS 组织和服务控制策略(SCPs)实现大规模防护栏
  • • 威胁检测、异常监控与事件分级处理

每个项目都旨在反映真实世界的职责,而不仅仅是理论学习。

📌 项目系列概览

注:其他项目见同期发布的其他文章

👉 项目 1: AWS IAM 强化:加强身份边界并提升认证安全状况

👉 项目 2: 使用 Security Hub + AWS Config 进行云安全态势管理(CSPM)

👉 项目 3: 使用 GuardDuty + CloudTrail 实现类似 CASB 的监控,专注于异常、委托管理员和安全威胁模拟

👉 项目 4: 使用 AWS Config 进行漂移检测,包括托管规则、EventBridge 路由、标签和可选的修复

👉 项目 5: 使用 Athena + QuickSight 进行日志分析与仪表板构建,将原始 CloudTrail 日志转化为可操作的安全洞察

👉 项目 6: (本项目):Terraform 安全模块,使用基础设施即代码(Infrastructure as Code,IaC)构建安全的 AWS 基线

🧱 为什么这个项目很重要

在真实的云环境中,安全并非始于控制台,而是始于代码

现代云安全团队依赖 基础设施即代码(IaC) 工具(如 Terraform)来确保环境满足以下要求:

  • • 默认安全
  • • 跨部署环境一致
  • • 可审计与可审查
  • • 抵抗配置漂移

本项目专注于使用 Terraform 来定义和部署一个安全的 AWS 基础架构,包括:

  • • 一个基线 VPC 配置
  • • 一个安全的 S3 存储桶,启用了加密、版本控制并阻止了公共访问
  • • 通过代码强制执行的 CloudTrail 日志记录

本项目展示了如何将安全控制措施做到:

  • • 版本控制
  • • 同行评审
  • • 按需重新部署
  • • 在配置错误时自动恢复

你还将了解 Terraform 如何帮助检测和防止漂移,这是在受监管和企业级云环境中的一项关键要求。

为了使项目易于上手且成本低廉,我们使用 AWS CloudShell 执行 Terraform。这消除了本地安装的挑战(尤其是在 Windows ARM 系统上),同时仍遵循真实的 DevSecOps 工作流程。

在本项目结束时,你将拥有一个可重复、安全的 AWS 基线,完全由代码定义。这是一个强大的结业项目,将整个系列中涉及的身份、监控、日志和治理概念整合在一起,并直接契合云安全和云运维岗位的期望。


对新手友好 | 有趣 | 技术性强 | 真实的云安全项目

欢迎来到 项目 6 – Terraform 安全模块。在这里,你将学习如何使用 TerraformAWS CloudShell 以及一个反映真实云安全工程的工作流,来构建一个安全的 AWS 基线。

本指南有趣、实用,非常适合那些想获得实践云安全经验而又不想花费高昂成本的新手。

一、简介 🌟

Terraform 是云生态系统中最强大的基础设施即代码(IaC)工具之一。

但在本地安装 Terraform,尤其是在 Windows ARM 设备上,可能会变得很复杂。

因此,我们选择了 有趣对新手友好零烦恼 的途径:

🎉 直接在 AWS CloudShell 中运行 Terraform,它预配置了 AWS 凭证和 Linux 环境,与真实的 DevOps 团队使用的方式完全一致。

二、为什么这个项目很重要 🔐

你将使用 Terraform 创建三个核心的安全组件:

  • • 一个 VPC(Virtual Private Cloud)
  • • 一个用于存储 CloudTrail 日志的安全的 S3 存储桶
  • • 一个用于审计 AWS 活动的 CloudTrail 追踪

这些是云安全运维合规性威胁检测的基础。

整个环境具有以下特点:

✔ 免费或成本极低

✔ 使用 IaC 可完全重复部署

✔ 可在几分钟内销毁

✔ 非常适合作品集展示

三、前提条件 🧰

  • • AWS 账户
  • • 对 AWS 控制台有基本了解
  • • 浏览器(用于访问 CloudShell)
  • • 可选:用于代码编辑的 VS Code

无需 Terraform 账户。

无需在笔记本电脑上进行任何安装。

四、使用 VS Code 与 AWS CloudShell 💻

可以在本地使用 VS Code 编写 Terraform 代码,但 ARM64 Windows 设备没有原生的 Terraform 二进制文件。

因此,推荐的方法是:

🥇 使用 VS Code 进行编辑

🥇 使用 AWS CloudShell 运行 Terraform

CloudShell 为你提供:

  • • Linux 环境
  • • 预安装(或可安装)的 Terraform
  • • 预配置的 IAM 身份验证
  • • 安全的沙盒环境

这种组合为你提供了真实的 DevSecOps 工作流

五、设置 AWS CloudShell ☁️

  1. 1. 登录 AWS 控制台
  2. 2. 点击右上角的 CloudShell 终端图标
  3. 3. CloudShell 将在 AWS 内打开一个终端
  4. 4. 检查 Terraform 是否已安装:
terraform version

如果未安装 Terraform:

  • • 运行 uname -m 检测系统架构
  • • 使用最新的 ARM64 或 AMD64 Linux 二进制文件安装 Terraform
sudo yum install -y wget unzip

TERRAFORM_VERSION="1.14.2"

//在本项目进行时,**1.14.2** 是 Terraform 的最新版本。

wget https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip

unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip

sudo mv terraform /usr/local/bin/

terraform version

六、创建 Terraform 项目结构 📁

在 CloudShell 中执行:

mkdir terraform-security-module
cd terraform-security-module

推荐的真实项目文件夹结构如下:

terraform-security-module/
│
├── main.tf
├── variables.tf
├── outputs.tf
├── versions.tf
└── .gitignore

添加一个 .gitignore 文件,内容如下:

.terraform/
terraform.tfstate
terraform.tfstate.backup
*.backup

七、编写 Terraform 配置文件 🛠

以下是部署一个安全的 AWS 基线所需的完整配置。

🔹 versions.tf

terraform {
  required_version = ">= 1.5.0"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = var.aws_region
}

🔹 variables.tf

variable "aws_region" {
  description = "AWS region to deploy into"
  type        = string
  default     = "us-east-1"
}

variable "project_name" {
  description = "Prefix for all resource names"
  type        = string
  default     = "tf-security-demo"
}

🔹 main.tf

包含:

  • • VPC
  • • S3 存储桶
  • • 公有访问阻止
  • • 版本控制
  • • 加密
  • • 存储桶策略
  • • CloudTrail

注意:我添加了注释来说明每个部分应完成的功能。

// 创建一个基础的 VPC

resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

  tags = {
    Name        = "${var.project_name}-vpc"
    Environment = "lab"
    ManagedBy   = "terraform"
  }
}

// 生成唯一后缀以避免存储桶名称冲突

resource "random_id" "suffix" {
  byte_length = 4
}

// 创建存储桶

resource "aws_s3_bucket" "cloudtrail_logs" {
  bucket = "${var.project_name}-cloudtrail-logs-${random_id.suffix.hex}"

  tags = {
    Name        = "${var.project_name}-cloudtrail-logs"
    Environment = "lab"
    ManagedBy   = "terraform"
  }
}

// 阻止所有公有访问

resource "aws_s3_bucket_public_access_block" "cloudtrail_logs" {
  bucket                  = aws_s3_bucket.cloudtrail_logs.id
  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

// 启用版本控制

resource "aws_s3_bucket_versioning" "cloudtrail_logs" {
  bucket = aws_s3_bucket.cloudtrail_logs.id

  versioning_configuration {
    status = "Enabled"
  }
}

// 启用加密(SSE-S3)

resource "aws_s3_bucket_server_side_encryption_configuration" "cloudtrail_logs" {
  bucket = aws_s3_bucket.cloudtrail_logs.id

  rule {
    apply_server_side_encryption_by_default {
      sse_algorithm = "AES256"
    }
  }
}

// 为 CloudTrail 创建存储桶策略

data "aws_caller_identity" "current" {}

resource "aws_s3_bucket_policy" "cloudtrail_logs" {
  bucket = aws_s3_bucket.cloudtrail_logs.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid = "AWSCloudTrailAclCheck"
        Effect = "Allow"
        Principal = {
          Service = "cloudtrail.amazonaws.com"
        }
        Action   = "s3:GetBucketAcl"
        Resource = aws_s3_bucket.cloudtrail_logs.arn
      },
      {
        Sid = "AWSCloudTrailWrite"
        Effect = "Allow"
        Principal = {
          Service = "cloudtrail.amazonaws.com"
        }
        Action   = "s3:PutObject"
        Resource = "${aws_s3_bucket.cloudtrail_logs.arn}/AWSLogs/${data.aws_caller_identity.current.account_id}/*"
        Condition = {
          StringEquals = {
            "s3:x-amz-acl" = "bucket-owner-full-control"
          }
        }
      }
    ]
  })
}

// 创建一个 CloudTrail 追踪

resource "aws_cloudtrail" "main" {
  name                          = "${var.project_name}-trail"
  s3_bucket_name                = aws_s3_bucket.cloudtrail_logs.id
  include_global_service_events = true
  is_multi_region_trail         = true
  enable_logging                = true

  event_selector {
    read_write_type           = "All"
    include_management_events = true
  }

  depends_on = [
    aws_s3_bucket_policy.cloudtrail_logs,
    aws_s3_bucket_public_access_block.cloudtrail_logs
  ]

  tags = {
    Name        = "${var.project_name}-trail"
    Environment = "lab"
    ManagedBy   = "terraform"
  }
}

🔹 outputs.tf

output "vpc_id" {
  value = aws_vpc.main.id
}

output "cloudtrail_logs_bucket" {
  value = aws_s3_bucket.cloudtrail_logs.bucket
}

output "cloudtrail_trail_name" {
  value = aws_cloudtrail.main.name
}

output "region" {
  value = var.aws_region
}

八、在 CloudShell 中初始化 Terraform ⚙️

运行:

terraform init
terraform validate

你的环境现在已经准备就绪。

九、规划与部署 🚀

预览 Terraform 将要创建的资源:

terraform plan -out tfplan

部署基础设施:

terraform apply tfplan

Terraform 将部署:

  • • 一个新的安全 VPC
  • • 一个支持 CloudTrail 的 S3 存储桶
  • • 加密 + 版本控制 + 公有访问阻止配置
  • • 一个 CloudTrail 追踪

十、验证部署 🔍

10.1 检查 VPC

登录 AWS 控制台 → 进入 VPC 服务 → 查看「您的 VPC」 → 查找名称为 tf-security-demo-vpc 的 VPC。

10.2 检查 S3

检查以下项目是否已配置: ✔ 版本控制已启用 ✔ AES-256 加密已启用 ✔ Public Access Block = ON(公有访问阻止选项开启)

10.3 检查 CloudTrail

登录 AWS 控制台 → 进入 CloudTrail 服务 → 查看「Trails 追踪」 → 你的追踪应处于活动状态。

十一、清理资源 🧹

务必运行以下命令以避免产生费用:

terraform destroy

系统提示时,输入 yes 确认。

CloudShell 将移除:

  • • CloudTrail
  • • S3 存储桶
  • • VPC

十二、故障排除技巧 🛠

❗ 找不到 Terraform

在 CloudShell 中手动安装 Terraform,首先运行:

uname -m

❗ 权限被拒绝

确保你的 IAM 用户拥有以下权限:

  • • 创建 S3 存储桶的权限
  • • CloudTrail 权限
  • • VPC 权限

❗ S3 存储桶名称已存在

使用随机后缀:

resource "random_id" "suffix" {
  byte_length = 4
}

十三、最终总结 🎉

你刚刚构建了一个:

  • • 安全的 AWS 日志记录架构
  • • 使用了 Terraform
  • • 在 AWS CloudShell 内部完成
  • • 无需在本地安装任何软件

这是专业级的 IaC 实践经验,非常适用于:

  • • 云安全
  • • DevOps
  • • 安全运营中心(SOC)岗位
  • • 作品集项目

引用链接

[1] LaTerral Williams: https://linkedin.com/in/ldwit [2] 《🔒 Building a Secure AWS Environment with Terraform + AWS CloudShell》: https://dev.to/ldwit/building-a-secure-aws-environment-with-terraform-aws-cloudshell-54b0

交流群


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:云原生安全指北 Dubito《面向JD学习AWS云安全6:基于IaC的安全基线构建》

认人 网络安全文章

认人

文章总结: 该文档仅包含图片占位符及标题认人,作者署名为Khan安全团队,发布时间为2026年1月7日,地点在海南。文档缺失正文内容,无任何技术细节、安全观点或
评论:0   参与:  0