支持用于身份验证凭据的外部密钥管理器

本规范描述了 Tacker 中使用外部密钥管理器服务(例如 OpenStack Key Manager (barbican) [1])对身份验证凭据进行加密和解密的方法。

问题描述

Tacker 将一些身份验证凭据存储在 Tacker DB 中。但是,在 Tacker 的实际 NFV 操作中,这些信息应该加密,以实现安全的 NFV 管理和安全要求,防止攻击者窃听和数据利用。

以下是 VnfInstanceV2.vimConnectionInfo (Kubernetes) 的一个示例:身份验证凭据是密码、bearer_token 和 client_secret。

{
    "vim1": {
        "vimType": "ETSINFV.KUBERNETES.V_1",
        "accessInfo": {
            "username": "nfv_user",
            "password": "password",
            "bearer_token": "bearer_token",
            "client_secret": "client_secret"
        },
        "interfaceInfo": {
            "endpoint":"http://123.124.64.6:8443",
            "ssl_ca_cert": "ssl_ca_cert"
        }
    }
}

本规范提出使用“cryptography”库和外部密钥管理服务来管理凭据和密钥,从而实现通用的密钥方案进行加密和解密。

提议的变更

将提出以下更改

  1. 添加与外部密钥管理器集成的实用函数。

  2. 添加使用 v2API 和 OpenStack Key Manager 的示例实现。

  3. 添加配置选项。

添加与外部密钥管理器集成的实用函数

由于 Tacker 在多个 DB 表中存储敏感凭据,因此本规范将实现通用的实用函数,以便与外部密钥管理器配合使用,对凭据进行加密和解密,这对于 v1 和 v2 API 都是必需的。

需要加密的身份验证凭据示例

以下是 Tacker 中需要加密的身份验证凭据示例列表。

  • VimConnectionInfo 中的 accessInfo:密码、bearer_token 和 client_secret

  • authentication 中的 paramsBasic 和 paramsOauth2ClientCredentials:密码和 clientPassword

  • Prometheus Plugin 中的 metadata.targetsInfo.authInfo:ssh_password

注意

此函数也将通用地用于其他敏感信息。

我们将分析并在实现过程中发现新的目标时添加更详细的目标数据。

通用实用函数包括三个主要角色

  1. 与外部密钥管理器配合管理加密密钥。它能够注册和删除加密密钥。

  2. 使用加密密钥加密身份验证凭据,并将其存储到 Tacker DB。

  3. 通过解密密钥解密存储在 Tacker DB 中的身份验证凭据,并在 VNF 操作中使用它们。

用户可以在不知情的情况下执行 VNF 操作。另一方面,身份验证凭据在 tacker DB 中被加密,从而降低了被窃听或数据被利用的可能性。

创建两种类型的加密密钥:主密钥和表密钥。表密钥用于加密身份验证信息,主密钥用于加密表密钥。在将身份验证信息保存到 DB 时创建表密钥,在启动 Tacker 时创建主密钥。表密钥和主密钥存储在一个新表中,该表用于存储加密密钥。

添加使用 v2API 和 Barbican 的示例实现

在本规范中,它实现了在 v2 API 中与 barbican [1] 集成以加密和解密身份验证凭据的示例用例。

VNF LCM 中建议的序列示例

以下是在 VNF LCM 操作中考虑的身份验证凭据加密和解密的序列示例。

以下是在考虑使用 barbican 的 VNF 实例实例化流程。

../../_images/017.png

以下是使用 barbican 的 VNF 实例终止流程。

../../_images/023.png

添加配置选项

由于本规范中定义的函数更改了默认序列,因此建议将配置选项添加到 tacker.conf 文件中。因此,用户可以选择是否启用此功能。

  • “use_credential_encryption”的布尔值。此参数确定是否使用加密。

    默认值:“false”

  • “keymanager_type”的字符串值。此参数确定外部密钥管理服务的类型。

    默认值:“barbican”

  • “crypt_key_dir”的字符串值。此参数指定存储加密密钥的路径。

    默认值:“”

    注意

    barbican 将在 Tacker Bobcat 周期中得到支持。如果将来支持其他外部密钥管理服务,则此参数允许更改目标服务。

作为建议的实现,当 use_credential_encryption 为 True 时,身份验证凭据的加密和解密功能生效;当 use_credential_encryption 为 False 时,此功能将不会执行。

备选方案

数据模型影响

外部密钥管理器的密钥相关信息(例如,密钥类型、密钥 ID)需要添加到数据模型中。

属性名称

数据类型

参数描述

id

字符串

密钥信息 ID(主键)

secret_uuid

字符串

在 barbican 中注册的主密钥的 UUID

encrypted_key

字符串

tacker 的表密钥

key_type

字符串

如何保留主密钥。本地或 barbican

in_use

布尔值

标志,表示是否使用了最新的密钥

REST API 影响

安全影响

如果应用此更改,Tacker DB 中的身份验证凭据将使用加密密钥加密,因此必须通过外部密钥管理器保护加密密钥。也允许将加密密钥存储在本地,但在生产环境中不建议这样做。

此外,需要备份加密密钥,以便用户可以在发生故障或灾难恢复时解密凭据。以下是使用 barbican [1] 作为外部密钥管理器时的密钥备份示例。

Barbican 的密钥备份方法

根据后端类型,备份和恢复加密密钥的过程会有所不同。对于简单的 crypto 后端,需要备份两个单独的组件:密钥加密密钥 (KEK) 和数据库。

  • 备份和恢复 KEK。

对于简单的 crypto 后端,要备份包含主加密密钥的 barbican.conf 文件;KEK 被写入。此文件必须备份到安全加固的位置。实际数据存储在 Barbican 数据库中。

要从备份恢复密钥,需要将恢复的 barbican.conf 覆盖现有的 barbican.conf

  • 备份和恢复 barbican 数据库。

在登录到 controller-0 节点时运行以下步骤。

  1. 检索 barbican 用户密码

  2. 备份 barbican 数据库

  3. 数据库备份存储在 /home/heat-admin

  4. 恢复数据库

注意

只有 barbican 用户才能访问 barbican 数据库。因此,备份或恢复数据库需要 barbican 用户密码。

有关更多信息,请参阅 OpenStack Key Manager 备份文档 [2]

通知影响

其他最终用户影响

性能影响

Tacker 需要访问外部密钥管理器服务才能对身份验证凭据进行加密和解密。如果每次调用 Rest API 时使用加密的身份验证凭据的案例很少,则性能影响可能为 LOW

但是,如果需要访问外部密钥管理器来处理 DB 表中的每个数据,则影响可能为 HIGH

需要仔细决定实施策略。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Kenta Fukaya <kenta.fukaya@ntt.com>

Yuta Kazato <yuta.kazato@ntt.com>

其他贡献者

新見雄介 <niimi.yusuke@fujitsu.com>

Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>

Ayumu Ueha <ueha.ayumu@fujitsu.com>

工作项

  • 实现 Tacker 以支持

    • 添加与外部密钥管理器集成的实用函数

    • 添加使用 v2API 和 OpenStack Key Manager 的示例实现

    • 添加配置选项。

  • 添加新的单元和功能测试。

  • 编写 Tacker 文档,以说明如何使用本规范中描述的功能。

依赖项

  • 身份验证凭据的加密方法

    依赖于 barbican 中的 Secret Stores API [3]

  • 身份验证凭据的解密方法

    依赖于 barbican 中的 Secret Get by UUID API [4]

测试

将添加单元和功能测试,以涵盖本规范所需的案例。

文档影响

将通过此功能向 Tacker 用户指南添加如何使用外部密钥管理服务。

参考资料