Amazon Keyspaces 基于身份的策略示例 - Amazon Keyspaces(Apache Cassandra 兼容)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon Keyspaces 基于身份的策略示例

默认情况下,IAM 用户和角色没有创建或修改 Amazon Keyspaces 资源的权限。他们也不能使用控制台、Amazon CLI 或 Amazon API 执行任务。IAM 管理员必须创建 IAM policy,以便为用户和角色授予权限以对所需的指定资源执行特定的 API 操作。然后,管理员必须将这些策略附加到需要这些权限的 IAM 用户或组。

要了解如何使用这些示例 JSON 策略文档创建 IAM 基于身份的策略,请参阅《IAM 用户指南》中的在 JSON 选项卡上创建策略

策略最佳实操

基于身份的策略确定某个人是否可以创建、访问或删除您账户中的 Amazon Keyspaces 资源。这些操作可能会使 Amazon Web Services 账户产生成本。创建或编辑基于身份的策略时,请遵循以下准则和建议:

  • Amazon 托管式策略及转向最低权限许可入门——要开始向用户和工作负载授予权限,请使用 Amazon 托管式策略来为许多常见使用场景授予权限。您可以在 Amazon Web Services 账户中找到这些策略。建议通过定义特定于您的使用场景的 Amazon 客户管理型策略来进一步减少权限。有关更多信息,请参阅《IAM 用户指南》中的 Amazon 托管式策略工作职能的 Amazon 托管式策略

  • 应用最低权限 – 在使用 IAM policy 设置权限时,请仅授予执行任务所需的权限。为此,您可以定义在特定条件下可以对特定资源执行的操作,也称为最低权限许可。有关使用 IAM 应用权限的更多信息,请参阅《IAM 用户指南》中的 IAM 中的策略和权限

  • 使用 IAM policy 中的条件进一步限制访问权限 – 您可以向策略添加条件来限制对操作和资源的访问。例如,您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果通过特定 Amazon Web Service(例如 Amazon CloudFormation)使用服务操作,您还可以使用条件来授予对服务操作的访问权限。有关更多信息,请参阅《IAM 用户指南》中的 IAM JSON 策略元素:条件

  • 使用 IAM Access Analyzer 验证您的 IAM policy,以确保权限的安全性和功能性 – IAM Access Analyzer 会验证新策略和现有策略,以确保策略符合 IAM policy 语言 (JSON) 和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议,有助于制定安全且功能性强的策略。有关更多信息,请参阅《IAM 用户指南》中的 IAM Access Analyzer 策略验证

  • 需要多重身份验证 (MFA) – 如果您所处的场景要求您的 Amazon Web Services 账户 中有 IAM 用户或根用户,请启用 MFA 来提高安全性。要在调用 API 操作时需要 MFA,请将 MFA 条件添加到策略中。有关更多信息,请参阅《IAM 用户指南》中的配置受 MFA 保护的 API 访问

有关 IAM 中的最佳实践的更多信息,请参阅《IAM 用户指南》中的 IAM 中的安全最佳实践

使用 Amazon Keyspaces 控制台

Amazon Keyspaces 不要求您具备特定权限才能访问 Amazon Keyspaces 控制台。您至少需要具有只读权限才能列出和查看您 Amazon Web Services 账户中 Amazon Keyspaces 资源的相关详细信息。如果您创建的基于身份的策略比所需的最低权限更严格,则无法为具有该策略的实体(IAM 用户或角色)正常运行控制台。

实体可以使用以下两个 Amazon 托管式策略来访问 Amazon Keyspaces 控制台。

  • AmazonKeyspacesReadOnlyAccess:此策略授予只读访问权限。

  • AmazonKeyspacesFullAccess:此策略授予管理员访问权限。

有关 Amazon Keyspaces 托管式策略的更多信息,请参阅 适用于 Amazon Keyspaces 的 Amazon 托管式策略

允许用户查看他们自己的权限

该示例说明了您如何创建策略,以允许 IAM 用户查看附加到其用户身份的内联和托管策略。此策略包括在控制台上完成此操作或者以编程方式使用 Amazon CLI 或 Amazon API 所需的权限。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "ViewOwnUserInfo", "Effect": "Allow", "Action": [ "iam:GetUserPolicy", "iam:ListGroupsForUser", "iam:ListAttachedUserPolicies", "iam:ListUserPolicies", "iam:GetUser" ], "Resource": ["arn:aws:iam::*:user/${aws:username}"] }, { "Sid": "NavigateInConsole", "Effect": "Allow", "Action": [ "iam:GetGroupPolicy", "iam:GetPolicyVersion", "iam:GetPolicy", "iam:ListAttachedGroupPolicies", "iam:ListGroupPolicies", "iam:ListPolicyVersions", "iam:ListPolicies", "iam:ListUsers" ], "Resource": "*" } ] }

