了解 Snowflake 中的端到端加密¶
本主题提供与 Snowflake 中端到端加密相关的概念。
本主题内容:
概述¶
端到端加密 (E2EE) 是一种确保数据安全的方法,可防止第三方在数据静止或进出 Snowflake 的传输过程中读取数据,并最大限度地减少攻击面。
下图对 Snowflake 中的 E2EE 系统进行了说明:
E2EE 系统包括以下组件:
公司网络中的 Snowflake 客户。
由客户或 Snowflake 提供的数据文件暂存区域。
Snowflake 可在安全的虚拟私有云 (VPC) 或虚拟网络 (VNet) 中运行,具体取决于云平台。
Snowflake 支持数据文件的内部暂存区(由 Snowflake 提供)和外部暂存区(由客户提供)。Snowflake 提供了内部暂存区,您可以在其中上传数据文件并对其进行分组,然后再将数据加载到表中(图 B)。
客户提供的暂存区是由您控制和管理的受支持云存储服务(例如 Amazon S3)中的容器或目录(图 A)。对于已经将数据存储在云存储服务中并希望将其复制到 Snowflake 中的客户来说,客户提供的暂存区是一个有吸引力的选择。
根据本部分中的图示,Snowflake 中的 E2EE 流程如下:
用户将一个或多个数据文件上传到暂存区。
如果该暂存区是外部暂存区(图 A),用户可以选择使用客户端加密对数据文件进行加密(有关更多信息,请参阅 客户端加密 )。我们建议对外部暂存区的数据文件进行客户端加密;但如果数据未加密,在将数据加载到表中时,Snowflake 会立即加密数据。
如果该暂存区是内部(即 Snowflake)暂存区(图 B),则数据文件除了在加载到暂存区后进行加密之外,在数据文件传输到内部暂存区之前,还会由用户本地计算机上的 Snowflake 客户端自动加密。
用户将数据从暂存区加载到表中。
系统将数据转换为 Snowflake 的专有文件格式,并将其存储在云存储容器中。在 Snowflake 中,所有静态数据始终处于加密状态,并在传输过程中使用 TLS 加密。在表中转换或操作数据时,Snowflake 也会解密数据,然后在转换和操作完成后重新加密数据。
用户可以将查询结果卸载到外部或内部暂存区。
将结果卸载到客户管理的暂存区时,可选择使用客户端加密,而将结果卸载到由 Snowflake 提供的暂存区时,则会自动加密。
用户从暂存区下载数据文件,并在客户端解密数据。
客户端加密¶
客户端加密是指在将数据复制到云存储暂存区域之前,客户端会对其进行加密。客户端加密为管理云存储中的数据提供了安全系统。
客户端加密遵循云存储服务定义的特定协议。服务 SDK 和第三方工具均可实施此协议。
下图对客户端加密进行了总结:
客户端加密协议的工作原理如下:
客户创建一个与 Snowflake 共享的秘密 主密钥 (https://csrc.nist.gov/glossary/term/master_key)。
云存储服务提供的客户端会生成随机加密密钥,并在将文件上传到云存储之前对其进行加密。随机加密密钥则又使用客户的主密钥进行了加密。
加密文件和加密随机密钥都会上传到云存储服务中。加密的随机密钥与文件元数据一起存储。
下载数据时,客户端会同时下载加密文件和加密随机密钥。客户端使用客户的主密钥对加密的随机密钥进行解密。
接下来,客户端会使用已解密的随机密钥对加密的文件进行解密。加密和解密都在客户端进行。
在任何时候,云存储服务或任何其他第三方(例如 ISP)都无法查看这些数据。客户可使用任何支持客户端加密的客户端或工具上传客户端加密数据。
将客户端加密数据引入 Snowflake¶
在云存储服务暂存区和 Snowflake 之间读写数据时,Snowflake 支持使用客户端主密钥的客户端加密协议,如下图所示:
要从客户提供的暂存区加载客户端加密数据,您需要使用 CREATE STAGE 命令创建一个带有附加 MASTER_KEY
参数的命名暂存区对象,然后将暂存区中的数据加载到您的 Snowflake 表中。MASTER_KEY
参数要求使用 Base64 编码的 128 位或 256 位高级加密标准 (AES) 密钥。
命名暂存区对象可存储与暂存区相关的设置,并提供在 Snowflake 和云存储中的特定容器之间加载或卸载数据的便捷方法。下列 SQL 代码段可在 Snowflake 中创建一个支持客户端加密的 Amazon S3 暂存区对象示例:
-- create encrypted stage
create stage encrypted_customer_stage
url='s3://customer-bucket/data/'
credentials=(AWS_KEY_ID='ABCDEFGH' AWS_SECRET_KEY='12345678')
encryption=(MASTER_KEY='eSxX...=');
此 SQL 命令中指定的截断主密钥是客户秘密主密钥的 Base64 编码字符串。与所有其他凭据一样,此主密钥通过传输层安全协议 (HTTPS) 传输到 Snowflake,并加密存储在元数据存储中。只有客户和 Snowflake 的查询处理组件才会接触到主密钥。
命名暂存区对象的优势是,可将这些对象授予 Snowflake 账户中的其他用户,而不会向这些用户泄露访问凭据或客户端加密密钥。具有适当访问控制权限的用户在加载或卸载数据时,只需引用命名的阶段对象即可。
下列 SQL 命令将创建名为 users
的表,并将数据从加密暂存区复制到 users
表中:
-- create table and ingest data from stage
CREATE TABLE users (id bigint, name varchar(500), purchases int);
COPY INTO users FROM @encrypted_customer_stage/users;
现在就可以使用 Snowflake 分析数据。
您还可以将数据卸载到暂存区中。下列 SQL 命令创建了 most_purchases
表,并用查询结果填充了该表,查询结果用于查找购买次数最多的前 10 位用户,然后将表中的数据卸载到暂存区中:
-- find top 10 users by purchases, unload into stage
CREATE TABLE most_purchases as select * FROM users ORDER BY purchases desc LIMIT 10;
COPY INTO @encrypted_customer_stage/most_purchases FROM most_purchases;
Snowflake 使用存储在暂存区对象中的主密钥,对复制到客户暂存区的数据文件进行加密。Snowflake 遵守云存储服务的客户端加密协议。客户可以使用任何支持客户端加密的客户端或工具下载加密数据文件。
后续主题: