使用 IAM 服务角色安全地访问资源

当我们以用户身份访问资源时,我们的凭据(如密码和访问密钥)用于确认我们可以使用该资源。但是,在某些情况下,我们需要访问属于其他用户的资源,或者一个资源必须访问另一个资源。这是通过使用临时凭据提供访问权限的角色实现的。在本教程中,我们将配置具有服务角色的 EC2 实例,以安全地访问 S3 存储桶。

  • 使用 Cloudformation 创建工作环境
  • 如何创建角色并附加策略
  • 如何修改策略
  • 如何将角色附加到策略

在开始本教程之前,您将需要满足以下条件:

✅ AWS 级别
中级 – 200
⏱ 完成时间
145分钟
💰 完成成本
使用 AWS 免费套餐时免费或 USD 1.01
🧩 先决条件
– AWS 账户:如果您没有账户,请按照设置 AWS 环境教程进行快速概述。要创建账户,请遵循创建您的 AWS 账户
💻 代码示例
GitHub 教程中使用的代码示例
📢 反馈
⏰ 最后更新
2023-10-06

我们将使用 AWS Cloudformation 创建教程环境,这是一项创建和配置 AWS 资源的服务。Cloudformation 使用一个模板来描述我们要设置的所有资源。我们的教程环境包括 Virtual Private Cloud (VPC)、EC2 Linux 服务器实例以及 S3 存储桶。使用 AWS 控制台或 CLI 设置这些资源可能需要花费时间和精力。我们将使用 Cloudformation 快速高效地创建教程环境,以便我们可以使用管理对 AWS 资源访问的教程。

让我们从打开 Cloudformation 控制台开始。

使用搜索栏打开 Cloudformation 页面

在 Cloudformation 中,使用模板构建的资源被视为称为堆栈的服务逻辑分组。选择 Create stack (创建堆栈)。

选择 Create stack (创建堆栈)

下载 Cloudformation 模板 create-tutorial-environment.yaml。选择“上传模板文件”,选择“选择文件”按钮上传文件,然后单击“下一步”。

上传 Cloudformation 模板

在本节中,我们将命名堆栈和需要唯一名称的 S3 存储桶。选择“下一步”以前进到下一个屏幕。

提示:创建一致的命名方案有助于查找和跟踪资源。例如,在名称前面加上“pcg-”,表示“实用云指南”,并在其后面加上服务名称,以便更轻松地按项目查找资源。

命名堆栈和 S3 存储桶

在 Configure stack options (配置堆栈选项) 屏幕中,我们将接受默认值并选择 Next (下一步)。您可以选择向堆栈添加标签以组织您的资源,这在搜索它们时会有所帮助。标签具有您选择的键和值。在下面的示例中,标记为 project,值为 pcg

接受默认值并前进到下一个屏幕

最后的“创建堆栈”屏幕将查看您选择的选项,例如堆栈和存储桶名称。

在创建堆栈之前查看堆栈详细信息

选择 Submit (提交) 以创建堆栈。

通过选择 Next (下一步) 创建堆栈

下一个屏幕显示我们正在构建的堆栈的状态。选择“事件”选项卡将显示资源的状态。屏幕不会自动刷新,但按下刷新按钮会更新屏幕。

Events (事件) 选项卡显示堆栈的状态

当状态为 CREATE_COMPLETE 时,堆栈已准备就绪。

已创建堆栈

设置好环境后,我们就可以开始使用 AWS IAM 角色了。但在我们离开 Cloudformation 之前,请选择 Outputs 选项卡。记下 S3 存储桶名称和 EC2 实例 ID。在创建策略和配置 EC2 实例时,我们将需要这些值。

查看堆栈输出

AWS 身份提供对 AWS 资源的访问。IAM 用户是与单个用户绑定的身份,具有密码和访问密钥形式的长期凭证。IAM 角色是另一种类型的身份,但具有临时凭证,可根据附加的策略提供访问资源的权限。

AWS 身份和策略之间的关系图

为了了解角色的重要性,让我们看一个场景,其中我们有一个 EC2 实例,其中包含一个使用 S3 存储桶中的文件的应用程序。应用程序使用 AWS API 复制文件,但需要权限才能访问存储桶。

