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

使用临时凭证访问难以访问的资源
发布时间:2023 年 10 月 6 日
创建服务角色
IT 专家
Amazon IAM
教程
亚马逊云科技
Olawale Olaleye
亚马逊云科技使用经验
200 - 中级
完成所需时间
145 分钟
前提条件

注册 / 登录 亚马逊云科技账户,如果您还没有账户,请按照设置亚马逊云科技环境教程中的说明获取快速概览。请按照创建亚马逊云科技账户的说明创建账户。

示例代码
  • GitHub 上的教程中使用的代码示例
上次更新时间
2023 年 10 月 6 日

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

学习内容

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

设置工作环境

我们将使用 Amazon CloudFormation 创建教程环境,这是一项用于创建和配置亚马逊云科技资源的服务。CloudFormation 使用模板来描述我们要设置的所有资源。我们的教程环境包括一个虚拟私有云 (VPC)、一个 EC2 Linux 服务器实例以及一个 S3 存储桶。使用亚马逊云科技控制台或 CLI 设置这些资源可能费时费力。我们将使用 CloudFormation 快速高效地创建教程环境,以便我们学习如何管理对亚马逊云科技资源的访问权限。

首先打开 CloudFormation 控制台。

在 CloudFormation 中,使用模板构建的资源视为服务的逻辑分组,其名称是堆栈。点击 Create stack(创建堆栈)。

下载 CloudFormation 模板 create-tutorial-environment.yaml。选择 Upload a template file(上传模板文件),点击 Choose file (选择文件)按钮上传文件,然后点击 Next(下一步)。

在本节中,我们将命名堆栈和需要唯一名称的 S3 存储桶。点击 Next(下一步)即可进入下一个界面。

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

在 Configure stack options(配置堆栈选项)页面上,保留默认值并点击 Next(下一步)。您可以选择向堆栈添加标签以整理资源,这有助于快速搜索资源。您可以自定义标签的键和值。在下面的示例中,标签的键是 project,值是 pcg。

创建堆栈最后这个界面用于检查您已选的选项,例如堆栈和存储桶名称。

点击 Submit(提交)以创建堆栈。

下一个界面显示我们正在构建的堆栈的状态。选择 Events(事件)选项卡将显示资源的状态。界面不会自动刷新,按下刷新按钮可更新界面。

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

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

服务角色

亚马逊云科技用户身份提供对亚马逊云科技资源的访问权限。IAM 用户是与单个用户绑定的身份,并具有密码和访问密钥形式的长期凭证。IAM 角色是另一类身份,它们具有临时凭证,这些凭证提供基于附加策略访问资源的权限。

为了理解角色的重要性,我们来看这样一个场景:假设有一个 EC2 实例,其中包含一个应用程序,该应用程序要使用 S3 存储桶中的文件。应用程序使用亚马逊云科技 API 复制文件,但它需要访问存储桶的权限。如果应用程序在本地计算机上运行,那它可以使用我们的 IAM 身份和凭证。但是,应用程序在 EC2 实例上运行,您不应将凭证保留在实例上,因为任何可以登录实例的人都可以访问您的凭证。这时,服务角色就派上用场了。回想一下,角色使用临时凭证来完成任务,这样您的凭据就不会暴露。

创建服务角色

首先,在亚马逊云科技控制台的主屏幕上搜索 IAM 服务,打开 IAM 控制台。

在 IAM 控制台左侧,选择 Access management(访问管理)下的 Roles(角色)。

在 Roles(角色)页面上,点击 Create role(创建角色)。

在下一个界面中,我们可以为角色选择用户或服务的类型。由于我们创建的是服务角色,因此请选择 AWS service(亚马逊云科技服务)。我们需要指定服务,在 Common use cases(常见使用场景)下,选择 EC2,然后点击 Next(下一步)。

角色是一种亚马逊云科技用户身份,身份具有用于访问资源的策略。在 Add permissions(添加权限)页面上,点击 Create policy(创建策略)为角色编写策略。

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

{
 "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(创建策略)完成流程。

完成后,该策略即准备就绪,它会显示在 IAM Policies(IAM 策略)页面上。

测试服务角色

连接到我们之前创建的堆栈中的 EC2 实例,即可测试服务角色。与 S3 存储桶一样,我们可以从 CloudFormation 输出中找到实例 ID。导航到 EC2 控制台并选择实例,然后点击 Connect(连接)。

我们将使用  EC2 Instance Connect 在浏览器窗口中打开终端。点击  Connect(连接)打开终端。

终端打开时将显示一条提示。EC2 实例上有 Amazon CLI,我们可以使用 --version 选项来检查客户端的版本。


 __| __|_ )
 _| ( / 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

我们尝试列出 S3 存储桶。

[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".

实例没有访问 S3 的权限,这一点符合预期。我们可以通过向实例添加服务角色来修复此问题。返回 EC2 控制台,然后选择服务器的实例 ID,打开实例的详细信息摘要。

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

我们可以选择 Actions(操作)> Security(安全)> Modify IAM role(修改 IAM 角色)来修复此问题。

在 Modify IAM role(修改 IAM 角色)界面中,选择我们之前创建的角色,然后点击 Update IAM role(更新 IAM 角色)。

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

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

没有错误了!但我们还没有向存储桶中添加文件。我们现在试试创建一个文件并将其复制到存储桶。

[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 存储桶。点击 Next(下一步),检查更改。

检查页面已显示策略中的更改,可以注意到 Write(写入)现已出现在操作列表中。点击 Save changes(保存更改)更新策略。

测试更新后的服务角色

接下来可以上传文件来测试更新后的角色了。

[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 

没有错误,但我们进行一次列出操作,以确保文件在存储桶中。

[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

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

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

EC2 实例可以使用服务角色安全地访问 S3 存储桶中的文件。

清理资源

在 CloudFormation 控制台上,选择堆栈并将其删除。

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

总结

通过本教程,您主要学习了如何使用角色和临时凭证安全地访问资源。我们为服务创建了一个角色,并且应用了策略以允许这个角色访问其他资源。在本例中,我们向一个 EC2 实例附加了一个角色,使之可以访问 S3 存储桶。在这个简单示例中,我们还了解到如何编辑角色并添加操作。此外,我们可以添加访问关系数据库等其他语句。本教程的要点在于,通过将角色附加到 EC2 等服务上,在不暴露用户凭证的前提下使用角色来启用操作。

在本教程开始时,我们设置了环境,但这不是本教程的重点。CloudFormation 是一个强大的工具,我们将在后续文章中进行介绍。

后续内容

我们的下一篇文章将介绍存储,以及不同形式的云存储。我们将研究不同类型存储的主要使用场景和设置方法。