访问 Amazon Keyspaces 表

以下是授予对系统表的只读 (SELECT) 访问权限的示例策略。对于所有示例,请将 Amazon 资源名称 (ARN) 中的区域和账户 ID 替换为您服务中的相应内容。

注意

要使用标准驱动程序进行连接,用户必须至少具有对系统表的 SELECT 访问权限,因为大多数驱动程序在连接时读取系统键空间/表。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "cassandra:Select" ], "Resource":[ "arn:aws:cassandra:us-east-1:111122223333:/keyspace/system*" ] } ] }

以下示例策略添加对用户表的只读访问权限。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "cassandra:Select" ], "Resource":[ "arn:aws:cassandra:us-east-1:111122223333:/keyspace/mykeyspace/table/mytable", "arn:aws:cassandra:us-east-1:111122223333:/keyspace/system*" ] } ] }

以下示例策略分配对用户表的读/写访问权限和对系统表的读取访问权限。

注意

系统表为只读。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "cassandra:Select", "cassandra:Modify" ], "Resource":[ "arn:aws:cassandra:us-east-1:111122223333:/keyspace/mykeyspace/table/mytable", "arn:aws:cassandra:us-east-1:111122223333:/keyspace/system*" ] } ] }

以下示例策略允许用户在键空间 mykeyspace 中创建表。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "cassandra:Create", "cassandra:Select" ], "Resource":[ "arn:aws:cassandra:us-east-1:111122223333:/keyspace/mykeyspace/*", "arn:aws:cassandra:us-east-1:111122223333:/keyspace/system*" ] } ] }

使用身份验证插件访问 Amazon Keyspaces

在以下示例中,您运行一个应用程序,该应用程序使用 Amazon Keyspaces 身份验证插件从与 IAM 角色关联的 EC2 实例访问 Amazon Keyspaces,以查询您的 Amazon Keyspaces 表。应用程序从名为 orders 的表中返回给定客户 ID 的所有订单。

此示例包括以下步骤:

  1. 创建 Amazon Keyspaces 键空间和表,并插入记录。

  2. 启动 EC2 实例并将其与 IAM 角色关联。

    定义向您的 Amazon Keyspaces 表授予 EC2 实例权限的 IAM 策略。

  3. 在 EC2 实例上部署并运行示例代码以查询 Amazon Keyspaces 表。

创建示例表

要开始,请创建键空间和表,然后插入一些记录。要创建 orders 表,您可以使用 Amazon Keyspaces 控制台上的 CQL 编辑器,也可以使用 cqlsh。有关更多信息,请参阅使用 cqlsh-expansion 连接 Amazon Keyspaces

首先,使用以下表架构创建键空间和表。

create keyspace acme with replication = {'class': 'SimpleStrategy', 'replication_factor' : 1 }; create table acme.orders ( customer_id text, order_timestamp timestamp, order_id uuid, primary key (customer_id, order_timestamp)) with clustering order by (order_timestamp desc);

接下来,在表中插入一些订单记录。

insert into acme.orders (customer_id, order_timestamp, order_id) values ('1234', toTimestamp(now()), uuid()); insert into acme.orders (customer_id, order_timestamp, order_id) values ('1234', toTimestamp(now()), uuid()); insert into acme.orders (customer_id, order_timestamp, order_id) values ('1234', toTimestamp(now()), uuid()); insert into acme.orders (customer_id, order_timestamp, order_id) values ('1234', toTimestamp(now()), uuid());

启动与 IAM 角色关联的 EC2 实例

创建将与运行应用程序的 EC2 实例关联的 IAM 角色。

将以下文档保存到名为 iam-keyspaces-ec2-role.json 的文件中。

{ "Version":"2012-10-17", "Statement":{ "Effect":"Allow", "Principal":{ "Service":"ec2.amazonaws.com" }, "Action":"sts:AssumeRole" } }

要授予 EC2 实例对 orders 表的只读访问权限,请创建以下 IAM 策略。将 Amazon 资源名称 (ARN) 中的区域和账户 ID 替换为您的 Amazon Keyspaces 账户中的相应内容。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"cassandra:Select", "Resource":[ "arn:aws:cassandra:us-east-2:111122223333:/keyspace/acme/table/orders", "arn:aws:cassandra:us-east-2:111122223333:/keyspace/system*" ] } ] }

将以下文档保存到名为 iam-keyspaces-ec2-policy.json 的文件中。

注意

您必须在策略中包含 system 键空间的权限,因为驱动程序必须访问此键空间以检索集群元数据。

