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

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

Amazon Keyspaces 基于身份的策略示例

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

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

策略最佳实践

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

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

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

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

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

使用亚马逊Keyspaces 控制台

Amazon Keyspaces 不需要特定权限以访问亚马逊Keyspaces(for Apache Cassandra)控制台。您至少需要只读权限才能列出和查看您的 Amazon Keyspaces 资源的相关详细信息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*" ] } ] }

使用身份验证插件访问亚马逊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连接到 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 角色访问表。在您自己的代码中,您必须按照 Step-by-step 使用 4.x 连接到 Amazon Keyspace Keyspace DataStax 适用于 Apache Cassandra 的 Java 驱动程序和 SigV4 身份验证插件 中的步骤集成插件。

从下载样本后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 策略中定义的只读权限。

基于标签的亚马逊Keyspaces 资源访问权限

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

  • 要做ListGet使用资源请求AmazonSDK 在使用基于标签的访问时,调用者需要对系统表具有读取权限。例如,Select需要操作权限才能通过GetTableoperation. 如果调用方对特定表只有基于标记的访问权限,则需要额外访问系统表的操作将失败。

  • 为了与既定的 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-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}"} } ] }