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

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

Amazon Keyspaces 策略示例

默认情况下,IAM 用户和角色无权创建或修改 Amazon Keyspaces 资源。它们还无法使用 Amazon Web Services Management Console、CQLSH、Amazon CLI 或 Amazon API 执行任务。IAM 管理员必须创建 IAM 策略,以便为用户和角色授予权限以对所需的指定资源执行特定的 API 操作。然后,管理员必须将这些策略附加到需要这些权限的 IAM 用户或组。

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

策略最佳实践

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

  • 入门Amazon托管策略— 要快速开始使用亚马逊 Keyspaces,请使用Amazon托管策略,以便为您的员工提供所需的权限。这些策略已在您的账户中提供,并由 Amazon 维护和更新。有关更多信息,请参阅 IAM 用户指南中的开始使用 Amazon 托管策略中的权限

  • 授予最低权限 – 创建自定义策略时,仅授予执行任务所需的许可。最开始只授予最低权限,然后根据需要授予其他权限。这样做比起一开始就授予过于宽松的权限而后再尝试收紧权限来说更为安全。有关更多信息,请参阅 。授予最低权限中的IAM 用户指南

  • 为敏感操作启用 MFA – 为了提高安全性,要求 IAM 用户使用多重验证 (MFA) 访问敏感资源或 API 操作。有关更多信息,请参阅 。在中使用多重验证 (MFA)Amazon中的IAM 用户指南

  • 使用策略条件来增强安全性 – 在切实可行的范围内,定义基于身份的策略在哪些情况下允许访问资源。例如,您可编写条件来指定请求必须来自允许的 IP 地址范围。您也可以编写条件,以便仅允许指定日期或时间范围内的请求,或者要求使用 SSL 或 MFA。有关更多信息,请参阅 。IAM JSON 策略元素:Condition中的IAM 用户指南

使用 Amazon Keyspaces 控制台

Amazon Keyspaces 不需要特定权限以访问 Amazon Keyspaces(用于 Apache Cassandra)控制台。您至少需要只读权限才能在您的 Amazon Web Services 账户 。如果您创建的基于身份的策略比所需的最低权限更严格,则无法为具有该策略的实体(IAM 用户或角色)正常运行控制台。

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

该示例说明了您如何创建策略,以允许 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 Keyspaces Keyspaces 键空间和表,并插入记录。

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

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

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

创建示例表

要开始,请创建键空间和表,然后插入一些记录。创建orders表中,您可以在 Amazon Keyspaces 控制台上使用 CQL 编辑器,也可以使用 cqlsh。有关更多信息,请参阅 安装和使用 cqlsh Connect 到 Amazon Keyspaces(针对 Apache Cassandra)

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

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 角色与该实例关联,请按照启动具有 IAM 角色的实例中的步骤操作。要将角色与现有 EC2 实例关联,请参阅附加 IAM 角色

注意

为此示例选择预安装了 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 卡桑德拉的 4.x DataSax Java 驱动程序和 Sigv4 身份验证插件 Connect 到亚马逊 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 资源的访问。本章节提供了一些示例。

以下示例说明如何创建一个策略,该策略授予用户查看表的权限(如果表的 Owner 包含该用户的用户名的值)。

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

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

以下策略授予用户创建带有标签的表的权限(如果表的 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": { "ForAnyValue:StringEquals" : {"aws:RequestTag/Owner": "${aws:username}"} } ] }