使用 IAM 策略管理 AWS CloudShell 访问和使用情况
通过可由 AWS Identity and Access Management 提供的访问管理资源,管理员可以向 IAM 用户授予权限。这样,这些用户就可以访问 AWS CloudShell 和使用环境的功能。管理员还可以创建策略,在精细级别上指定这些用户可以在 Shell 环境中执行哪些操作。
管理员要向用户授予访问权限,最快捷的方法是通过 AWS 托管策略。AWS 托管策略 是由 AWS 创建和管理的独立策略。以下适用于 AWS CloudShell 的 AWS 托管策略可以附加到 IAM 身份:
-
AWS CloudShellFullAccess:授予使用 AWS CloudShell 的权限,并具有对所有功能的完全访问权限。
AWS CloudShellFullAccess 策略使用通配符 (*) 来授予 IAM 身份(用户、角色或组)对 CloudShell 和功能的完全访问权限。有关此策略的更多信息,请参阅《AWS 托管策略用户指南》中的 AWSCloudShellFullAccess。
注意
具有以下 AWS 托管策略的 IAM 身份也可以启动 CloudShell。但是,这些策略提供了广泛的权限。因此,我们建议您仅在这些策略对于 IAM 用户的工作角色必不可少的情况下才授予这些策略。
有关如何将托管策略附加到您的实体的更多信息,请参阅 IAM 用户指南中的添加 IAM 身份权限(控制台)。
使用自定义策略管理 AWS CloudShell 中允许的操作
如果要管理 IAM 用户可以使用 CloudShell 执行的操作,可以将 CloudShellPolicy 托管策略用作模板来创建自定义策略。或者,编辑嵌入在相关 IAM 身份(用户、组或角色)中的内联策略。
例如,您可以允许 IAM 用户访问 CloudShell,但阻止他们转发用于登录 AWS Management Console的 CloudShell 环境证书。
重要
要从 AWS Management Console 启动 AWS CloudShell,IAM 用户需要执行以下操作的权限:
-
CreateEnvironment
-
CreateSession
-
GetEnvironmentStatus
-
StartEnvironment
如果附加的策略未明确允许其中一项操作,则在您尝试启动 CloudShell 时将返回 IAM 权限错误。
名称 | 对已授予权限的描述 | 是否需要启动 CloudShell? |
---|---|---|
|
创建 CloudShell 环境,在 CloudShell 会话开始时检索布局,然后将 Web 应用程序的当前布局保存在后端。如 CloudShell 的 IAM 策略示例 中所述,此权限仅期望将 |
是 |
|
从 AWS Management Console连接到 CloudShell 环境。 |
是 |
|
读取 CloudShell 环境的状态。 |
是 |
|
删除 CloudShell 环境。 |
否 |
|
生成预签名的 Amazon S3 URL,用于使用 CloudShell Web 界面通过 CloudShell 下载文件。这不适用于 VPC 环境。 |
否 |
|
生成预签名的 Amazon S3 URL,用于使用 CloudShell Web 界面通过 CloudShell 上传文件。这不适用于 VPC 环境。 |
否 |
|
描述环境。 |
否 |
|
将用于登录 AWS Management Console的凭证转发到 CloudShell。 |
否 |
|
启动已停止的 CloudShell 环境。 |
是 |
|
停止正在运行的 CloudShell 环境。 |
否 |
CloudShell 的 IAM 策略示例
以下示例显示如何创建策略来限制谁可以访问 CloudShell。这些示例还显示可在 Shell 环境中执行的操作。
以下策略强制完全拒绝对 CloudShell 及其功能的访问。
{ "Version": "2012-10-17", "Statement": [{ "Sid": "DenyCloudShell", "Effect": "Deny", "Action": [ "cloudshell:*" ], "Resource": "*" }] }
以下策略允许 IAM 用户访问 CloudShell,但禁止其生成用于文件上传和下载的预签名 URL。用户仍然可以将文件传入和传出环境,例如使用 wget
等客户端。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowUsingCloudshell", "Effect": "Allow", "Action": [ "cloudshell:*" ], "Resource": "*" }, { "Sid": "DenyUploadDownload", "Effect": "Deny", "Action": [ "cloudshell:GetFileDownloadUrls", "cloudshell:GetFileUploadUrls" ], "Resource": "*" }] }
以下策略允许 IAM 用户访问 CloudShell。但是,该策略禁止将您用于登录 AWS Management Console 的凭证转发到 CloudShell 环境。使用此策略的 IAM 用户需要在 CloudShell 中手动配置其凭证。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowUsingCloudshell", "Effect": "Allow", "Action": [ "cloudshell:*" ], "Resource": "*" }, { "Sid": "DenyCredentialForwarding", "Effect": "Deny", "Action": [ "cloudshell:PutCredentials" ], "Resource": "*" }] }
以下策略允许 IAM 用户创建 AWS CloudShell 环境。
{ "Version": "2012-10-17", "Statement": [{ "Sid": "CloudShellUser", "Effect": "Allow", "Action": [ "cloudshell:CreateEnvironment", "cloudshell:CreateSession", "cloudshell:GetEnvironmentStatus", "cloudshell:StartEnvironment" ], "Resource": "*" }] }
创建和使用 CloudShell VPC 环境时所需的 IAM 权限
要创建和使用 CloudShell VPC 环境,IAM 管理员必须提供特定于 VPC 的 Amazon EC2 权限。本节列出了创建和使用 VPC 环境所需的 Amazon EC2 权限。
要创建 VPC 环境,分配给您的角色的 IAM 策略必须包含以下 Amazon EC2 权限:
ec2:DescribeVpcs
ec2:DescribeSubnets
ec2:DescribeSecurityGroups
ec2:DescribeDhcpOptions
ec2:DescribeNetworkInterfaces
-
ec2:CreateTags
-
ec2:CreateNetworkInterface
-
ec2:CreateNetworkInterfacePermission
建议包括:
-
ec2:DeleteNetworkInterface
注意
此权限不是强制性的,但是 CloudShell 需要此权限才能清理由其创建的 ENI 资源(为 CloudShell VPC 环境创建的 ENI 标有 ManagedByCloudShell 键)。如果未启用此权限,则必须在每次使用 CloudShell VPC 环境后手动清理 ENI 资源。
授予完全 CloudShell 访问权限(包括对 VPC 的访问权限)的 IAM 策略
以下示例显示了如何启用 CloudShell 完全权限,包括对 VPC 的访问权限:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudShellOperations", "Effect": "Allow", "Action": [ "cloudshell:*" ], "Resource": "*" }, { "Sid": "AllowDescribeVPC", "Effect": "Allow", "Action": [ "ec2:DescribeDhcpOptions", "ec2:DescribeNetworkInterfaces", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "ec2:DescribeVpcs" ], "Resource": "*" }, { "Sid": "AllowCreateTagWithCloudShellKey", "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": "arn:aws:ec2:*:*:network-interface/*", "Condition": { "StringEquals": { "ec2:CreateAction": "CreateNetworkInterface" }, "ForAnyValue:StringEquals": { "aws:TagKeys": "ManagedByCloudShell" } } }, { "Sid": "AllowCreateNetworkInterfaceWithSubnetsAndSG", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface" ], "Resource": [ "arn:aws:ec2:*:*:subnet/*", "arn:aws:ec2:*:*:security-group/*" ] }, { "Sid": "AllowCreateNetworkInterfaceWithCloudShellTag", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface" ], "Resource": "arn:aws:ec2:*:*:network-interface/*", "Condition": { "ForAnyValue:StringEquals": { "aws:TagKeys": "ManagedByCloudShell" } } }, { "Sid": "AllowCreateNetworkInterfacePermissionWithCloudShellTag", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterfacePermission" ], "Resource": "arn:aws:ec2:*:*:network-interface/*", "Condition": { "StringEquals": { "aws:ResourceTag/ManagedByCloudShell": "" } } }, { "Sid": "AllowDeleteNetworkInterfaceWithCloudShellTag", "Effect": "Allow", "Action": [ "ec2:DeleteNetworkInterface" ], "Resource": "arn:aws:ec2:*:*:network-interface/*", "Condition": { "StringEquals": { "aws:ResourceTag/ManagedByCloudShell": "" } } } ] }
将 IAM 条件键用于 VPC 环境
可以对 VPC 设置使用特定于 CloudShell 的条件键,以便为您的 VPC 环境提供额外的权限控制。还可以指定可以使用和不能使用 VPC 环境的子网和安全组。
CloudShell 在 IAM 策略中支持以下条件键:
-
CloudShell:VpcIds
– 允许或拒绝一个或多个 VPC -
CloudShell:SubnetIds
– 允许或拒绝一个或多个子网 -
CloudShell:SecurityGroupIds
– 允许或拒绝一个或多个安全组
注意
如果修改了有权访问公共 CloudShell 环境的用户的权限以增加 cloudshell:createEnvironment
操作限制,这些用户仍然可以访问其现有的公共环境。但是,如果您想修改具有此限制的 IAM 策略并禁止他们访问现有公共环境,则必须先使用此限制更新 IAM 策略,然后确保您账户中的每个 CloudShell 用户都使用 CloudShell Web 用户界面手动删除现有公共环境(操作 → 删除 CloudShell 环境)。
将条件键用于 VPC 设置的策略示例
以下示例演示如何将条件键用于 VPC 设置。创建具有所需限制的策略语句后,为目标用户或角色附加策略语句。
确保用户仅创建 VPC 环境并拒绝创建公共环境
要确保用户只能创建 VPC 环境,请使用拒绝权限,如以下示例所示:
{ "Statement": [ { "Sid": "DenyCloudShellNonVpcEnvironments", "Action": [ "cloudshell:CreateEnvironment" ], "Effect": "Deny", "Resource": "*", "Condition": { "Null": { "cloudshell:VpcIds": "true" } } } ] }
拒绝用户访问特定的 VPC、子网或安全组
要拒绝用户访问特定 VPC,请使用 StringEquals
检查 cloudshell:VpcIds
条件的值。以下示例拒绝用户访问 vpc-1
和 vpc-2
:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfVpc", "Action": [ "cloudshell:CreateEnvironment" ], "Effect": "Deny", "Resource": "*", "Condition": { "StringEquals": { "cloudshell:VpcIds": [ "vpc-1", "vpc-2" ] } } } ] }
要拒绝用户访问特定 VPC,请使用 StringEquals
检查 cloudshell:SubnetIds
条件的值。以下示例拒绝用户访问 subnet-1
和 subnet-2
:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfVpc", "Action": [ "cloudshell:CreateEnvironment" ], "Effect": "Deny", "Resource": "*", "Condition": { "StringEquals": { "cloudshell:VpcIds": [ "vpc-1", "vpc-2" ] } } } ] }
要拒绝用户访问特定 VPC,请使用 StringEquals
检查 cloudshell:SecurityGroupIds
条件的值。以下示例拒绝用户访问 sg-1
和 sg-2
:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfSecurityGroups", "Action": [ "cloudshell:CreateEnvironment" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "cloudshell:SecurityGroupIds": [ "sg-1", "sg-2" ] } } } ] }
允许用户使用特定 VPC 配置创建环境
要允许用户访问特定 VPC,请使用 StringEquals
检查 cloudshell:VpcIds
条件的值。以下示例允许用户访问 vpc-1
和 vpc-2
:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificVpc", "Action": [ "cloudshell:CreateEnvironment" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "cloudshell:VpcIds": [ "vpc-1", "vpc-2" ] } } } ] }
要允许用户访问特定 VPC,请使用 StringEquals
检查 cloudshell:SubnetIds
条件的值。以下示例允许用户访问 subnet-1
和 subnet-2
:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificSubnets", "Action": [ "cloudshell:CreateEnvironment" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "cloudshell:SubnetIds": [ "subnet-1", "subnet-2" ] } } } ] }
要允许用户访问特定 VPC,请使用 StringEquals
检查 cloudshell:SecurityGroupIds
条件的值。以下示例允许用户访问 sg-1
和 sg-2
:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "cloudshell:CreateEnvironment" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "cloudshell:SecurityGroupIds": [ "sg-1", "sg-2" ] } } } ] }
AWS 服务 的访问权限
CloudShell 使用您用来登录 AWS Management Console 的 IAM 凭证。
注意
要使用您用来登录 AWS Management Console 的 IAM 凭证,您必须拥有 cloudshell:PutCredentials
权限。
CloudShell 的这种预身份验证功能使 AWS CLI 的使用变得很方便。但是,IAM 用户对从命令行调用的 AWS 服务 仍需要显式权限。
例如,假设 IAM 用户需要创建 Amazon S3 存储桶并将文件作为对象上传给这些存储桶。您可以创建明确允许这些操作的策略。IAM 控制台提供了一个交互式可视化编辑器,用于指导构建 JSON 格式的策略文档的过程。创建策略后,您可以将其附加到相关的 IAM 身份(用户、组或角色)。
有关如何将托管策略附加到您的实体的更多信息,请参阅 IAM 用户指南中的添加 IAM 身份权限(控制台)。
在 CloudShell 中访问 Amazon Q CLI 功能的权限
要在 CloudShell 中使用 Amazon Q CLI 功能(例如内嵌建议、聊天和翻译),请确保您拥有所需的 IAM 权限。如果您无法在 CloudShell 中访问 Amazon Q CLI 功能,请联系管理员,为您提供所需的 IAM 权限。有关更多信息,请参阅《Amazon Q 开发者版用户指南》中的适用于 Amazon Q 开发者版的基于身份的策略示例。