为入站流量固定专用连接端点

对于 Amazon Web Services (AWS) 和 Microsoft Azure (Azure) 上的 Snowflake 账户,您可以将专用连接端点固定(指定、注册和映射)到您的账户。通过将专用端点固定到您的账户,Snowflake 确保来自固定端点的入站流量仅流向固定它们的账户。Snowflake 建议通过减少对您的 Snowflake 账户的网络攻击面,使用固定端点、网络策略和网络规则来增强您的安全态势。

小技巧

固定仅允许使用经授权的专用端点将流量从客户网络发送到特定的 Snowflake 账户。如果您想限制来自 IPs 和 VPCE IDs/LinkIDs 的特定列表对 Snowflake 账户的入站访问,请使用 网络策略网络规则

Snowflake 在通过专用连接接收每个请求时,会在入口处强制执行专用端点固定检查。此检查比较两条关键信息:

  • 请求标头中提供的端点 ID。

  • 在 Snowflake 的元数据中记录的固定端点的账户。

如果这些匹配,换句话说,如果请求来自注册端点的账户,那么 Snowflake 允许连接。否则,Snowflake 阻止连接。

例如:

通过固定的专用连接端点检查入站流量的授权访问

固定的专用端点

固定专用端点的 Snowflake 账户

请求的目标 Snowflake 账户

Snowflake 固定检查决定

PE1

A1

A1

ALLOW

PE1

A1

A2

DENY

PE2

A2

A1

DENY

PE2

A2

A2

ALLOW

先决条件

在固定专用端点之前,必须执行以下操作:

  • 为您的 Snowflake 账户在 AWS 或 Azure 上配置专用链接。

  • 限制您用于在 Snowflake 账户中注册端点的访问令牌的范围。

有关配置专用链接的更多信息,请参见 :doc:` AWS PrivateLink</user-guide/admin-security-privatelink>` 或 Azure 专用链接

使用延迟时间实参管理执行

在配置您的专用链接后,您调用 SYSTEM$REGISTER_PRIVATELINK_ENDPOINT 系统函数以使用您的 Snowflake 账户注册专用连接端点。在该函数调用中,您可以 选择性地 指定延迟时间。延迟时间是指在强制执行专用端点注册之前需要等待的分钟数。延迟时间值有助于防止您在注册新的专用端点时意外阻止自己访问 Snowflake。最长延迟时间为 1440 分钟(24 小时),默认值为 60 分钟。

您为自己的 Snowflake 账户注册的专用端点也可以为其他 Snowflake 账户注册。例如,您可能有三个 Snowflake 账户,并且您希望确保与每个 Snowflake 账户的连接仅通过一个注册的专用端点进行。通过将延迟时间实参设置为 60 分钟,您可以为每个 Snowflake 账户注册专用连接端点留出足够的时间。

然而,当您注册一个专用连接端点并指定延迟时间时,您 必须 注意 您调用系统函数的第一个账户 的本地时间戳。执行时间基于您调用系统函数时第一个账户的本地时间戳,加上您指定的任何延迟时间,相对于特定的专用连接端点。

例如,考虑在同一时区内将单个专用连接端点固定到三个账户:

  • 如果您在 10:00 AM 调用 account1 中的系统函数并指定延迟时间为 60 分钟,则执行时间为 11:00 AM。

  • 如果您在 10:30 AM 调用 account2 中的系统函数,则执行时间为 11:00 AM。

  • 如果您在 11:01 AM 调用 account3 中的系统函数,则执行时间是立即(现在)。

小技巧

在第一个账户中存储您注册专用端点时的时间戳。维护固定到特定专用端点的账户记录。

如果您预计注册多个账户,并且 1440 分钟的延迟时间不够,请联系 Snowflake 支持部门

在 Microsoft Azure 上管理访问令牌范围

在将专用端点固定到您在 Azure 上的 Snowflake 账户之前,您必须限制传递给 SYSTEM$REGISTER_PRIVATELINK_ENDPOINT 系统函数的访问令牌的范围。要求调用者将访问令牌限制在专用端点有助于 Snowflake 授权调用者访问该端点。这意味着该令牌仅对您调用系统函数的专用端点和 Snowflake 账户有效。

重要

请勿使用 SYSTEM$AUTHORIZE_PRIVATELINK 系统函数中使用的令牌。以下步骤生成对 SYSTEM$REGISTER_PRIVATELINK_ENDPOINT 唯一的令牌。

