17、Snowflake数据共享与安全特性全解析

Snowflake数据共享与安全特性全解析

1. 读者账户设置

在进行数据共享和访问操作时,首先要创建能登录读者账户并访问数据的用户。根据用户在读者账户中被允许执行的操作,为其授予相应的角色。为了能够查询共享数据库中的对象,需要创建一个虚拟仓库,并将仓库的使用权限授予用户。由于读者账户并非Snowflake客户,读者账户消耗的任何信用额度都将由提供者账户承担。因此,强烈建议创建一个或多个资源监控器,并决定它们是控制账户中的所有仓库还是单个仓库。此外,要查询与读者账户共享的数据,还必须将从共享创建的每个数据库的导入权限授予相应的角色,示例代码如下:

grant IMPORTED PRIVILEGES on database SUPPLIERS_SHARE to <role>;
2. Snowflake市场概述

Snowflake市场允许第三方数据提供者共享数据,用户可以直接从Snowflake账户访问这些数据,就像查询账户中的其他数据一样。Snowflake市场适用于所有托管在非VPS区域的Snowflake账户。数据消费者使用Snowflake市场可以实现以下功能:
- 发现和评估可能对其业务案例有用的第三方数据。
- 访问供应商提供的、可在Snowflake中使用首选工具进行查询的数据。

由于数据由数据提供者维护,消费者无需额外努力,数据始终保持最新状态。

3. 数据列表类型

Snowflake市场中的数据通过列表提供,主要有以下几种类型:
| 列表类型 | 描述 |
| ---- | ---- |
| 市场列表 | 数据提供者可以列出可与多个消费者共享的数据产品。 |
| 免费列表 | 消费者可立即访问数据。 |
| 个性化列表 | 消费者可以向提供者请求数据,例如因为这是需要付费的高级数据或为消费者定制的数据。 |

每个列表都包含共享数据的信息、示例查询以及数据提供者的详细信息。

访问免费列表数据的步骤如下:
1. 在Snowsight中点击“获取”按钮。
2. 提供要创建的数据库名称和允许访问共享的角色。
3. 同意提供者的使用条款和Snowflake的消费者条款。点击“获取”按钮后,数据库将立即在Snowflake账户中创建并可用。

访问个性化列表数据的步骤如下:
1. 在Snowsight中点击“请求”按钮。
2. 提供您的联系信息。
3. 等待列表提供者与您联系,商定商业条款和条件。一旦条款被接受,个性化数据集将被创建并与请求的消费者共享。

4. 获取或请求列表

只有在所在区域激活了Snowflake市场,才能访问该市场。所有用户都可以浏览Snowflake市场中的列表,但只有具有ACCOUNTADMIN角色或导入共享权限的用户才能获取或请求数据。如果没有必要的权限,可以采取以下步骤之一:
- 请Snowflake账户管理员授予您导入共享权限。
- 请Snowflake账户管理员获取数据,并将从共享创建的数据库的导入权限授予您。

具体操作流程如下:
1. 点击Snowsight左导航窗格中的“市场”选项,Snowflake数据市场窗口将出现,可在其中浏览列表。
2. 滚动浏览可用列表并阅读描述,也可以点击每个列表以查找更多详细信息和示例查询。
3. 选择要使用的列表后,在列表详细信息页面点击“获取”按钮。
4. 提供将在您的账户中创建的数据库名称以及允许访问共享的任何角色。
5. 如果同意窗口底部的条款和条件,再次点击“获取”按钮,将出现一条消息,告知您数据已准备好查询。
6. 返回左侧主菜单,点击“数据”选项,展开“数据库”文件夹,您应该会看到新创建的数据库。

graph LR
    A[打开Snowsight] --> B[点击市场选项]
    B --> C[浏览列表]
    C --> D{选择列表类型}
    D -- 免费列表 --> E[点击获取按钮]
    D -- 个性化列表 --> F[点击请求按钮]
    E --> G[提供数据库名和角色]
    G --> H[同意条款并再次点击获取]
    H --> I[数据准备好查询]
    F --> J[提供联系信息]
    J --> K[等待提供者联系]
    K --> L[商定商业条款]
    L --> M[创建并共享个性化数据集]
