暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SAP BTP也开始正式支持PostgreSQL实例级的全加密

数据库杂记 2023-08-02
35

前言

经过几轮演化与演进,SAP终于在BTP的几个云平台环境:CF、Kyma等环境下边正式支持instance级别的全加密。当然这个instance是数据库服务的绑定的实例,实际上相当于是PostgreSQL下边的一个目标数据库。

目前起始最低版本是PostgreSQL12.x,以后会不断的随着PG版本的升级继续往前升级。目前主要部署在AWS相应的云环境下,估计再过不久,会全面推向全球各个Region。

功能介绍

默认情况下,当使用PostgreSQL Hyperscaler Option服务创建PostgreSQL实例时,创建的RDS实例将使用后台服务默认密钥进行加密。通过实现这个特性,SAP BTP将允许使用客户密钥来执行实例加密。实例加密数据将包括底层实例存储、自动备份、读取副本和快照。

使用客户密钥的实例级加密是PostgreSQL Hyperscaler Option Service遵循SAP 安全标准373的必要特性。

该解决方案严重依赖于SAP Data Custodian。因此,我们建议您在继续阅读本文档之前熟悉该服务。SAP Data Custodian Key Management Service是一个很好的起点。此外,这是一个利用AWS RDS实例特性的实现。因此,阅读AWS RDS加密可能也很有趣。PostgreSQL Hyperscaler Option将这两者有机的结合在一起。

支持的场景

从服务提供者的角度来看,需要一个PostgreSQL实例来操作,PostgreSQL Hyperscaler Option识别并支持两种场景。

下面几节将更详细地描述这两个场景。

单租户(Tenancy)

在这种情况下,使用PostgreSQL Hyperscaler Option创建的PostgreSQL实例容纳的数据属于创建该实例的BTP子帐户。

因此,在该实例上使用的加密密钥将属于创建它的BTP子帐户。

用户有Key的情形

给定一个具有BTP子帐户的租户
该租户在SAP Data Custodian Dashboard中创建了一个加密密钥
当租户请求在其BTP子帐户中创建给定BTP服务的新实例时
创建BTP服务实例将要求创建一个新的PostgreSQL实例,hyperscaler选项
并传递将使用此实例的租户的全局帐户id和子帐户id
并传递要使用的租户密钥的密钥引用

然后,PostgreSQL实例创建过程将通过传递的密钥引用向SAP Data Custodian请求租户加密密钥的唯一标识符
SAP Data Custodian将返回带有给定密钥引用的租户密钥的唯一标识符
PostgreSQL实例创建过程将创建一个配置了该租户加密密钥的新PostgreSQL实例
实例卷将使用相同的密钥进行加密
稍后创建的备份和快照也将使用此密钥进行加密

复制

它需要通过传递密钥引用,请求得到加密密钥的唯一标识符。

用户没有Key的情形

给定一个具有BTP子帐户的租户
当租户请求在其BTP子帐户中创建给定BTP服务的新实例时
创建BTP服务实例将要求创建一个新的PostgreSQL实例,hyperscaler选项
并传递将使用此实例的租户的全局帐户id和子帐户id

然后,PostgreSQL实例创建过程将向SAP Data Custodian请求租户加密密钥的唯一标识符
SAP Data Custodian将代表租户创建一个加密密钥,并返回该唯一标识符
PostgreSQL实例创建过程将创建一个配置了该租户加密密钥的新PostgreSQL实例
实例卷将使用相同的密钥进行加密
稍后创建的备份和快照也将使用此密钥进行加密

复制

单租户下的使用

对于此场景,将传输所需信息的有效负载必须具有2个强制性参数和1个可选参数。

必选参数标识要使用的加密密钥的BTP子帐户。key_ref是一个AWS KMS动态密钥引用Id,它可以从SAP Data Custodian获得。

{
    cmk: {
        "globalaccount_id""...", # 必须
        "subaccount_id""...", # 必须
        "key_ref""...",  # 可选
    }
}

复制

多租户

服务提供商是一个BTP多租户SaaS应用程序。此应用程序为1个或多个消费者提供服务。每个消费者都有一个BTP子帐户,该帐户引用客户的租户。这个租户订阅了BTP多租户SaaS应用程序。

应用程序将希望在其BTP子帐户中创建一个PostgreSQL实例,以容纳其使用者租户拥有的数据。

这意味着应用程序在多租户场景中运行,PostgreSQL Hyperscaler Option需要相应地提供其PostgreSQL实例来满足此场景。

简而言之,这个用例是在应用程序的BTP子帐户中创建一个PostgreSQL实例,但是该PostgreSQL实例将包含与订阅该应用程序的特定客户的租户相关的数据。

因此,PostgreSQL实例将在应用程序的BTP子帐户中创建,但是在该实例上使用的加密密钥将属于订阅该应用程序的客户租户。

有关多租户应用程序的更多详细信息,请访问SAP帮助门户:  Developing Multitenant Applications in the Cloud Foundry Environment.: https://help.sap.com/docs/btp/sap-business-technology-platform/developing-multitenant-applications-in-cloud-foundry-environment

