数据安全至关重要。Amazon Web Services (AWS) 提供了多种解决方案和最佳实践来帮助保护数据的安全。了解如何做出最佳决策来保护数据的安全,这项任务可能具有挑战性。在无路由指向互联网的私有子网中运行应用程序,可将攻击面限制为仅限内部流量,从而实现数据安全。该策略是一项很好的安全措施。但是,当应用程序必须从 Amazon Simple Storage Service (Amazon S3)
等服务访问数据时,可能会出现问题。
为了解决此类问题,AWS 提供了 Amazon Virtual Private Cloud (Amazon VPC) 终端节点
。使用 VPC 终端节点,您可以通过私密方式将 VPC 连接到受支持的 AWS 服务。**这种私密连接无需互联网网关、NAT 网关、VPN 连接或 AWS Direct Connect 连接即可实现。**通过 VPC 终端节点进行通信时,不需要使用 VPC 中的资源即可获取公有 IP 地址。这样,通过 VPC 终端节点的流量就能保持在 Amazon 网络内。
在本实验中,将创建 VPC 终端节点。然后,将使用这些终端节点从位于私有子网的 Amazon Elastic Compute Cloud (Amazon EC2) 实例访问 Amazon S3。要进一步提高数据安全性,可以创建 VPC 终端节点策略,仅限特定资源使用终端节点。
完成本实验后,将能够:
在本实验中,已创建包含公有子网和私有子网的 VPC。私有子网路由表不包括 NAT 网关或互联网网关。因此,在私有子网中启动的资源无法与公共互联网或任何通过公共互联网传输数据的 AWS 服务进行通信。
本实验将演示 VPC 终端节点的工作原理。为此,已在公有子网中启动了 EC2 实例,并在私有子网中启动了相同的 EC2 实例。VPC 终端节点允许来自私有 EC2 实例的流量访问需要公有路由的 AWS 服务。为了验证这一结果,本实验已经创建了一个 Amazon S3 存储桶,其中包含一个演示文件。
在此任务中,将查看预置的实验资源。这些资源包括 VPC、子网、Amazon S3 存储桶和 Amazon EC2 实例。还可以创建 VPC 终端节点,以允许 AWS Systems Manager Session Manager 访问实例。
下图显示了为本实验任务预置的所有资源以及这些资源的连接方式:
labVPC
PublicSubnetA
配置了互联网关,可以向外通信。PrivateSubnetA
没有配置互联网关不能向外通信。PublicRouteTable
子网关联情况PrivateRouteTable
子网关联情况通过控制台,导航至EC2
控制面板,查看云实例。
HTTPS-SSM-ENDPOINT
安全组。Session Manager
可以直接连接到实例。会话管理器
,可以连接到该云主机实例。ls
此时将显示一条错误消息:"We weren't able to connect to your instance."
。这时,要使用 Session Manager
连接实例,可以创建接口终端节点。
可以将 Systems Manager 配置为使用接口 virtual private cloud (VPC) 终端节点,进一步改善托管节点的安全态势。AWS PrivateLink
将托管节点、Systems Manager
和 Amazon EC2
之间的所有网络流量限定为 Amazon 网络。这一限制让您无需在私有 EC2 实例上进行任何出站互联网访问。
Session Manager
终端节点,以便能够在不使用互联网网关或 NAT 网关的情况下连接到私有 EC2 实例。
- 在 Name tag - optional(名称标签 – 可选)框内输入
SSM Endpoint
。- 在 Service Name(服务名称)筛选框中,输入
ssm
并按 Enter 键。- 选择 com.amazonaws.REGION.ssm,其中 REGION 是您从中启动实验的区域。
- 对于 VPC,从下拉菜单中选择 labVPC。
可用
状态就可以访问使用。PrivateCommandHost
云实例。连接到公有实例和私有实例,并尝试在不使用 Amazon S3 VPC 端点的情况下从每个实例访问 Amazon S3 存储桶中的文件。
cd ~
命令:为了帮助区分 AWS CLI 中的命令和输出,请运行以下命令。此命令将在屏幕上显示的任何输出之前添加一个空行:
trap 'printf "\n"' DEBUG
还可以通过导出 PS1 变量来更改命令提示符,使输出更易于阅读。
命令:要执行此操作,请运行以下命令:
export PS1="\n[\u@\h \W] $ "
命令:要配置 AWS CLI,请运行以下命令:
aws configure
命令:出现提示时,配置以下各项:
- AWS Access Key ID [None](AWS 访问密钥 ID [无]):按 Enter 键
- AWS Secret Access Key [None](AWS 秘密访问密钥[无]):按 Enter 键
- Default region name [None](默认区域名称 [无]):复制并粘贴 Region(区域)值
- Default output format [None](默认输出格式 [无]):json
(可选)注意:如果收到内容为 Partial credentials found in shared-credentials-file, missing: aws_secret_access_key(在 shared-credentials-file 中发现部分凭证,缺少:aws_secret_access_key)的错误消息,请运行以下命令删除凭证文件,并重新执行 aws configure
命令。否则,请继续下一步。
rm ~/.aws/credentials
命令:列出在账户中有权访问的 S3 存储桶,请运行以下命令:
aws s3 ls
命令:要列出 LabBucket 中的所有文件,请运行以下命令。将 替换为LabBucket的相应值:
aws s3 ls s3://<LabBucket>
labstack-2848353a-a5d2-4c70-b586-997e2b-labbucket-c72jm1b2ozlq
labstack-2848353a-a5d2-4c70-b586-labloggingbucket-1ctuk4k4ixe1
命令:要将该文件从 Amazon S3 复制到本地主目录,请运行以下命令。将 替换为LabBucket的相应值:
aws s3 cp s3://<LabBucket>/demo.txt ~/
labstack-2848353a-a5d2-4c70-b586-997e2b-labbucket-c72jm1b2ozlq
命令:要将该文件的内容显示到屏幕上,请运行以下命令:
less demo.txt
已能够将文件从 Amazon S3 下载到公有实例。键入q
以退出编辑器。接下来,从主目录中修改此文件,并将其重新上传到 LabBucket。
命令:要向该文件添加文本并将更新后的文件内容显示在屏幕上,请运行以下命令:
echo "
This is some non-unique text that will be appended to your file." >> demo.txt
less demo.txt
命令:要将更新后的文件重新上传回 Amazon S3,请运行以下命令。将 替换为LabBucket的相应值:
aws s3 cp demo.txt s3://<LabBucket>/
labstack-2848353a-a5d2-4c70-b586-997e2b-labbucket-c72jm1b2ozlq
切换到显示 AWS 管理控制台的浏览器标签页。在存储桶列表中,选择与实验页面左侧的 LabBucket 值匹配的存储桶名称。选择 demo.txt 文件的名称。选择 Open(打开)。该文件将在新的浏览器标签页中打开。已从公有实例成功更新了该文件。注意:如果该文件未在浏览器标签页中打开,请确保未阻止弹出窗口。
![image-20230831171133573](https://img-blog.csdnimg.cn/img_convert/bcc93fda9122a095626892183e1ce533.png
接下来,对位于私有子网中的实例运行相同的命令,该子网没有指向互联网的路由。Amazon S3 不在 VPC 中;如果没有指向互联网的路由,将无法访问存储桶。这也意味着,从公有实例向 Amazon S3 发出的所有请求都需要一条指向互联网的路由,才能访问公有 Amazon S3 终端节点。
命令:要访问主目录,请运行以下命令:
cd ~ && trap 'printf "\n"' DEBUG && export PS1="\n[\u@\h \W] $ " && aws configure
大约 5 分钟后,该命令会超时。等待约五分钟,按 ctrl + c
中断该进程,避免超时。私有实例没有指向 Amazon S3 的路由,因为没有互联网网关、NAT 网关或 VPC 终端节点。
在此任务中,将创建 VPC 网关端点以从私有实例访问 Amazon S3。您可以使用 AWS CLI 来运行命令并创建端点。要使 AWS CLI 能够与 VPC 外部的资源(即全局 AWS 服务)进行通信,需要从公有实例运行命令。
下图显示了为本实验任务预置的所有资源以及这些资源的连接方式:
切换回到用于连接公有实例的标签页。
要列出已为其创建 VPC 终端节点的服务,请运行以下命令:
aws ec2 describe-vpc-endpoints --query 'VpcEndpoints[*].ServiceName'
命令:要查找 labVPC 的 VPC ID,请运行以下命令:
VPC=$(aws ec2 describe-vpcs --query 'Vpcs[*].VpcId' --filters 'Name=tag:Name, Values=labVPC' | jq -r '.[0]')
echo $VPC
此命令使用 JQ 来处理 JSON 输出,并对其采用正确的格式以备日后使用。
命令:要查找私有路由表的路由表 ID,请运行以下命令:
RTB=$(aws ec2 describe-route-tables --query 'RouteTables[*].RouteTableId' --filters 'Name=tag:Name, Values=PrivateRouteTable' | jq -r '.[0]')
echo $RTB
✨命令✨:要创建 Amazon S3 终端节点,请运行以下命令:
export AWS_REGION=$(curl -s 169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
echo $AWS_REGION
aws ec2 create-vpc-endpoint \
--vpc-id $VPC \
--service-name com.amazonaws.$AWS_REGION.s3 \
--route-table-ids $RTB
注意:上述命令中加入了反斜线,以作为多行命令运行。
Amazon S3 VPC 终端节点现已创建完成。
命令:要验证 Amazon S3 VPC 终端节点是否已创建,请运行以下命令:
aws ec2 describe-vpc-endpoints --query 'VpcEndpoints[*].ServiceName'
此时 Amazon S3 终端节点已显示在列表中。
在此任务中,将使用位于私有子网中的实例,该实例之前无法访问 Amazon S3。现在已创建 Amazon S3 终端节点并将其与私有子网所关联的路由表关联,因此无需使用公共资源,即可直接访问 Amazon S3,如下图所示:
切换到用于连接私有实例的标签页。
要列出在账户中有权访问的 S3 存储桶,请运行以下命令:
aws s3 ls
命令:要列出 LabBucket 中的所有文件,请运行以下命令。将 替换为LabBucket的相应值:
aws s3 ls s3://
labstack-2848353a-a5d2-4c70-b586-997e2b-labbucket-c72jm1b2ozlq
此命令将显示一个列表,其中包含与您之前从控制台看到的 S3 存储桶中的文件相匹配的文件。
命令:要显示实例主目录中的文件列表,请运行以下命令:
cd ~
ls -l
请注意,此目录中没有本地文件,因为之前已将文件从 S3 下载到公有实例,现在已连接到私有实例。
命令:要将该文件从 Amazon S3 复制到本地主目录,请运行以下命令。将 替换为LabBucket的相应值:
aws s3 cp s3://<LabBucket>/demo.txt ~/
labstack-2848353a-a5d2-4c70-b586-997e2b-labbucket-c72jm1b2ozlq
命令:要将该文件的内容显示到屏幕上,请运行以下命令:
less demo.txt
现在有了 Amazon S3 VPC 终端节点,就可以从私有实例上的 Amazon S3 中下载文件。
借助 VPC 网关终端节点,可以指定限制访问权限的策略。使用终端节点策略,您可以准确指定允许私有子网中的实例访问哪些 Amazon S3 存储桶。例如,策略允许提供对数据存储桶的访问权限,但限制对日志记录存储桶的访问。
使用控制台或 AWS CLI 向 Amazon S3 VPC 网关终端节点添加策略,以允许访问 labbucket,但拒绝访问 labloggingbucket,如下图所示:
从以下策略模板入手:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:List*",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::" ,
"arn:aws:s3:::/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::" ,
"arn:aws:s3:::/*"
]
}
]
}
下图显示了为本实验任务预置的所有资源以及这些资源的连接方式:
已成功地添加一个 VPC 终端节点策略,以限制对 labloggingbucket 的访问。
以下步骤概述了如何向 Amazon S3 网关端点添加 VPC 网关端点策略。提供了通过控制台和 AWS CLI 执行此操作的说明。
在 AWS 管理控制台中,使用 AWS 搜索栏搜索VPC
,然后从结果列表中选择该服务。
在左侧导航窗格中,选择 Endpoints(终端节点)。
选择 com.amazonaws.REGION.s3 端点。
选择 Policy(策略)选项卡。
选择 Edit Policy(编辑策略)。
选择 Custom(自定义)。
复制以下策略并将其粘贴到文本框中:
注意:将 和 替换为相应值。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:List*",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::" ,
"arn:aws:s3:::/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::" ,
"arn:aws:s3:::/*"
]
}
]
}
选择 *Save*(保存)。
现在,已向 Amazon S3 网关终端节点添加了策略。可以通过运行以下命令从私有实例测试该策略:
命令:将 和 替换为相应值。
aws s3 ls s3://<LabBucket>
aws s3 ls s3://<LabLoggingBucket>
转到用于连接公有实例的浏览器标签页。
命令:要创建策略文档的 JSON 文件,请运行以下命令。将 和 替换为相应值:
cd ~
cat <<EOT >> policy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:List*",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::" ,
"arn:aws:s3:::/*"
]
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::" ,
"arn:aws:s3:::/*"
]
}
]
}
EOT
命令:要查找 VPC 终端节点 ID,请运行以下命令:
export vpcEndpointId=$(aws ec2 describe-vpc-endpoints --query 'VpcEndpoints[?contains(ServiceName, `s3`) == `true`].VpcEndpointId' --output text)
echo ${vpcEndpointId}
命令:要将策略附加到 VPC 终端节点,请运行以下命令:
aws ec2 modify-vpc-endpoint --vpc-endpoint-id ${vpcEndpointId} --policy-document file://policy.json
现在,已向 Amazon S3 网关终端节点添加了策略。可以通过运行以下命令从私有实例测试该策略:
命令:将 和 替换为相应值。
aws s3 ls s3://<LabBucket>
aws s3 ls s3://<LabLoggingBucket>