5. 成为提供者

如果您有想要在Snowflake市场上共享的数据,可以申请成为提供者。具体步骤如下:
1. 点击Snowsight左导航窗格中的“市场”选项。
2. 滚动到页面底部,点击“成为提供者”按钮。
3. 提供额外信息,获得批准后,您将能够使用Snowsight中的提供者工作室选项创建列表。

此外,还可以通过点击市场页面底部的“告知我们”按钮并填写出现的表单中的请求信息,提交将新数据添加到Snowflake市场的请求。也可以直接通过网页浏览器访问Snowflake市场,网址为:www.snowflake.com/en/data-cloud/marketplace/ ,在那里可以选择浏览列表或获取有关Snowflake市场的其他信息。

6. 数据交换

Snowflake数据交换是一个数据中心,Snowflake客户可以使用它在邀请的一组成员之间共享数据。与Snowflake市场类似,此功能使提供者能够发布可被消费者发现的数据。目前,数据交换只能由Snowflake支持启用。Snowflake客户必须提交支持请求,等待数据交换被配置和供应。之后,客户可以邀请成员加入交换,并指定他们是可以消费数据、提供数据还是两者都可以。数据交换可用于公司内部业务部门之间的数据共享、与外部合作伙伴的数据共享,甚至与其他数据交换的数据共享。

数据交换的管理结构如下:
- 托管数据交换的Snowflake账户(数据交换管理员)负责配置数据交换和管理成员。
- 交换成员是Snowflake账户,如提供者和消费者,由数据交换管理员添加。管理员可以授予和撤销成员的访问权限、授予和撤销对共享数据的访问权限、审计数据使用情况并定义对共享数据的任何访问控制。

与Snowflake市场一样,数据交换中的提供者可以创建列表、定义列表类型、发布列表,并在列表不是免费的情况下授予访问权限。消费者可以通过浏览可用列表发现数据,并访问从列表中选择的数据。

7. 安全视图

Snowflake提供安全视图,用于隐藏可能通过标准视图暴露的敏感信息。标准视图的内部优化可能需要访问视图基表中的底层数据,这可能会将应向用户隐藏的数据暴露出来。安全视图不使用与标准视图相同的优化,以避免数据意外暴露。不过,安全视图通常比标准视图执行速度慢,因此如果视图的目的是简化查询,不建议使用安全视图。当视图专门用于数据隐私,以限制对不应向底层表的所有用户暴露的敏感数据的访问时,应将其定义为安全视图。

标准视图的查询表达式在各种命令和接口中对用户可见。如果不希望用户看到视图的底层表或查询细节,应创建安全视图,其视图定义仅对授权用户可见。为了理解数据如何间接暴露,下面介绍“下推”的概念。以以下查询为例:

select *
from SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.LINEITEM
where l_shipmode = 'RAIL';

该查询的执行步骤如下:
1. 从FROM子句开始,将LINEITEM表中的所有行读入内存。
2. 应用WHERE子句过滤掉不匹配’RAIL’的任何行。
3. 最后,使用SELECT子句中的列列表从仍保留在内存中的行中选择列。

这种方法先加载数据后过滤,效率不高。更好的做法是尽早过滤,即“下推”过滤器到查询计划的更深处。在上述示例中,先根据WHERE子句过滤,只将过滤后的行加载到内存中,可能会更高效。虽然过滤时间不会节省,但可以节省内存使用,并且由于行数先减少,后续处理时间也会减少。

“下推”适用于许多不同类型的查询,最具选择性的过滤器通常被下推到最深层以最早执行。如果Snowflake查询优化器以允许更具选择性的过滤器在用于保护数据的过滤器之前执行的方式应用过滤器,可能会暴露底层数据的细节。创建安全视图可以告诉优化器不要下推此类过滤器。

8. 创建安全视图

使用CREATE VIEW或CREATE MATERIALIZED VIEW命令中的SECURE关键字来定义安全视图。例如,创建一个名为LINEITEM_RAIL的安全视图,从Snowflake示例数据库表LINEITEM中选择数据,并过滤发货模式等于’RAIL’的行,代码如下:

create secure view LINEITEM_RAIL as
select *
from SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.LINEITEM
where l_shipmode = 'RAIL';

要验证安全视图是否已创建且确实是安全的,可以使用SHOW VIEWS命令:

show views like '%RAIL%';

该命令的输出应包括LINEITEM_RAIL_SECURE视图,并且IS_SECURE列应包含值TRUE。同样,创建安全物化视图时,使用SHOW MATERIALIZED VIEWS命令并检查IS_SECURE列来确定视图是否安全。

要将现有视图转换为安全视图,在ALTER VIEW或ALTER MATERIALIZED VIEW命令中设置SECURE关键字;要将安全视图转换为标准视图,取消设置SECURE关键字。示例代码如下:

alter view LINEITEM_RAIL unset SECURE;
alter view LINEITEM_RAIL set SECURE;

只有被授予拥有安全视图角色的用户才能查看安全视图的定义。未经授权的用户无法通过以下任何方式查看安全视图的定义:
- 执行SHOW VIEWS或SHOW MATERIALIZED VIEWS命令。
- 使用GET_DDL实用函数。
- 从信息模式中的VIEWS视图中选择。
- 从账户使用情况中的VIEWS视图中选择。

查询配置文件也不会显示任何安全视图的详细信息,即使是安全视图的所有者也不例外,因为其他用户可能能够查看所有者的查询配置文件。Snowflake不会显示使用安全视图的查询扫描的数据量或数据总量,以向仅能访问数据子集的用户隐藏数据大小信息,防止他们推断出数据总量。

9. 使用安全视图的最佳实践

尽管安全视图可以防止用户查看视图过滤的数据,但仍有数据暴露的可能。例如,在表中使用序列生成主键,如果这些键显示给没有访问所有底层数据权限的用户,他们可能仍能猜测数据分布。以Snowflake示例数据库中的ORDERS表为例,创建一个过滤某一职员订单的视图:

create secure view ORDERS_CLERK682 as
select *
from SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.ORDERS
where o_clerk = 'Clerk#000000682';

假设职员682只能通过安全视图ORDERS_CLERK682查看自己的订单数据。如果主键列O_ORDERKEY由序列生成,该职员可以通过执行以下查询:

select o_orderkey, o_orderdate
from ORDERS_CLERK682
order by o_orderdate;

根据结果,通过减去订单键中的序列号,猜测两个订单日期之间创建的订单数量。为避免向用户暴露此类信息,可以采取以下方法:
- 如果不需要,不要在视图中包含由序列生成的列。
- 用随机标识符替换由序列生成的值,或使用哈希对其进行混淆处理。

即使通过创建安全视图隐藏了所有敏感数据和查询细节,用户仍可能根据查询执行时间对底层数据量进行观察。为防止用户知道视图查询的执行时间,建议以物化安全视图的形式物化数据,而不是创建安全视图。对于ORDERS表,可以为每个职员创建一个单独的安全物化视图,其中只包含该职员可访问的订单,并授予相应角色以允许每个职员访问该视图。

10. 安全用户定义函数

与视图类似,SQL用户定义函数(UDF)的一些内部优化需要访问函数使用的表中的底层数据,这可能会暴露对UDF用户隐藏的数据。为确保用户无法访问底层数据,Snowflake提供安全UDF,其定义和细节仅对被授予拥有UDF角色的用户可见。

Snowflake查询优化器在安全UDF中使用的优化与常规UDF不同,这可能会降低安全UDF的性能。因此,只有在希望保护数据或函数细节不被用户暴露时才创建安全UDF,在常规UDF足以满足需求的情况下则无需创建。如果通过使用安全对象(如安全视图或安全UDF)限制对数据的访问,要确保访问相同数据的所有对象都是安全的。否则,如果一种对象是安全的,而另一种不是,数据仍会暴露。

11. 创建安全UDF

使用CREATE FUNCTION命令中的SECURE关键字创建安全UDF。例如,需要为几个选定的客户计算特殊客户折扣,但不希望用户知道应用此折扣的计算方法,可以创建一个名为CALC_CUST_DISCOUNT的安全函数,代码如下:

create secure function CALC_CUST_DISCOUNT ()
returns table (o_orderkey number, cust_discount number)
language sql
as
$$
  select o_orderkey,
    case when o_custkey in (22768, 918242, 995239, 1070557)
         then o_totalprice * 0.1
    else 0 end as cust_discount
  from SNOWFLAKE_SAMPLE_DATA.TPCH_SF10.ORDERS
$$
;

要验证安全UDF是否已创建且确实是安全的,可以使用SHOW FUNCTIONS命令:

show functions like '%DISCOUNT%';

该命令的输出应包括CALC_CUST_DISCOUNT函数,并且IS_SECURE列应包含值’Y’。要将现有函数转换为安全函数,在ALTER FUNCTION命令中设置SECURE关键字;要将安全函数转换为标准函数,取消设置SECURE关键字。示例代码如下:

alter function CALC_CUST_DISCOUNT unset SECURE;
alter function CALC_CUST_DISCOUNT set SECURE;

只有被授予拥有安全UDF角色的用户才能查看安全函数的定义。未经授权的用户无法通过以下任何方式查看安全函数的定义:
- 执行SHOW FUNCTIONS命令。
- 使用GET_DDL实用函数。
- 从信息模式中的FUNCTIONS视图中选择。

查询配置文件也不会显示任何安全UDF的详细信息,即使是安全UDF的所有者也不例外,因为其他用户可能能够查看所有者的查询配置文件。Snowflake不会显示使用安全UDF的查询扫描的数据量或数据总量,以向仅能访问数据子集的用户隐藏数据大小信息,防止他们推断出数据总量。

12. 安全UDF的最佳实践

尽管安全函数可以防止用户查看函数过滤的数据,但仍有数据暴露的可能。在使用安全UDF时,要充分考虑数据的安全性和访问控制,避免因疏忽导致数据泄露。

Snowflake数据共享与安全特性全解析

13. 总结与注意事项

Snowflake的数据共享和安全特性为企业提供了强大而灵活的数据管理和保护能力。通过合理配置读者账户、利用Snowflake市场和数据交换进行数据共享,以及运用安全视图和安全用户定义函数来保护敏感数据,可以在满足业务需求的同时,确保数据的安全性和隐私性。

在使用这些特性时,需要注意以下几点:
- 权限管理 :严格控制用户的权限,确保只有授权用户能够获取和操作数据。对于不同的角色,应根据其职责和需求授予相应的权限。
- 数据暴露风险 :即使使用了安全视图和安全UDF,仍需警惕数据暴露的潜在风险。例如,避免在视图中包含不必要的敏感列,对可能暴露数据分布的信息进行处理。
- 性能考虑 :安全视图和安全UDF的性能可能会受到影响。在选择使用这些特性时,要权衡数据安全和性能需求,根据实际情况选择合适的解决方案。

14. 对比分析

为了更清晰地了解Snowflake不同安全特性的特点和适用场景,下面对安全视图和安全UDF进行对比分析:

特性 安全视图 安全UDF
定义目的 隐藏视图基表中的敏感信息,限制对敏感数据的访问 保护函数使用的表中的底层数据,防止数据暴露
性能影响 通常比标准视图执行速度慢 可能会降低性能,因为使用了不同的优化策略
适用场景 当需要限制对表中部分数据的访问,且不希望用户看到视图的底层表或查询细节时使用 当需要保护函数的计算逻辑和使用的数据不被用户暴露时使用
创建方式 使用CREATE VIEW或CREATE MATERIALIZED VIEW命令中的SECURE关键字 使用CREATE FUNCTION命令中的SECURE关键字
查看定义权限 只有被授予拥有安全视图角色的用户才能查看定义 只有被授予拥有安全UDF角色的用户才能查看定义
15. 实际应用案例

以下是一个实际应用案例,展示如何综合运用Snowflake的数据共享和安全特性来满足企业的业务需求。

假设一家电商公司有多个业务部门,包括销售部门、市场部门和财务部门。公司希望在不同部门之间共享数据,同时保护敏感信息。

  • 数据共享 :通过Snowflake数据交换,公司可以在各部门之间共享数据。例如,销售部门可以将销售数据共享给市场部门,以便市场部门进行市场分析和推广活动策划。
  • 安全视图 :为了保护客户的敏感信息,如客户的联系方式和购买记录,公司可以创建安全视图。只有被授权的用户才能访问这些安全视图,从而确保客户数据的安全性。
-- 创建安全视图,只允许特定角色访问客户的部分信息
create secure view CUSTOMER_INFO as
select customer_id, customer_name
from CUSTOMER_TABLE
where role = 'authorized_role';
  • 安全UDF :财务部门需要对订单数据进行复杂的计算,如计算订单的折扣和税费。为了保护计算逻辑不被其他部门看到,公司可以创建安全UDF。
-- 创建安全UDF,计算订单的折扣和税费
create secure function CALC_ORDER_TOTAL (order_id number)
returns number
language sql
as
$$
  select order_amount * (1 - discount_rate) + tax_amount
  from ORDER_TABLE
  where order_id = order_id
$$
;
16. 未来趋势展望

随着数据安全和隐私保护的重要性日益增加,Snowflake的数据共享和安全特性将不断发展和完善。未来可能会出现以下趋势:

  • 更智能的安全机制 :Snowflake可能会引入更智能的安全机制,如基于人工智能和机器学习的安全分析,能够自动识别和防范潜在的数据安全威胁。
  • 增强的数据共享功能 :为了满足企业更复杂的数据共享需求,Snowflake可能会进一步增强数据共享功能,如支持更灵活的共享策略和更高效的数据传输。
  • 与其他安全工具的集成 :Snowflake可能会与其他安全工具进行集成,如身份验证和访问管理工具,提供更全面的安全解决方案。
17. 操作流程总结

为了方便读者回顾和操作,下面总结了Snowflake数据共享和安全特性的主要操作流程:

graph LR
    A[读者账户设置] --> B[创建用户并授予角色]
    B --> C[创建虚拟仓库并授予使用权限]
    C --> D[创建资源监控器]
    D --> E[授予数据库导入权限]
    E --> F[Snowflake市场操作]
    F --> G[浏览列表]
    G --> H{选择列表类型}
    H -- 免费列表 --> I[获取数据]
    H -- 个性化列表 --> J[请求数据]
    I --> K[创建数据库并访问数据]
    J --> L[等待提供者联系并商定条款]
    L --> M[创建并共享个性化数据集]
    N[安全视图操作] --> O[创建安全视图]
    O --> P[验证安全视图]
    P --> Q[转换视图类型]
    R[安全UDF操作] --> S[创建安全UDF]
    S --> T[验证安全UDF]
    T --> U[转换UDF类型]
18. 常见问题解答

在使用Snowflake的数据共享和安全特性时,可能会遇到一些常见问题,以下是对这些问题的解答:

  • 问题1:安全视图和标准视图有什么区别?
    安全视图不使用与标准视图相同的优化,以避免数据意外暴露。标准视图的查询表达式对用户可见,而安全视图的定义仅对授权用户可见。

  • 问题2:安全UDF的性能会受到多大影响?
    安全UDF的性能可能会受到一定影响,因为Snowflake查询优化器在安全UDF中使用的优化与常规UDF不同。在实际使用中,需要根据具体情况权衡数据安全和性能需求。

  • 问题3:如何确保所有访问相同数据的对象都是安全的?
    在创建安全对象(如安全视图和安全UDF)时,要确保所有访问相同数据的对象都使用了安全特性。同时,要严格控制用户的权限,避免未授权的访问。

19. 总结建议

Snowflake的数据共享和安全特性为企业提供了全面的数据管理和保护解决方案。在实际应用中,企业应根据自身的业务需求和数据安全要求,合理配置和使用这些特性。

  • 合理规划权限 :根据用户的角色和职责,精确分配权限,避免过度授权导致的数据安全风险。
  • 定期审查和更新 :定期审查安全视图和安全UDF的定义,根据业务变化和安全需求及时进行更新。
  • 加强培训和教育 :对相关人员进行培训,提高他们对数据安全的认识和操作技能,确保正确使用Snowflake的安全特性。

通过以上措施,可以充分发挥Snowflake数据共享和安全特性的优势,为企业的数据安全和业务发展提供有力支持。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值