要启动 EC2 实例并将创建的 IAM 角色与该实例关联,请按照 Launching an instance with an IAM role 中的步骤操作。要将角色与现有 EC2 实例关联,请参阅 Attaching an IAM role

注意

为此示例选择预安装了 Java 的 Amazon Linux AMI。如果您使用的是现有 Amazon Linux 实例,请确认您已安装 Java,或使用命令 sudo yum install java-11-amazon-corretto-headless 完成此步骤。

部署和运行代码

要部署和运行代码以查询 Amazon Keyspaces 表,请按以下步骤操作:

  1. 从 GitHub 下载示例代码。

  2. 使用 Apache Maven 编译示例代码。

  3. 将 JAR 文件复制到 EC2 实例,然后运行应用程序。

此示例使用实施 Amazon Keyspaces 身份验证插件的示例应用程序,使用 IAM 角色访问表。在您自己的代码中,您必须按照 使用适用于 Apache Cassandra 的 4.x DataStax Java 驱动程序和 SigV4 身份验证插件连接 Amazon Keyspaces 的分步教程 中的步骤集成插件。

GitHub 存储库下载示例后,通过以下命令,使用 Apache Maven 版本 3.6.3 或更高版本编译代码。

mvn package

这将创建以下 JAR 文件,其所有依赖项包含在 target 目录中。

aws-sigv4-auth-cassandra-java-driver-examples-1.0.0.jar

将此 JAR 文件以及位于示例代码目录中的 cassandra_truststore.jks 复制到 EC2 实例。使用以下命令运行应用程序。将 AWS 区域 us-east-2 替换为您使用的区域。

java -Djavax.net.ssl.trustStore=./cassandra_truststore.jks \ -Djavax.net.ssl.trustStorePassword=amazon -jar \ aws-sigv4-auth-cassandra-java-driver-examples-1.0.0.jar \ us-east-2 cassandra.us-east-2.amazonaws.com 1234

此命令会生成您之前插入到表中的记录。应用程序使用分配给 IAM 角色会话的临时凭证访问表,并具有在 IAM 策略中定义的只读权限。

基于标签的 Amazon Keyspaces 资源访问

您可以在基于身份的策略中使用条件,以便基于标签控制对 Amazon Keyspaces 资源的访问。这些策略控制账户中键空间和表的可见性。请注意,与通过 Cassandra 驱动程序和开发人员工具进行 Cassandra 查询语言 (CQL) API 调用相比,使用 Amazon SDK 发出请求时,系统表基于标签的权限的行为有所不同。

  • 要在使用基于标签的访问权限时使用 Amazon SDK 发出 ListGet 请求,调用者需要具有对系统表的读取权限。例如,需要 Select 操作权限才能通过 GetTable 操作从系统表读取数据。如果调用者对特定表只有基于标签的访问权限,则需要对系统表进行额外访问的操作将失败。

  • 为了与既定的 Cassandra 驱动程序行为兼容,当您通过 Cassandra 驱动程序和开发人员工具使用 Cassandra 查询语言 (CQL) API 调用对系统表执行操作时,系统不会强制实施基于标签的授权策略。

以下示例说明如何创建一个策略,该策略授予用户查看表的权限(如果表的 Owner 包含该用户的用户名的值)。在此示例中,您还授予对系统表的读取权限。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"ReadOnlyAccessTaggedTables", "Effect":"Allow", "Action":"cassandra:Select", "Resource":[ "arn:aws:cassandra:us-east-2:111122223333:/keyspace/myKeyspace/table/*", "arn:aws:cassandra:us-east-2:111122223333:/keyspace/myKeyspace/system*" ], "Condition":{ "StringEquals":{ "aws:ResourceTag/Owner":"${aws:username}" } } } ] }

您可以将该策略附加到您账户中的 IAM 用户。如果一个名为 richard-roe 的用户尝试查看 Amazon Keyspaces 表,则您必须为该表添加 Owner=richard-roeowner=richard-roe 标签。否则,他将被拒绝访问。条件标签键 Owner 匹配 Ownerowner,因为条件键名称不区分大小写。有关更多信息,请参阅《IAM 用户指南》中的 IAM JSON 策略元素:条件

以下策略授予用户创建带有标签的表的权限(如果表的 Owner 包含该用户的用户名的值)。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "CreateTagTableUser", "Effect": "Allow", "Action": [ "cassandra:Create", "cassandra:TagResource" ], "Resource": "arn:aws:cassandra:us-east-2:111122223333:/keyspace/mykeyspace/table/*", "Condition":{ "StringEquals":{ "aws:RequestTag/Owner":"${aws:username}" } } } ] }