要限制您在 Azure 上的专用端点的访问令牌的范围,请在您的 Microsoft Azure 账户中执行以下步骤:

  1. 为名为 snowflake-pep-role 的角色 创建 (https://learn.microsoft.com/en-us/cli/azure/role/definition?view=azure-cli-latest#az-role-definition-create) 一个订阅自定义角色定义,并用您的订阅的 ID 替换 subscription_id 占位符。

    az role definition create --role-definition '{"Name":"snowflake-pep-role","Description":
    "To generate advanced proof of access token for Snowflake private endpoint pinning","Actions":
    ["Microsoft.Network/privateEndpoints/read"],"AssignableScopes":["/subscriptions/<subscription_id>"]}'
    
    Copy

    订阅 ID 必须与专用端点存在的订阅匹配。您只需为您的订阅创建一次角色定义。

  2. 创建角色分配并将 snowflake-pep-role 角色和专用端点范围 分配 (https://learn.microsoft.com/en-us/cli/azure/role/assignment?view=azure-cli-latest#az-role-assignment-create) 给用户(或组)。替换 userprivate_endpoint_resource_id 的占位符。

    az role assignment create --assignee <user> --role snowflake-pep-role --scope <private_endpoint_resource_id>
    
    Copy
  3. 生成 访问令牌 (https://learn.microsoft.com/en-us/cli/azure/account?view=azure-cli-latest#az-account-get-access-token) 以便与 SYSTEM$REGISTER_PRIVATELINK_ENDPOINT 系统函数一起使用。用您的订阅的 ID 替换 subscription_id 占位符。

    az account get-access-token --subscription <subscription_id>
    
    Copy

在 Amazon Web Services 上管理访问令牌范围

在将专用端点固定到您在 AWS 上的 Snowflake 账户之前,您必须限制传递给 SYSTEM$REGISTER_PRIVATELINK_ENDPOINT 系统函数的访问令牌的范围。要求调用者将访问令牌限制在专用端点有助于 Snowflake 授权调用者访问该端点。这意味着该令牌仅对您调用系统函数的专用端点和 Snowflake 账户有效。

重要

请勿使用 SYSTEM$AUTHORIZE_PRIVATELINK 系统函数中使用的令牌。以下步骤生成对 SYSTEM$REGISTER_PRIVATELINK_ENDPOINT 唯一的令牌。

要限制您在 AWS 上的专用端点的访问令牌的范围,请生成一个联合令牌,如下例所示:

aws sts get-federation-token --name snowflake --policy
'{ "Version": "2012-10-17", "Statement":
  [ {
  "Effect": "Allow", "Action": ["ec2:DescribeVpcEndpoints"],
  "Resource": ["*"] }
  ] }'
Copy

示例

作为一个代表性的例子,注册一个端点以将您的连接路由到 Snowflake 服务。

  1. 为您的 Snowflake 账户配置 AWS PrivateLinkAzure 专用链接。如果您已经配置了此服务,请跳到下一步。

  2. 通过公共互联网登录 Snowflake,这是您使用的 URL,不包含在 URL 中的 privatelink 段中。

  3. 调用 SYSTEM$REGISTER_PRIVATELINK_ENDPOINT 系统函数将 VPC 端点注册到您的 Snowflake 账户。token 实参包含截断值,延迟时间单位为分钟:

    AWS

    SELECT SYSTEM$REGISTER_PRIVATELINK_ENDPOINT(
      'vpce-0c1...',
      '123.....',
      '{
        "Credentials": {
          "AccessKeyId": "ASI...",
          "SecretAccessKey": "alD...",
          "SessionToken": "IQo...",
          "Expiration": "2024-12-10T08:20:20+00:00"
        },
        "FederatedUser": {
          "FederatedUserId": "0123...:snowflake",
          "Arn": "arn:aws:sts::174...:federated-user/snowflake"
        },
        "PackedPolicySize": 9,
        }',
      120
      );
    
    Copy

    Azure

    SELECT SYSTEM$REGISTER_PRIVATELINK_ENDPOINT(
      '123....',
      '/subscriptions/0cc51670-.../resourceGroups/dbsec_test_rg/providers/Microsoft.Network/
      privateEndpoints/...',
      'eyJ...',
      120
    );
    
    Copy

#。通过调用 SYSTEM$GET_PRIVATELINK_ENDPOINT_REGISTRATIONS 系统函数确认专用连接端点映射。

您可以通过调用 SYSTEM$UNREGISTER_PRIVATELINK_ENDPOINT 系统函数从您的 Snowflake 账户中注销专用连接端点。

重要

如果您在 Snowflake 中注册了一个 VPC 端点或专用端点,并在您的 VPC 或 VNet 中删除了该端点,您必须在您的 Snowflake 账户中调用 SYSTEM$UNREGISTER_PRIVATELINK_ENDPOINT 系统函数以注销该端点。否则,您与 Snowflake 服务的连接无法使用专用连接,它将使用公共互联网。

语言: 中文