JulietChinenyeDuru/aws-vpc-private-ec2-cloudformation

GitHub: JulietChinenyeDuru/aws-vpc-private-ec2-cloudformation

使用AWS CloudFormation自动化部署安全、私有的AWS VPC环境。

Stars: 0 | Forks: 0

# AWS 安全私有 VPC — 通过 SSM 会话管理器使用 EC2 [![CloudFormation](https://img.shields.io/badge/IaC-AWS%20CloudFormation-orange?logo=amazon-aws)](https://aws.amazon.com/cloudformation/) [![安全](https://img.shields.io/badge/Access-SSM%20Session%20Manager-blue?logo=amazon-aws)](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html) ## 概述 此项目使用单个 CloudFormation 模板配置了一个**完全私有、无互联网的 AWS 网络环境**。部署了一个 EC2 实例,**没有公共 IP 地址,没有开放的 SSH 端口,也没有互联网网关或 NAT 网关**,但仍然可以通过**AWS 系统管理器会话管理器**完全管理。 这种方法反映了现代**零信任安全**原则:而不是暴露堡垒主机或依赖密钥对 SSH 访问,所有实例管理都通过私有 VPC 接口端点路由,将攻击面减少到几乎为零。 ## 架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ AWS VPC (10.0.0.0/16) │ │ │ │ ┌──────────────────────┐ ┌──────────────────────────┐ │ │ │ Private Subnet 1 │ │ Private Subnet 2 │ │ │ │ (AZ1) 10.0.1.0/24 │ │ (AZ2) 10.0.2.0/24 │ │ │ │ │ │ │ │ │ │ ┌────────────────┐ │ │ (reserved for HA │ │ │ │ │ EC2 Instance │ │ │ workloads / scaling) │ │ │ │ │ t3.micro │ │ │ │ │ │ │ │ No public IP │ │ └──────────────────────────┘ │ │ │ └───────┬────────┘ │ │ │ │ │ HTTPS │ ┌──────────────────────────┐ │ │ │ ┌───────▼────────┐ │ │ VPC Interface Endpoints │ │ │ │ │ SSM Agent ├──┼───► com.amazonaws.*.ssm │ │ │ │ └────────────────┘ │ │ com.amazonaws.*.ssmmsg │ │ │ └──────────────────────┘ │ com.amazonaws.*.ec2msg │ │ │ └──────────┬─────────────── ┘ │ │ No Internet Gateway │ │ │ No NAT Gateway ┌────────────▼──────────────┐ │ │ No public subnets │ AWS SSM Service │ │ │ │ (AWS-managed plane) │ │ └───────────────────────────┴───────────────────────────┴─────┘ Engineer connects via: aws ssm start-session --target (No SSH keys, no open ports, no bastion host required) ``` ## 关键设计决策 | 决策 | 理由 | |------|-----------| | 无互联网网关 | 完全消除面向互联网的暴露 | | 无 NAT 网关 | 降低成本和攻击面;SSM 端点处理所有出站流量 | | 通过 SSH 使用 SSM | 没有端口 22,无需密钥管理,通过 CloudTrail 完全审计跟踪 | | VPC 接口端点 | 所有 SSM 流量都保持在 AWS 私有网络内 | | IAM 实例配置文件 | 最小权限:仅附加 `AmazonSSMManagedInstanceCore` 策略 | | 通过 SSM 参数的动态 AMI | 总是解析为最新的 Amazon Linux 2 AMI — 无硬编码 ID | | 多可用区私有子网 | 未来工作负载扩展的高可用性基础 | | 参数化 CIDR 块 | 无需修改模板即可跨环境重用 | ## 部署的资源 | 资源 | 类型 | 目的 | |------|------|---------| | VPC | `AWS::EC2::VPC` | 隔离网络(10.0.0.0/16) | | 私有子网 1 | `AWS::EC2::Subnet` | EC2 主机子网(AZ1) | | 私有子网 2 | `AWS::EC2::Subnet` | 高可用性/扩展子网(AZ2) | | 路由表 | `AWS::EC2::RouteTable` | 私有路由(无 0.0.0.0/0 路由) | | EC2 安全组 | `AWS::EC2::SecurityGroup` | 无入站规则;仅 HTTPS 出站 | | 端点安全组 | `AWS::EC2::SecurityGroup` | 限制 VPC 端点对 VPC CIDR 的访问 | | SSM VPC 端点 | `AWS::EC2::VPCEndpoint` | 到 SSM 服务的私有路径 | | SSMMessages VPC 端点 | `AWS::EC2::VPCEndpoint` | 会话管理器通信 | | EC2Messages VPC 端点 | `AWS::EC2::VPCEndpoint` | EC2 ↔ SSM 消息中继 | | IAM 角色 | `AWS::IAM::Role` | SSM 的 EC2 实例身份 | | IAM 实例配置文件 | `AWS::IAM::InstanceProfile` | 将 IAM 角色附加到 EC2 | | EC2 实例 | `AWS::EC2::Instance` | 私有计算,SSM 管理 | ## 先决条件 - 安装并配置 AWS CLI (`aws configure`) - 具有创建 VPC、EC2、IAM 和 CloudFormation 资源所需的 IAM 权限 - 在本地安装 AWS 会话管理器插件以进行终端访问: # macOS brew install --cask session-manager-plugin # Linux curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb" sudo dpkg -i session-manager-plugin.deb ## 部署 ### 选项 1 — AWS 控制台 1. 导航到 **云形成 → 创建堆栈 → 使用新资源** 2. 上传 `template.yaml` 3. 填写参数(可用区、CIDR 块、实例类型) 4. 确认 IAM 资源创建 5. 点击 **创建堆栈** ### 选项 2 — AWS CLI ``` aws cloudformation deploy \ --template-file template.yaml \ --stack-name private-vpc-ssm-demo \ --parameter-overrides \ ProjectName=private-vpc-demo \ Environment=dev \ AvailabilityZone1=eu-west-1a \ AvailabilityZone2=eu-west-1b \ InstanceType=t3.micro \ --capabilities CAPABILITY_NAMED_IAM \ --region eu-west-1 ``` ### 选项 3 — 从 Jupyter Notebook(boto3) 请参阅[`vpc-ec2-ssm-deployment.ipynb`](vpc-ec2-ssm-deployment.ipynb),了解使用 AWS Python SDK(boto3)进行分步部署的说明,包括堆栈创建、状态轮询和输出检索。 ## 连接到 EC2 实例 一旦部署了堆栈,就可以不使用 SSH 或堡垒主机进行连接: ``` # 从堆栈输出中检索实例ID INSTANCE_ID=$(aws cloudformation describe-stacks \ --stack-name private-vpc-ssm-demo \ --query "Stacks[0].Outputs[?OutputKey=='EC2InstanceId'].OutputValue" \ --output text) # 启动会话管理器会话 aws ssm start-session --target $INSTANCE_ID --region eu-west-1 ``` 您将直接在私有 EC2 实例上获得一个 shell — 无需 SSH 密钥,无需开放端口。 ## 参数参考 | 参数 | 默认值 | 描述 | |------|---------|-------------| | `ProjectName` | `private-vpc-demo` | 应用到所有资源名称的前缀 | | `Environment` | `dev` | 部署环境(`dev`、`staging`、`prod`) | | `VpcCidr` | `10.0.0.0/16` | VPC IP 地址范围 | | `PrivateSubnet1Cidr` | `10.0.1.0/24` | 子网 1 CIDR(AZ1) | | `PrivateSubnet2Cidr` | `10.0.2.0/24` | 子网 2 CIDR(AZ2) | | `AvailabilityZone1` | *(必需)* | 第一个 AZ(例如 `eu-west-1a`) | | `AvailabilityZone2` | *(必需)* | 第二个 AZ(必须与 AZ1 不同) | | `InstanceType` | `t3.micro` | EC2 实例大小 | | `AmiId` | 最新 Amazon Linux 2 | 通过 SSM 参数存储动态解析 | ## 堆栈输出 部署后,堆栈导出: | 输出 | 描述 | |------|-------------| | `VPCId` | VPC 资源 ID | | `PrivateSubnet1Id` | 子网 1 ID(可由其他堆栈导入) | | `PrivateSubnet2Id` | 子网 2 ID | | `EC2InstanceId` | SSM 连接的实例 ID | | `SSMConnectCommand` | 用于会话访问的即用 CLI 命令 | | `EC2SSMRoleArn` | IAM 角色ARN | ## 拆卸 完成操作后,为了避免持续收费,请删除堆栈: ``` aws cloudformation delete-stack \ --stack-name private-vpc-ssm-demo \ --region eu-west-1 ``` ## 安全态势摘要 此项目有意消除常见的云安全风险: - **无 SSH 暴露** — 永远不打开端口 22;无需密钥对 - **无公共 IP** — 实例无法从互联网访问 - **无互联网网关** — VPC 没有出站互联网路径 - **无 NAT 网关** — 移除常见的横向移动向量 - **完整审计跟踪** — 所有 SSM 会话都通过 AWS CloudTrail 记录 - **最小权限 IAM** — 仅附加 SSM 的最小管理策略 - **私有 DNS 解析** — VPC 端点使用私有 DNS 以防止流量离开 AWS 网络 ## 展示的技能 - AWS CloudFormation(基础设施即代码) - VPC 网络配置(子网、路由表、安全组) - AWS 系统管理器会话管理器 - VPC 接口端点(PrivateLink) - IAM 角色和实例配置文件 - 零信任访问设计 - 多可用区高可用性架构 - AWS CLI 和 boto3(Python SDK) ## 作者 **Juliet Chinenye Duru** DevOps / 云工程师 | Agentic AI 工程师 | NLP 研究员 [GitHub](https://github.com/JulietChinenyeDuru) · [ORCID: 0009-0002-0530-8082](https://orcid.org/0009-0002-0530-8082)
标签:AWS, CloudFormation, DPI, EC2, IaC, PB级数据处理, SSM Session Manager, VPC, 云自动化, 可用区, 子网, 安全架构, 安全访问, 安全运维, 无SSH端口, 无公网IP, 私有网络, 私有连接, 网络隔离, 零信任安全