如果应用程序在本地计算机上运行,则可以使用我们的 IAM 身份和凭证。但是,应用程序在 EC2 实例上运行,您永远不应将凭证留在实例上,因为任何可以登录实例的人都可以访问您的凭证。这就是服务角色发挥作用的地方。回想一下,角色使用临时凭证来完成任务,这样您的凭据就不会暴露。

让我们通过在 AWS 控制台主屏幕中搜索服务来打开 IAM 控制台。

使用搜索栏打开 IAM 控制台

在 IAM 控制台的左侧,选择 Access Management 下的 Roles (角色)。

选择 Roles (角色) 以创建角色

在 Roles (角色) 页面上,选择 Create role (创建角色)。

选择 Create a role (创建角色)

在下一个屏幕中,我们可以为角色选择用户或服务的类型。由于我们正在创建服务角色,因此请确保已选择 AWS 服务。我们需要指定服务,然后在 Common use cases (常见使用案例) 下,选择 EC2 (EC2),然后选择 Next (下一步)。

选择 AWS service (AWS 服务) 以创建角色

角色是一种 AWS 身份,身份具有用于访问资源的策略。在 Add permissions (添加权限) 页面中,选择 Create policy (创建策略) 为角色编写策略。

为角色创建策略

在下一页(指定权限)中,我们可以通过选择 JSON 作为选项来创建策略。将下面的策略文档复制并粘贴到编辑器窗口中。还记得 Cloudformation 输出中的存储桶名称吗?将 ARN 中的存储桶名称替换为存储桶名称,然后选择 Next (下一步)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Action”: [“s3:ListAllMyBuckets”, “s3:GetBucketLocation”],
“Effect”: “Allow”,
“Resource”: [“arn:aws:s3:::”]
},
{
“Effect”: “Allow”,
“Action”: [
“s3:Get”,
“s3:List”
],
“Resource”: [
“arn:aws:s3:::bucket-name/”,
“arn:aws:s3:::bucket-name”
]
}
]
}
在编辑器中创建策略

我们在以下屏幕中为策略命名并查看策略中的权限,并选择性地标记策略。选择 Create policy (创建策略) 以完成该过程。

查看并创建策略

When complete, the policy is ready and it will be listed on the IAM Policies page.

Policy for the role is listed on the Policies page

Test the service role by connecting to EC2 instance in the stack we created earlier. Like the S3 bucket, we can find the instance id from the Cloudformation output. Navigate to the EC2 Console and select the instance, choose Connect.

Choose the EC2 instance by the instance ID and Connect

We’ll use EC2 Instance Connect to open a terminal in a browser window. Choose Connect to open the terminal.

Choose EC2 Instance Connect to open a terminal

When the terminal opens it will display a prompt. EC2 instances include the AWS CLI, and we can check the version of the client with the --version option.

