密钥对身份验证和密钥对轮换¶
本主题介绍如何在 Snowflake 中使用密钥对身份验证和密钥对轮换。
本主题内容:
概述¶
Snowflake 支持使用密钥对身份验证来增强身份验证安全性,作为基本身份验证(例如用户名和密码)的替代方案。
此身份验证方法需要至少 2048 位 RSA 密钥对。您可以使用 OpenSSL 生成隐私增强邮件 (PEM) 公私密钥对。一些 支持的 Snowflake 客户端 允许使用加密的私钥连接到 Snowflake。将公钥分配给使用 Snowflake 客户端连接到 Snowflake 并进行身份验证的 Snowflake 用户。
Snowflake 还支持轮换公钥,以确保遵循更强大的安全和治理态势。
支持的 Snowflake 客户端¶
下表总结了 Snowflake 客户端对密钥对身份验证的支持。复选标记 (✔) 表示完全支持。缺少复选标记,表示不支持密钥对身份验证。
客户端 |
密钥对身份验证 |
密钥对轮换 |
未加密的私钥 |
|
---|---|---|---|---|
✔ |
✔ |
✔ |
||
✔ |
✔ |
✔ |
||
✔ |
✔ |
✔ |
||
✔ |
✔ |
✔ |
||
Go 驱动程序 (https://godoc.org/github.com/snowflakedb/gosnowflake) |
✔ |
✔ |
✔ |
|
✔ |
✔ |
✔ |
||
✔ |
✔ |
✔ |
||
✔ |
✔ |
✔ |
||
✔ |
✔ |
✔ |
||
✔ |
✔ |
✔ |
配置密钥对身份验证¶
完成以下步骤,可为所有支持的 Snowflake 客户端配置密钥对身份验证。
生成私钥¶
您可以选择生成加密或未加密的私钥,具体取决于您使用哪个 支持的 Snowflake 客户端 连接到 Snowflake。一般来说,生成加密的密钥更安全。Snowflake 建议在完成此步骤之前与您的内部安全和治理官进行沟通,以确定生成哪种密钥类型。
小技巧
生成加密密钥的命令会提示输入密码以规范对密钥的访问。Snowflake 建议使用符合 PCI DSS 标准的密码保护本地生成的私钥。此外,Snowflake 建议将密码存储在安全位置。如果使用加密密钥连接到 Snowflake,请在初次连接时输入密码。该密码仅用于保护私钥,永远不会发送给 Snowflake。
要根据 PCI DSS 标准生成一个长且复杂的密码,请执行以下操作:
访问 PCI 安全标准文档库 (https://www.pcisecuritystandards.org/document_library)。
对于 PCI DSS,选择最新版本和所需的语言。
填写表单以访问文档。
搜索
Passwords/passphrases must meet the following:
并遵循有关密码/密码短语要求、测试和指导的建议。根据文档版本,该密码短语可能位于名为“Requirement 8: Identify and authenticate access to system components
”或类似名称的部分。
首先,打开终端窗口并生成私钥。
您可以生成私钥的加密版本或私钥的未加密版本。
要生成未加密的版本,请使用以下命令:
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
要生成加密版本,请使用以下命令,其中省略 -nocrypt
:
openssl genrsa 2048 | openssl pkcs8 -topk8 -v2 des3 -inform PEM -out rsa_key.p8
这些命令生成 PEM 格式的私钥。
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIE6T...
-----END ENCRYPTED PRIVATE KEY-----
生成公钥¶
从命令行中,通过引用私钥生成公钥。以下命令假设私钥已加密并包含在名为“ rsa_key.p8
”的文件中。
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
该命令生成 PEM 格式的公钥。
-----BEGIN PUBLIC KEY-----
MIIBIj...
-----END PUBLIC KEY-----
安全地存储私钥和公钥¶
将公钥和私钥文件复制到本地目录进行存储。记录文件的路径。请注意,使用 PKCS#8(公钥加密标准)格式存储私钥,并使用您在上一步中指定的密码短语进行加密。
但是,仍应使用操作系统提供的文件权限机制来保护文件免遭未经授权的访问。您有责任在不使用文件时保护该文件。
将公钥分配给 Snowflake 用户¶
执行 ALTER USER 命令,将公钥分配给 Snowflake 用户。
ALTER USER jsmith SET RSA_PUBLIC_KEY='MIIBIjANBgkqh...';
备注
只有用户的所有者,或具有 SECURITYADMIN 角色或更高级别角色的用户才能更改用户。有关更多信息,请参阅 访问控制概述 和 GRANT OWNERSHIP
排除 SQL 语句中的公钥分隔符。
验证用户的公钥指纹¶
执行以下命令来检索用户的公钥指纹:
DESC USER jsmith; SELECT TRIM((SELECT "value" FROM TABLE(RESULT_SCAN(LAST_QUERY_ID())) WHERE "property" = 'RSA_PUBLIC_KEY_FP'), 'SHA256:');
输出:
Azk1Pq...
复制输出。
在命令行上运行以下命令:
openssl rsa -pubin -in rsa_key.pub -outform DER | openssl dgst -sha256 -binary | openssl enc -base64
输出:
writing RSA key Azk1Pq...
比较两个输出。如果两个输出匹配,则用户正确配置了其公钥。
配置 Snowflake 客户端以使用密钥对身份验证¶
更新客户端以使用密钥对身份验证连接到 Snowflake。
Go 驱动程序 (https://godoc.org/github.com/snowflakedb/gosnowflake)
.NET 驱动程序 (https://github.com/snowflakedb/snowflake-connector-net/blob/master/README.md)
配置密钥对轮换¶
Snowflake 支持多个活动键以实现不间断轮换。根据内部遵循的到期时间表轮换和替换公钥和私钥。
目前,您可以使用 ALTER USER 的 RSA_PUBLIC_KEY
和 RSA_PUBLIC_KEY_2
参数将最多 2 个公钥与单个用户关联。
完成以下步骤,即可配置密钥对轮换,并轮换密钥。
完成 配置密钥对身份验证 中的所有步骤并进行以下更新:
生成新的私钥和公钥集。
将公钥分配给用户。将公钥值设置为
RSA_PUBLIC_KEY
或者RSA_PUBLIC_KEY_2
,以当前未使用的密钥值为准。例如:ALTER USER jsmith SET RSA_PUBLIC_KEY_2='JERUEHtcve...';
更新代码以连接到 Snowflake。指定新的私钥。
Snowflake 根据与连接信息一起提交的私钥来验证用于身份验证的活动公钥是否正确无误。
使用 ALTER USER 命令从用户配置文件中移除旧公钥。
ALTER USER jsmith UNSET RSA_PUBLIC_KEY;