动态数据屏蔽(预览版) - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

动态数据屏蔽(预览版)

以下是针对预览版 Amazon Redshift 动态数据屏蔽功能的预发行文档。文档和功能都可能会更改。我们建议您只在测试集群中使用此功能,而不要在生产环境中使用。公开预览将于 2023 年 4 月 5 日结束。在预览结束两周后会自动删除预览集群和预览无服务器工作组和命名空间。如有查询,请发送电子邮件至 redshift-pm@amazon.com。有关预览条款和条件,请参阅 Amazon 服务条款中的测试版和预览

为 DDM 创建预览集群或工作组

注意

您可以在 Preview(预览)中创建 Amazon Redshift 集群,以便测试 Amazon Redshift 的新功能。您无法在生产环境中使用这些功能,也无法将 Preview(预览)集群移动到生产集群或另一个跟踪上的集群。有关预览条款和条件,请参阅 Amazon 服务条款中的测试版和预览

Preview(预览)中创建集群
  1. 登录到 Amazon Web Services Management Console并打开 Amazon Redshift 控制台,网址:https://console.aws.amazon.com/redshift/

  2. 在导航菜单上,选择 Provisioned clusters dashboard(预置集群控制面板),然后选择 Clusters(集群)。列出您的账户在当前 Amazon Web Services 区域 区域中的集群。列表中的各个列中显示了每个集群的一部分属性。

  3. Clusters(集群)列表页面上会显示一个横幅,其中介绍了预览。选择 Create preview cluster(创建预览集群)按钮以打开创建集群页面。

  4. 输入集群的属性。选择包含要测试的功能的 Preview track(预览跟踪)。我们建议输入的集群名称指明要对该集群进行预览跟踪。为您的集群选择选项,包括标记为 -preview 的选项,用于要测试的功能。有关创建集群的一般信息,请参阅《Amazon Redshift 管理指南》中的创建集群

  5. 选择 Create preview cluster(创建预览集群)以在预览中创建集群。

  6. 当您的预览集群可用时,使用 SQL 客户端加载和查询数据。

您的集群必须使用名为 preview_2022 的预览跟踪来创建。

您可以在 Preview(预览)中创建 Amazon Redshift Serverless 工作组,以便测试 Amazon Redshift Serverless 的新功能。您无法在生产中使用这些功能,也无法将 Preview(预览)工作组移至生产工作组。有关预览条款和条件,请参阅 Amazon 服务条款中的测试版和预览

Preview(预览)中创建工作组
  1. 登录到 Amazon Web Services Management Console并打开 Amazon Redshift 控制台,网址:https://console.aws.amazon.com/redshift/

  2. 在导航菜单上,选择 Severless dashboard(Severless 控制面板),然后选择 Workgroup configuration(工作组配置)。列出您的账户在当前 Amazon Web Services 区域 中的工作组。列表中的各列中显示了每个工作组的一部分属性。

  3. Workgroups(工作组)列表页面上会显示一个横幅,其中介绍了预览。选择 Create preview workgroup(创建预览工作组)按钮以打开创建工作组页面。

  4. 输入工作组的属性。我们建议输入的工作组名称指明该工作组处于预览状态。为您的工作组选择选项,包括标记为 -preview 的选项,用于要测试的功能。继续浏览页面,为您的工作组和命名空间输入选项。有关创建工作组的一般信息,请参阅《Amazon Redshift 管理指南》中的创建带有命名空间的工作组

  5. 选择 Create preview workgroup(创建预览工作组)以在预览模式下创建工作组。

  6. 当您的预览工作组可用时,使用 SQL 客户端加载和查询数据。

在以下 Amazon Web Services 区域 中提供动态数据屏蔽:

  • 美国东部(俄亥俄)- us-east-2

  • 美国东部(弗吉尼亚北部)- us-east-1

  • 美国西部(俄勒冈)- us-west-2

  • 亚太地区(东京)- ap-northeast-1

  • 欧洲(爱尔兰)- eu-west-1

  • 欧洲(斯德哥尔摩)- eu-north-1

概览

使用 Amazon Redshift 中的动态数据屏蔽(DDM),您可以保护数据仓库中的敏感数据。您可以操纵 Amazon Redshift 在查询时如何向用户显示敏感数据,而无需在数据库中对其进行转换。您可以通过将自定义模糊处理规则应用于给定用户或角色的屏蔽策略来控制对数据的访问。这样,您无需更改底层数据或编辑 SQL 查询即可响应不断变化的隐私要求。

动态数据屏蔽策略会隐藏、模糊处理或假名化与给定格式匹配的数据。附加到表时,对表的一个或多个列应用屏蔽表达式。您可以进一步修改屏蔽策略,使其仅应用于某些用户,或者应用于您可以使用 基于角色的访问控制(RBAC) 创建的用户定义角色。此外,在创建屏蔽策略时,您可以使用条件列在单元格级别应用 DDM。有关条件屏蔽的更多信息,请参阅 条件动态数据屏蔽

您可以将具有不同模糊处理级别的多个屏蔽策略应用于表中的同一列,并将它们分配给不同的角色。为避免在不同角色对一列应用不同策略时发生冲突,可以为每个应用程序设置优先级。通过这种方式,您可以控制给定用户或角色可以访问哪些数据。DDM 策略可以部分或完全编辑数据,也可以使用以 SQL、Python 或 Amazon Lambda 编写的用户定义函数对其进行哈希处理。通过使用哈希屏蔽数据,您可以对这些数据应用联接,而无需访问潜在的敏感信息。

端到端示例

下面是一个端到端的示例,显示了如何创建屏蔽策略并将其附加到列。这些策略让用户可以访问列并查看不同的值,具体取决于与其角色相关的策略的混淆程度。您必须是超级用户或具有 sys:secadmin 角色才能运行此示例。

创建屏蔽策略

首先,创建一个表并填入信用卡值。

--create the table CREATE TABLE credit_cards ( customer_id INT, credit_card TEXT ); --populate the table with sample values INSERT INTO credit_cards VALUES (100, '4532993817514842'), (100, '4716002041425888'), (102, '5243112427642649'), (102, '6011720771834675'), (102, '6011378662059710'), (103, '373611968625635') ; --run GRANT to grant permission to use the SELECT statement on the table GRANT SELECT ON credit_cards TO PUBLIC; --create two users CREATE USER regular_user WITH PASSWORD '1234Test!'; CREATE USER analytics_user WITH PASSWORD '1234Test!'; --create the analytics_role role and grant it to analytics_user --regular_user does not have a role CREATE ROLE analytics_role; GRANT ROLE analytics_role TO analytics_user;

接下来,创建应用于分析角色的屏蔽策略。

--create a masking policy that fully masks the credit card number CREATE MASKING POLICY mask_credit_card_full WITH (credit_card VARCHAR(256)) USING ('000000XXXX0000'); --create a user-defined function that partially obfuscates credit card data CREATE FUNCTION REDACT_CREDIT_CARD (credit_card TEXT) RETURNS TEXT IMMUTABLE AS $$ import re regexp = re.compile("^([0-9]{6})[0-9]{5,6}([0-9]{4})") match = regexp.search(credit_card) if match != None: first = match.group(1) last = match.group(2) else: first = "000000" last = "0000" return "{}XXXXX{}".format(first, last) $$ LANGUAGE plpythonu; --create a masking policy that applies the REDACT_CREDIT_CARD function CREATE MASKING POLICY mask_credit_card_partial WITH (credit_card VARCHAR(256)) USING (REDACT_CREDIT_CARD(credit_card)); --confirm the masking policies using the associated system views SELECT * FROM svv_masking_policy; SELECT * FROM svv_attached_masking_policy;

附加屏蔽政策

将屏蔽政策附加到信用卡表中。