1
2
3
4
5
6
7
8
9
10
__| __|_ )
_| ( / Amazon Linux 2 AMI
___|___|___|

https://aws.amazon.com/amazon-linux-2/
4 package(s) needed for security, out of 4 available
Run “sudo yum update” to apply all updates.
[ec2-user@ip-172-31-46-36 ~]$ aws –version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.320-243.544.amzn2.x86_64 botocore/1.18.6

Let’s try to list the S3 bucket.

1
2
[ec2-user@ip-172-31-46-36 ~]$ aws s3 ls s3://pcg-s3-service-role-tutorial
Unable to locate credentials. You can configure credentials by running “aws configure”.

As expected, the instance doesn’t have permission to access S3. We can fix that by adding the service role to the instance. Go back to the EC2 console and choose the server’s Instance ID to open the summary of details about the instance.

Open Summary page for the EC2 instance

在摘要中,我们可以看到 IAM Role (IAM 角色) 为空。

EC2 IAM 角色为空

我们可以通过选择 Actions (操作) > Security (安全性) > Modify IAM Role (修改 IAM 角色) 来解决此问题。

修改实例的 IAM 角色

在 Modify IAM Role (修改 IAM 角色) 屏幕中,选择我们之前创建的角色,然后选择 Update IAM role (更新 IAM 角色)。

选择要访问 S2 的 IAM 角色

让我们通过返回终端并再次列出存储桶的内容来测试角色。

1
2
[ec2-user@ip-172-31-46-36 ~]$ aws s3 ls s3://pcg-s3-service-role-tutorial
[ec2-user@ip-172-31-46-36 ~]$

没有错误!但是我们还没有把任何东西放进桶里。接下来,让我们通过创建一个文件并将其复制到存储桶来尝试。

1
2
3
[ec2-user@ip-172-31-46-36 ~]$ echo “Making roles” > file.txt
[ec2-user@ip-172-31-46-36 ~]$ aws s3 cp file.txt s3://pcg-s3-service-role-tutorial
upload failed: ./file.txt to s3://pcg-s3-service-role-tutorial/file.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied

上传失败,因为我们的策略只允许列出和获取存储桶中的对象。但是,我们可以改变这一点!打开 IAM 控制台,然后选择 Roles (角色) 以打开角色菜单。我们可以使用搜索栏来查找我们的角色。选择 Role name (角色名称) 以打开角色的 Summary (摘要) 页面。

打开要更新的角色

在 Permissions policies (权限策略) 部分中,选择 Policy name (策略名称) 下的角色以打开 Policy details (策略详细信息) 页面。

选择角色以查看详细信息

在 Policy details (策略详细信息) 页面上,转到 Permissions defined in this policy (此策略中定义的权限) 部分,然后选择 Edit (编辑) 以打开策略编辑器。

打开策略编辑器

在策略编辑器中,将“s3:Put”添加到操作列表中。此策略更改允许 EC2 实例将文件复制到 S3 存储桶。选择“下一步”以查看更改。

将 put 操作添加到策略

“查看”页面显示策略中的更改,请注意,“写入”现在是一个操作。 选择 Save Changes (保存更改) 以更新策略。

查看并保存到策略

是时候通过上传文件来测试更新的角色了。

1
2
[ec2-user@ip-172-31-46-36 ~]$ aws s3 cp file.txt s3://pcg-s3-service-role-tutorial
upload: ./file.txt to s3://pcg-s3-service-role-tutorial/file.txt

没有错误,但让我们列出它以确保它在存储桶中。

1
2
[ec2-user@ip-172-31-46-36 ~]$ aws s3 ls s3://pcg-s3-service-role-tutorial
2023-08-23 05:34:34 13 file.txt

为了完整起见,我们将文件下载到另一个目录并显示文件内容。

1
2
3
4
5
ec2-user@ip-172-31-46-36 ~]$ mkdir download
[ec2-user@ip-172-31-46-36 ~]$ aws s3 cp s3://pcg-s3-service-role-tutorial/file.txt ./download/
download: s3://pcg-s3-service-role-tutorial/file.txt to download/file.txt
[ec2-user@ip-172-31-46-36 ~]$ cat ./download/file.txt
Making roles

The EC2 instance can securely access file from an S3 bucket by using a service role.

In the Cloudformation console, select and delete the stack.

删除堆栈

在 IAM 控制台中,选择侧边菜单上的 Roles (角色),选择我们创建的角色,然后选择 Delete (删除)。

选择角色并删除

本教程的重点是如何使用角色和临时凭据安全地访问资源。我们为服务创建了一个角色,并应用了一个允许它访问其他资源的策略。在本例中,我们将一个角色附加到 EC2 实例,以使其能够访问 S3 存储桶。我们还看到,在这个简单的示例中,我们可以编辑角色并添加操作。我们还可以添加其他语句,例如提供对关系数据库的访问。要点是使用角色来启用操作,而无需通过将用户凭证置于 EC2 等服务中来公开用户凭证。

在本教程的开头,我们设置了环境,但这不是本教程的重点。Cloudformation 是一个强大的工具,但我们将在以下文章中介绍它。

我们的下一篇文章将介绍存储和不同形式的云存储。我们将研究不同类型存储的主要用例以及如何设置它们。同时,您可以阅读不同类型的云存储以及何时使用它们

社区 |使用 IAM 服务角色安全地访问资源 (community.aws)

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/312887.html

(0)
上一篇 2024年4月17日
下一篇 2024年4月18日

相关推荐

发表回复

登录后才能评论