Amazon Keyspaces Identity-Based Policy Examples - Amazon Keyspaces(针对 Apache Cassandra)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Amazon Keyspaces Identity-Based Policy Examples

By default, IAM users and roles don't have permission to create or modify Amazon Keyspaces resources. They also can't perform tasks using the AWS Management Console, CQLSH, AWS CLI, or AWS API. IAM 管理员必须创建 IAM 策略,以便为用户和角色授予权限以对所需的指定资源执行特定的 API 操作。然后,管理员必须将这些策略附加到需要这些权限的 IAM 用户或组。

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

策略最佳实践

基于身份的策略非常强大。They determine whether someone can create, access, or delete Amazon Keyspaces resources in your account. 这些操作可能会在您的 AWS 账户中产生费用。创建或编辑基于身份的策略时,请遵循以下准则和建议:

  • Get started using AWS managed policies – To start using Amazon Keyspaces quickly, use AWS managed policies to give your employees the permissions they need. 已在您的账户中提供这些策略,并由 AWS 进行维护和更新。有关更多信息,请参阅 IAM 用户指南 中的开始使用 AWS 托管策略中的权限.

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

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

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

Using the Amazon Keyspaces Console

Amazon Keyspaces does not require specific permissions to access the Amazon Keyspaces (for Apache Cassandra) console. You need at least read-only permissions to list and view details about the Amazon Keyspaces resources in your AWS account. 如果您创建的基于身份的策略比所需的最低权限更严格,则无法为具有该策略的实体(IAM 用户或角色)正常运行控制台。

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

该示例说明了您如何创建策略,以允许 IAM 用户查看附加到其用户身份的内联和托管策略。该策略包括在控制台上或以编程方式使用 AWS CLI 或 AWS 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": "*" } ] }

Accessing Amazon Keyspaces Tables

以下是授予对系统表的只读 (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*" ] } ] }

Accessing Amazon Keyspaces Using the Authentication Plugin

In the following example, you run an application that uses the Amazon Keyspaces authentication plugin to access Amazon Keyspaces from an EC2 instance associated with an IAM role to query your Amazon Keyspaces table. 应用程序从名为 orders 的表中返回给定客户 ID 的所有订单。

此示例包括以下步骤:

  1. Create an Amazon Keyspaces keyspace and table, and insert records.

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

    Define the IAM policy that gives the EC2 instance permissions to your Amazon Keyspaces table.

  3. Deploy and run the sample code on the EC2 instance to query your Amazon Keyspaces table.

创建示例表

要开始,请创建键空间和表,然后插入一些记录。To create the orders table, you can use the CQL Editor on the Amazon Keyspaces console, or you can use cqlsh. 有关更多信息,请参阅 安装并使用 cqlsh 连接到 Amazon 密钥空间(适用于 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 策略。Replace the Region and account ID in the Amazon Resource Name (ARN) with that from your Amazon Keyspaces account.

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

部署和运行代码

To deploy and run the code to query your Amazon Keyspaces table, use the following steps:

  1. Download the sample code from GitHub.

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

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

This example uses a sample application that implements the Amazon Keyspaces authentication plugin to access the table using the IAM role. 在您自己的代码中,您必须按照 中的步骤集成插件。使用适用于 Apache Cassandra 的 4.x DataStax Java 驱动程序和 SigV4 身份验证插件连接到 Amazon 密钥空间的分步教程.

After downloading the sample from the GitHub repository, compile the code using Apache Maven version 3.6.3 or higher using the following command.

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 Resource Access Based on Tags

You can use conditions in your identity-based policy to control access to Amazon Keyspaces resources based on tags. 本章节提供了一些示例。

以下示例说明如何创建一个策略,该策略授予用户查看表的权限(如果表的 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 用户。If a user named richard-roe attempts to view an Amazon Keyspaces table, the table must be tagged Owner=richard-roe or owner=richard-roe. Otherwise, he is denied access. 条件标签键 Owner 匹配 Ownerowner,因为条件键名称不区分大小写。For more information, see IAM JSON Policy Elements: Condition in the IAM User Guide.

以下策略授予用户创建带有标签的表的权限(如果表的 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}"} } ] }