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
[](https://aws.amazon.com/cloudformation/)
[](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, 私有网络, 私有连接, 网络隔离, 零信任安全