通过在 Memorystore for Redis Cluster 中使用访问权限控制列表 (ACL) 政策,您可以保护对集群的访问。您可以限制用户和服务对特定密钥、命令和 Pub/Sub 通道的访问权限,从而实现精细的安全控制。
以下是使用 ACL 政策保护对集群的访问权限的示例应用场景:
- 提供基于角色的访问权限控制 (RBAC):为应用的不同组件创建不同的用户个人资料。例如,Web 前端可以具有只读访问权限,而后台工作服务具有读写权限。这样可以防止数据意外泄露或被篡改。
- 防止破坏性命令:仅限高级别管理员使用
FLUSHALL、FLUSHDB或CONFIG等危险命令。这可防止软件 bug 或人为错误导致数据完整性受损。 提供多租户应用安全性:为不同的微服务或外部合作伙伴使用单独的 ACL 用户。这样可确保一个服务的用户无法读取或修改另一服务拥有的密钥。
Memorystore for Redis Cluster 不提供资源级多租户。即使键空间已划分,一项服务也可能会消耗过多的内存或 CPU。
执行只读分析和监控:分配一个专用用户,该用户只能使用
GET或其他只读命令(例如SCAN或TYPE)来访问分析引擎或信息中心应用。这样可以防止意外写入或删除数据。安全数据库密钥:限制应用仅与符合特定模式(例如
app1:*)的密钥进行交互。这样可在集群内实现数据逻辑分离。停用 Lua 脚本:使用 ACL 政策管理集群的 Lua 脚本功能。停用或限制 Lua 脚本有助于调整性能、简化集群功能或遵守组织的安全准则。
准备工作
在开始使用 ACL 政策之前,请完成本部分中的说明。
使用 Google Cloud 控制台、Google Cloud CLI 和 API
如需使用 Google Cloud 控制台、Google Cloud CLI 和 API,请执行以下操作:
- 在 Google Cloud 控制台的项目选择器页面上,选择或创建 Google Cloud 项目。
注意:如果您不打算保留在此过程中创建的资源,请创建新的项目,而不要选择现有项目。完成本教程介绍的步骤后,您可以删除所创建的项目,并移除与该项目关联的所有资源。
前往“项目选择器” - 确保您的项目已启用结算功能。 了解如何检查项目是否已启用结算功能。
注意:如果您之前安装了 gcloud CLI,请运行
gcloud components update以确保您拥有最新版本。您需要至少使用 gcloud CLI 版本440.0.0才能访问 Memorystore for Redis Cluster gcloud CLI 命令。-
启用 Memorystore for Redis API。
Memorystore for Redis -
启用 Network Connectivity API。
Network Connectivity API -
启用 Service Consumer Management API。
Service Consumer Management API
分配 Memorystore for Redis Cluster 角色
确保您或您正在使用的用户账号拥有所需的操作权限。
如需执行所有 ACL 政策操作,请使用 Redis Admin (roles/redis.admin) 和 Redis Editor (roles/redis.editor) 角色。如需仅查看 ACL 政策,请使用 Redis Viewer (roles/redis.viewer) 角色。
分配 Memorystore for Redis Cluster 权限
除了 Redis 管理员、Redis 编辑者和 Redis 查看者角色之外,如需在 Memorystore for Redis Cluster 中使用 ACL 政策,您还需要以下权限:
| 操作 | 权限 |
|---|---|
| 创建 ACL 政策 | redis.aclPolicies.create |
| 为集群分配 ACL 政策 | redis.clusters.update |
| 查看有关 ACL 政策的信息 | redis.aclPolicies.list |
| 查看有关 ACL 政策的信息 | redis.aclPolicies.get |
| 查看有关 ACL 政策修订版本的信息 | redis.aclPolicyRevisions.list |
| 查看有关 ACL 政策修订版本的信息 | redis.aclPolicyRevisions.get |
| 修改 ACL 政策 | redis.aclPolicies.update |
| 从集群中移除 ACL 政策 | redis.clusters.update |
| 删除 ACL 政策 | redis.aclPolicies.delete |
创建 ACL 政策
通过在 Memorystore for Redis Cluster 中创建 ACL 政策,您可以限制用户对特定键、命令和 Pub/Sub 通道的访问权限,从而增强集群的安全性。
您可以使用 gcloud CLI 创建 ACL 政策。
gcloud
如需创建 ACL 政策,请使用 gcloud redis acl-policies create 命令。
gcloud redis acl-policies create ACL_POLICY_NAME \ --region=REGION \ --rules=rule="on ~* +@all",username="lucian" \ --rules=rule="on +get",username="taylor"
进行以下替换:
- ACL_POLICY_NAME:您要创建的 ACL 政策的名称。 政策名称只能包含小写字母、数字和连字符。还必须以字母开头,并在其区域中是唯一的。
- REGION:您希望 ACL 政策所在的区域。
此政策使用基于令牌的基本身份验证,并包含可执行以下操作的规则:
- 第一个规则授予
lucian~* +@all权限。此权限允许用户访问所有密钥并运行所有命令。 - 第二条规则向
taylor授予get权限。此权限允许用户检索与键关联的值。它会限制用户对只读数据操作的访问权限,并防止用户修改密钥。
如需为使用 Identity and Access Management (IAM) 身份验证的 ACL 政策创建规则,建议您使用 IAM 主账号作为用户名(例如用户的电子邮件地址)。
gcloud redis acl-policies create ACL_POLICY_NAME \ --region=REGION \ --rules=rule="on ~* +@all",username="lucian@example.com" \ --rules=rule="on +get",username="taylor@example.com"
如需为不使用身份验证的 ACL 政策创建规则,用户必须是 default 用户。
gcloud redis acl-policies create ACL_POLICY_NAME \ --region=REGION \ --rules=rule="on ~* +@all",username="default"
如需详细了解基于令牌的基本身份验证和 IAM 身份验证,请参阅使用基于令牌的基本身份验证来保护对集群的访问和关于 IAM 身份验证。
如需详细了解您可以创建的其他 ACL 规则和政策,请参阅 Redis 文档中的 ACL。
为集群分配 ACL 政策
通过为集群分配 ACL 政策或替换已分配的政策,您可以使 Memorystore for Redis Cluster 将相应政策的规则应用于该集群。这样一来,您就可以限制用户对特定键、命令和 Pub/Sub 通道的访问权限。
您可以使用 gcloud CLI 为集群分配 ACL 政策。
为新集群分配政策
如需创建集群并为集群分配 ACL 政策,请参阅创建实例。
为现有集群分配政策
如需提高现有集群的安全性,您可以为该集群分配 ACL 政策。
gcloud
如需为现有集群分配 ACL 政策,请使用 gcloud redis clusters update 命令。
gcloud redis clusters update CLUSTER_ID \ --update_mask=acl_policy \ --acl-policy=ACL_POLICY_NAME \ --region=REGION
进行以下替换:
- CLUSTER_ID:您要向其分配 ACL 政策的集群的 ID
- ACL_POLICY_NAME:ACL 政策的名称
- REGION:集群所在的区域
查看有关 ACL 政策的信息
查看 Memorystore for Redis Cluster 中有关 ACL 政策的信息有助于您维护安全性、确保环境的运行稳定性,并让您能够审核内存中数据。这些政策定义了哪些用户可以读取或修改特定键模式、运行特定命令或访问特定 Pub/Sub 渠道。
您可以使用 gcloud CLI 查看有关 ACL 政策的信息。
gcloud
如需查看有关 ACL 政策的信息,请使用 gcloud redis acl-policies list 命令。
gcloud redis acl-policies list --region=REGION
将 REGION 替换为 ACL 政策所在的区域。
查看有关 ACL 政策的信息
通过查看 Memorystore for Redis Cluster 中的 ACL 政策的相关信息,您可以执行安全审核、排查访问权限错误,并通过验证用户命令、密钥权限和对 Pub/Sub 通道的访问权限来强制执行最小权限原则。此外,管理员可以查看 ACL 政策,以确保应用具有适当的访问权限并检测过于宽松的规则。
您可以使用 gcloud CLI 查看有关 ACL 政策的信息。如需查看此信息,请使用 gcloud redis acl-policies describe 命令。
gcloud redis acl-policies describe ACL_POLICY_NAME \ --region=REGION
进行以下替换:
- ACL_POLICY_NAME:您要查看其信息的 ACL 政策的名称
- REGION:ACL 政策所在的区域
查看有关 ACL 政策修订版本的信息
当您创建 ACL 政策时,Memorystore for Redis Cluster 会为该政策创建一个版本(修订版本)。每次修改政策时,Memorystore for Redis Cluster 都会创建后续的政策修订版本。
由于 Memorystore for Redis Cluster 会自动生成这些修订版本,因此您可以将它们用于内部跟踪和审核。此外,通过查看修订版本,您可以查看每个历史版本中 ACL 政策的确切内容。
借助 ACL 政策修订版本,您可以跟踪哪些集群正在使用政策的哪个修订版本。这有助于您在政策更新后最终保持一致性的期间内保持可见性,并确保集群使用正确的版本。
您可以使用 gcloud CLI 查看有关 ACL 政策修订版本的信息。
gcloud
如需查看有关 ACL 政策修订版本的信息,请使用 gcloud redis acl-policies revisions list 命令。
gcloud redis acl-policies revisions list \ --acl-policy=ACL_POLICY_NAME \ --region=REGION
进行以下替换:
- ACL_POLICY_NAME:包含您要查看其相关信息的修订版本的 ACL 政策的名称
- REGION:ACL 政策所在的区域
在输出中,记下修订版本 ID。您需要使用这些 ID 来查看有关特定 ACL 政策修订版本的信息。
查看有关 ACL 政策修订版本的信息
查看 ACL 政策修订版本可让您了解其规则、元数据以及所有关联集群的列表。您可以使用 gcloud CLI 查看有关 ACL 政策修订版本的信息。
gcloud
如需查看有关 ACL 政策修订版本的信息,请使用 gcloud redis acl-policies revisions describe 命令。
gcloud redis acl-policies revisions describe ACL_POLICY_REVISION_ID \ --acl-policy=ACL_POLICY_NAME \ --region=REGION
进行以下替换:
- ACL_POLICY_REVISION_ID:您要查看相关信息的 ACL 政策修订版本的 ID。您在查看有关 ACL 政策修订版本的信息时记下了此 ID。
- ACL_POLICY_NAME:包含修订版本的 ACL 政策的名称。
- REGION:ACL 政策所在的区域。
修改 ACL 政策
通过修改 Memorystore for Redis Cluster 中的 ACL 政策,您可以增强安全性、强制执行最小权限访问并管理运营安全。您可以使用 gcloud CLI 修改政策。
向 ACL 政策添加规则
如需提高 ACL 政策的安全性,请向其添加规则。
gcloud
如需向 ACL 政策添加规则,请使用 gcloud redis acl-policies update 命令。
gcloud redis acl-policies update ACL_POLICY_NAME \ --region=REGION \ --add-rules=rule="on ~list:*",username="lucian"
进行以下替换:
- ACL_POLICY_NAME:您要为其添加 ACL 规则的 ACL 政策的名称
- REGION:ACL 政策所在的区域
此规则授予 lucian 对所有以 list: 开头的密钥的访问权限。
替换 ACL 政策的规则
替换 ACL 政策的 ACL 规则可提供更严密的安全保障、更高的运营安全性,以及更精细的用户访问权限控制。例如,您可以在突发事件响应期间撤消权限,也可以出于调试目的启用临时访问权限。
gcloud
如需替换 ACL 政策的规则,请使用 gcloud redis acl-policies update 命令。
gcloud redis acl-policies update ACL_POLICY_NAME \ --region=REGION \ --rules=rule="on ~c*che",username="lucian"
进行以下替换:
- ACL_POLICY_NAME:您要替换 ACL 规则的 ACL 政策的名称
- REGION:ACL 政策所在的区域
您要替换的政策规则授予对所有与 c*che 模式匹配的密钥的 lucian 访问权限。例如:cache、caache 和 ceche。
从 ACL 政策中移除规则
如果某条 ACL 规则不再适用于某个 ACL 政策,您可以将其移除。
gcloud
如需从 ACL 政策中移除规则,请使用 gcloud redis acl-policies update 命令。
gcloud redis acl-policies update ACL_POLICY_NAME \ --region=REGION \ --remove-rules=rule="on ~set",username="lucian"
进行以下替换:
- ACL_POLICY_NAME:您要从中移除 ACL 规则的 ACL 政策的名称
- REGION:ACL 政策所在的区域
移除此规则会撤消其针对 lucian 的关联权限。如需访问集群,lucian 现在必须以 default 用户身份连接,并且受该用户的权限限制。
从集群中移除 ACL 政策
如果 ACL 政策不再适用于 Memorystore for Redis Cluster 中的集群,您可以将其移除。您可以使用 gcloud CLI 移除政策。
gcloud
如需从集群中移除 ACL 政策,请使用 gcloud redis clusters update 命令。
gcloud redis clusters update CLUSTER_ID \ --acl-policy="" \ --region=REGION
进行以下替换:
- CLUSTER_ID:要从中移除 ACL 政策的集群的 ID
- REGION:集群所在的区域
acl-policy 参数的 "" 值为空字符串。这表示您要从集群中移除 ACL 政策。
删除 ACL 政策
如果您不再需要某个 ACL 政策,可以将其删除。您可以使用 gcloud CLI 删除政策。
gcloud
如需删除 ACL 政策,请使用 gcloud redis acl-policies delete 命令。
gcloud redis acl-policies delete ACL_POLICY_NAME \ --region=REGION
进行以下替换:
- ACL_POLICY_NAME:您要删除的 ACL 政策的名称
- REGION:ACL 政策所在的区域
停用 Lua 脚本
您可以使用 ACL 政策来管理集群的 Lua 脚本功能。停用或限制 Lua 脚本有助于调整性能、简化集群的功能,或遵守组织的安全准则。
为用户停用脚本命令
如需停用 Lua 脚本,以便用户无法运行这些脚本,您必须使用 ACL 政策,并从用户的 ACL 规则字符串中移除脚本命令的权限。
Redis 将命令分为若干组。Lua 脚本属于 @scripting 类别。您必须移除用户权限的主要命令包括:
EVAL:运行以字符串形式提供的 Lua 脚本EVALSHA:运行使用SCRIPT LOAD命令缓存的 Lua 脚本SCRIPT:管理脚本缓存(例如LOAD、FLUSH、EXISTS和KILL)SCRIPT命令包含以下子命令:
您可以为用户停用所有脚本命令或特定命令。
如需停用脚本命令,请使用 gcloud CLI,并在命令或类别前添加减号 (-)。
为用户停用所有脚本命令
如需为用户停用所有脚本命令,请创建 ACL 政策并将其分配给集群,或修改分配给集群的 ACL 政策。
创建政策
如需创建 ACL 政策以针对名为 lucian 的用户停用所有脚本命令,请使用 gcloud redis acl-policies create 命令。
gcloud redis acl-policies create POLICY_NAME \ --region=REGION \ --rules=rule="on ~* +@all -@scripting",username=lucian
进行以下替换:
- POLICY_NAME:ACL 政策的名称
- REGION:您希望 ACL 政策所在的区域
修改政策
如需修改 ACL 政策以针对 lucian 停用所有脚本命令,请使用 gcloud redis acl-policies update 命令。
gcloud redis acl-policies update POLICY_NAME \ --region=REGION \ --rules=rule="on ~* +@all -@scripting",username=lucian
进行以下替换:
- POLICY_NAME:ACL 政策的名称
- REGION:ACL 政策所在的区域
如果您只想授予用户所需的特定权限,请更改 +@all 值。例如,如果您希望用户仅有权访问只读命令,请将 +@all 更改为 +@read。如需详细了解可设置的用户权限,请参阅 Redis ACL 文档。
为用户停用脚本命令
您可以指定要针对用户停用的特定命令。例如,您可以允许用户运行除 SCRIPT FLUSH 命令之外的所有脚本命令。如需为用户停用脚本命令,您可以创建 ACL 政策并将其分配给集群,也可以修改分配给集群的 ACL 政策。
您可以停用任何脚本命令。对于本部分中的示例,您需要为用户停用 SCRIPT FLUSH 命令。如需查看脚本命令列表,请参阅为用户停用脚本命令。
创建政策
如需创建 ACL 政策以针对 lucian 停用 SCRIPT FLUSH 脚本命令,请使用 gcloud redis acl-policies create 命令。
gcloud redis acl-policies create POLICY_NAME \ --region=REGION \ --rules=rule="on ~* -script|flush",username=lucian
进行以下替换:
- POLICY_NAME:ACL 政策的名称
- REGION:您希望 ACL 政策所在的区域
修改政策
如需修改 ACL 政策以针对 lucian 停用所有脚本命令,请使用 gcloud redis acl-policies update 命令。
gcloud redis acl-policies update POLICY_NAME \ --region=REGION \ --rules=rule="on ~* -script|flush",username=lucian
进行以下替换:
- POLICY_NAME:ACL 政策的名称
- REGION:ACL 政策所在的区域
如果您只想授予用户所需的特定权限,请更改 +@all 值。例如,如果您希望用户仅有权访问只读命令,请将 +@all 更改为 +@read。如需详细了解可设置的用户权限,请参阅 Redis ACL 文档。
保护默认用户
如需为 default 超级用户停用脚本编写权限,请创建 ACL 政策并将其分配给集群,或修改分配给集群的 ACL 政策。
创建政策
如需创建 ACL 政策以针对 default 用户停用所有脚本命令,请使用 gcloud redis acl-policies create 命令。
gcloud redis acl-policies create POLICY_NAME \ --region=REGION \ --rules=rule="on ~* +@all -@scripting",username=default
进行以下替换:
- POLICY_NAME:ACL 政策的名称
- REGION:您希望 ACL 政策所在的区域
修改政策
如需修改 ACL 政策以针对 default 用户停用所有脚本命令,请使用 gcloud redis acl-policies update 命令。
gcloud redis acl-policies update POLICY_NAME \ --region=REGION \ --rules=rule="on ~* +@all -@scripting",username=default
进行以下替换:
- POLICY_NAME:ACL 政策的名称
- REGION:ACL 政策所在的区域
如果您只想授予 default 用户所需的特定权限,请更改 +@all 值。例如,如果您希望此用户仅有权访问只读命令,请将 +@all 更改为 +@read。如需详细了解您可以设置的用户权限,请参阅 Redis ACL 文档。
问题排查
本部分列出了您在使用 ACL 政策时可能会收到的错误消息、这些消息的原因,以及问题排查提示。
| 出错提示 | 原因 | 问题排查 |
|---|---|---|
username cannot be empty |
您在 ACL 政策中为用户名设置了空字符串或仅包含空格的字符串。 | 使用包含字母数字字符或特殊字符的用户名。然后,再次创建 ACL 政策。 |
duplicate username found in ACL policy |
您在 ACL 政策中使用了重复的用户名。 | 使用错误日志查找重复的用户名。修改 ACL 政策创建请求,以指定用户名的规则。然后,再次创建 ACL 政策。 |
ACL rule token cannot contain token. use either
IAM or Basic Auth features to enable authentication
|
您无法在 ACL 政策中使用密码字符(例如 <、>、# 和 !)或相关命令(例如 nopass、resetpass 和 reset)。 |
从 ACL 政策的规则中移除所有密码字符和相关命令。然后,再次创建 ACL 政策。如需设置身份验证,请启用基本身份验证或基于 IAM 的身份验证。 |
passwords not allowed in ACL rules (token starts with
char). use either IAM or Basic Auth features to
enable authentication |
您无法在 ACL 政策中使用密码字符(例如 <、>、# 和 !)或相关命令(例如 nopass、resetpass 和 reset)。 |
从 ACL 政策的规则中移除所有密码字符和相关命令。然后,再次创建 ACL 政策。如需设置身份验证,请启用基本身份验证或基于 IAM 的身份验证。 |
invalid ACL rule syntax |
您未正确设置一个或多个 ACL 政策规则中的访问权限字符串的格式。 | 正确设置访问字符串的格式。 |
ACL policy is in DELETING state and cannot be used |
您尝试为集群分配 ACL 政策,但该政策的状态为 DELETING。 |
为集群分配其他 ACL 政策。 |
ACL_POLICY_IN_USE: ACL policy is in use by 1 or more clusters
|
您尝试删除的 ACL 政策已分配给至少一个集群。 | 您必须先从分配了 ACL 政策的所有集群中移除该政策,然后才能将其删除。如需确定哪些集群已分配给某项政策,请参阅查看有关 ACL 政策的信息。 |
fast-failing the workflow as the resource is in DELETING
state |
您尝试修改状态为 DELETING 的 ACL 政策。 |
如果 ACL 政策的状态为 DELETING,则您无法修改该政策。 |