文章总结: 本文介绍了利用Terraform和AWSCloudShell构建AWS安全基线的实战项目,演示了通过IaC配置安全VPC、加密S3存储桶及CloudTrail。文章强调了IaC在确保默认安全、一致性及防止配置漂移中的关键作用,提供了完整代码与部署流程,旨在帮助学习者掌握云安全工程技能。 综合评分: 86 文章分类: 云安全,安全建设
面向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 安全模块。在这里,你将学习如何使用 Terraform、AWS 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. 登录 AWS 控制台
- 2. 点击右上角的 CloudShell 终端图标
- 3. CloudShell 将在 AWS 内打开一个终端
- 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的安全基线构建》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。





![Libra[天秤座]|网站篡改、暗链、死链监测平台](/images/random/titlepic/13.jpg)


评论