--attach mask_credit_card_full to the credit card table as the default policy --all users will see this masking policy unless a higher priority masking policy is attached to them or their role ATTACH MASKING POLICY mask_credit_card_full ON credit_cards(credit_card) TO PUBLIC; --attach mask_credit_card_partial to the analytics role --users with the analytics role can see partial credit card information ATTACH MASKING POLICY mask_credit_card_partial ON credit_cards(credit_card) TO ROLE analytics_role PRIORITY 10; --confirm the masking policies are applied to the table and role in the associated system view SELECT * FROM svv_attached_masking_policy; --confirm the full masking policy is in place for normal users by selecting from the credit card table as regular_user SET SESSION AUTHORIZATION regular_user; SELECT * FROM credit_cards; --confirm the partial masking policy is in place for users with the analytics role by selecting from the credit card table as analytics_user SET SESSION AUTHORIZATION analytics_user; SELECT * FROM credit_cards;

分离和删除屏蔽策略

以下部分显示如何通过从表中删除所有动态数据屏蔽策略来分离和删除屏蔽策略。

--reset session authorization to the default RESET SESSION AUTHORIZATION; --detach both masking policies from the credit_cards table DETACH MASKING POLICY mask_credit_card_full ON credit_cards(credit_card) FROM PUBLIC; DETACH MASKING POLICY mask_credit_card_partial ON credit_cards(credit_card) FROM ROLE analytics_role; --drop both masking policies DROP MASKING POLICY mask_credit_card_full; DROP MASKING POLICY mask_credit_card_partial;

使用动态数据屏蔽时的注意事项

使用动态数据屏蔽时,请考虑以下事项:

  • 在查询通过表创建的对象(例如视图)时,用户将看到基于他们自己的屏蔽策略的结果,而不是创建对象的用户的策略。例如,具有分析师角色的用户查询 secadmin 创建的视图时,他将看到附加到分析师角色的屏蔽策略的结果。

  • 为防止 EXPLAIN 命令可能暴露敏感的屏蔽策略筛选条件,只有拥有 SYS_EXPLAIN_DDM 权限的用户才能看到在 EXPLAIN 输出中应用的屏蔽策略。默认情况下,用户没有 SYS_EXPLAIN_DDM 权限。

    以下是向用户或角色授予权限的语法。

    GRANT EXPLAIN MASKING TO { username | ROLE rolename }

    有关 EXPLAIN 命令的更多信息,请参阅 EXPLAIN

  • 根据所使用的筛选条件或联接条件,具有不同角色的用户会看到不同的结果。例如,如果运行命令的用户应用了会模糊处理特定列的屏蔽策略,则在使用该列值的表上运行 SELECT 命令将失败。

  • 必须在任何谓词操作或预测之前应用 DDM 策略。屏蔽策略可能包括:

    • 低成本常量操作,例如将值转换为 null

    • 中等成本操作,例如 HMAC 哈希

    • 高成本操作,例如调用外部 Lambda 用户定义函数

    因此,如果可能,我们建议您使用简单屏蔽表达式。

  • 创建屏蔽策略后,便不可更改。相反,您必须分离并删除要更改的策略,然后创建并附加包含所需更改的新策略。

  • 您可以对具有行级安全策略的角色使用 DDM 策略,但请注意,RLS 策略在 DDM 之前应用。动态数据屏蔽表达式将无法读取受 RLS 保护的行。有关 RLS 的更多信息,请参阅 行级别安全性

  • 您不能附加所产生的输出与目标列的类型和大小不兼容的屏蔽策略。例如,您不能附加将 12 个字符长的字符串输出到 VARCHAR(10) 列的屏蔽策略。Amazon Redshift 支持以下例外情况:

    • 只要 M < N,输入类型为 INTN 的屏蔽策略就可以附加到大小为 INTM 的策略上。例如,BIGINT (INT8) 输入策略可以附加到 smallint (INT4) 列。

    • 输入类型为 NUMERIC 或 DECIMAL 的屏蔽策略始终可以附加到 FLOAT 列。

  • 在同一个表上应用动态数据屏蔽和行级安全策略时,结果缓存可能不会反映该表的 RLS 策略。为防止出现这种情况,请使用以下命令禁用结果缓存:

    SET enable_result_cache_for_session TO off;