先决条件

  • application是一个多租户SaaS BTP应用程序

  • 客户BTP子帐户已订阅SaaS BTP应用程序

  • 客户BTP全局和子帐户id是已知的(将是负载中的参数global_account_id和subaccount_id)

  • 应用程序名称是已知的(将是负载中的参数root_application_name)

请求负载内容

对于此场景,将传输所需信息的有效负载必须具有3个强制性参数。下面查看所需的有效负载字段如何与SaaS配置回调中的字段相对应。

{
    cmk: {
        "root_application_name""...",  # mandatory - corresponds to "subscriptionAppName"
        "globalaccount_id""...",       # mandatory - corresponds to "globalAccountGUID"
        "subaccount_id""...",          # mandatory - corresponds to "subscribedSubaccountId"
    }
}
-- 上述三个值全都是必须的。

复制

具体实例

1、初如设置

用于设置BTP全局和子帐户,以便能够使用PostgreSQl Hyperscaler Option请求提供PostgreSQl实例。这需要提前预备好资源配额。

2、实例初始化

用于设置BTP全局和子帐户,以便能够使用PostgreSQl Hyperscaler OptionUsing BTP Cockpit请求提供一个PostgreSQl实例
关于如何使用座舱配置PostgreSQL的一般说明,请遵循这里的说明

使用BTP Cockpit

在Parameters中单击查看JSON:

并添加带有特定数据的cmk有效负载。例如:

使用CF命令行

有关如何使用Cloud Foundry CLI配置PostgreSQL的一般说明,请参见此处的说明

下面是一个例子:

cf create-service postgresql-db standard <INSTANCE_NAME> -c '{"memory": 2,"storage": 50,"engine_version""12","multi_az": true, "cmk": {"subaccount_id":"<subaccount_id>""globalaccount_id":"<global_account_id>","root_application_name":"<root_application_name>"}}' 

复制

我们来看CF上一个加密设置完成之后的数据库的实际情况:

建立cf上的ssh tunnel

cf ssh {cf-database} -L 8475:postgres-08aecaf7-xxxx-4b7e-a1a9-xxxxxx.cxxzc36no8yr.xxxxx.amazonaws.com:8475 -T -N

复制

在这之后,使用DBEaver或psql进行直连:

我们通过连接以后,跟看到常规的数据库效果是一样的。如下图所示:

也就是说,对于应用端来说,几乎看不到什么区别。完全是透明的。这一点还是比较厉害的。

但是客户可以随时通过SAP Data Custodian来Disable他们设置的key,只要disable,那么数据库实例立即变得不可用。用户也无法盗取数据。甚至还可以删除他们的key。

由于这个功能是纯面向租户的。可以做到租户之间的数据相互隔离并且各加密各的。安全度非常高。这种解决方案在云平台下边确实大有可为。

这是DCKMS (Data Custodian)与AWS RDS集成的一整套解决方案。SAP还有自己的专属方案,支持schema级的和Database级(就相当于 里的实例级)的解决方案,底层全部使用自己的加密库来进行处理。

相关限制

  • 实例只能在创建时加密,而不能在创建后加密

  • 一旦启用了实例级加密,就不能禁用它

  • 特性只能在SAP Data Custodian可用的环境中使用

  • 要查看DCKMS侧key rotation (密钥轮替) 的限制

有关限制的更多详细信息,还请查看AWS RDS加密(作为底层AWS托管服务)和SAP Data Custodian(作为提供要使用的客户密钥接口的服务)。这里底层看来来源于AWS RDS。然后SAP使用自身的Data Custodian将其集成到一起,为Customer提供全加密服务。

常见问题

我可以在初始化完成之后,决定加密PostgreSQL实例?

不。PostgreSQL实例的加密只能在配置时进行。

密钥可以在几个子帐户之间共享吗?

密钥是基于客户的BTP子帐户(例如CompanyA)进行管理的。公司可以为每个子帐户创建一个SAP Data Custodian实例,每个子帐户都有一个唯一的密钥设置。如果CompanyA没有创建SAP Data Custodian实例,而是使用该实例创建密钥,那么SAP Data Custodian将在收到请求时为CompanyA创建密钥。

是否有可能从已使用客户密钥加密的快照创建新的DB实例?

是的。这应该是可能的。新创建的数据库也将使用相同的客户密钥进行加密。

是否有可能从已使用客户密钥加密的快照中创建新的DB实例,但这个新数据库没有加密?

不。这是不可能的。

是否可以从从现有快照创建的新DB实例定义新的加密密钥?

不。这是不可能的。

小结:

本文就是对SAP BTP云平台下使用SAP Data Custodian集成AWS RDS PostgreSQL加密功能的一个总体介绍,现已经不断推出,很快会部署到SAP全球各大数据中心,作为HANA Cloud的一个有力补充。

文章转载自数据库杂记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论