启用密钥加密

本文档介绍了如何对存储在 Cassandra 数据库中的开发者应用使用方密钥(客户端凭据)启用加密。

概览

传统上,Apigee Edge for Private Cloud 为键值对映射 (KVM) 数据和 OAuth 访问令牌提供了可选加密。

下表介绍了 Apigee for Private Cloud 中静态数据的加密选项:

实体 默认启用加密 可选择是否加密 相关文档
KVM 否 是 请参阅关于加密 KVM。
OAuth 访问令牌 否 是 请参阅对令牌进行哈希处理以增强安全性。
开发者应用使用方密钥 否 是 如需启用,请执行本文档中的配置步骤。

如需启用客户端凭据加密,您需要在所有消息处理器和管理服务器节点上执行以下任务:

  • 创建一个密钥库来存储密钥加密密钥 (KEK)。Apigee 使用此加密密钥来加密加密数据所需的密钥。
  • 修改所有管理服务器和消息处理器节点上的配置属性。
  • 创建开发者应用以触发密钥创建。
  • 重启节点。

本文档介绍了这些任务。

关于密钥加密功能的须知事项

本文档中的步骤介绍了如何启用 KEK 功能,该功能允许 Apigee 在 Cassandra 数据库中静态存储开发者应用使用方密钥时,加密用于加密这些密钥的密钥。

默认情况下,数据库中的任何现有值都将保持不变(以纯文本形式),并继续像以前一样正常运行。

如果您对未加密的实体执行任何写入操作,该实体将在保存操作时被加密。例如,如果您撤消未加密的令牌,然后又批准该令牌,则新批准的令牌将被加密。

保障密钥安全

请务必将存储 KEK 的密钥库副本存储在安全位置。我们建议您使用自己的安全机制来保存密钥库的副本。如本文档中的说明所述,必须在每个消息处理器和管理服务器节点上放置一个密钥库,以便本地配置文件可以引用它。不过,请务必将密钥库的副本存储在其他位置,以便妥善保管和备份。

启用密钥加密

请按照以下步骤使用密钥加密:

前提条件

在执行本文档中的步骤之前,您必须满足以下要求:

  • 您必须安装或升级到 Apigee Edge for Private Cloud 4.50.00.10 或更高版本。
  • 您必须是 Apigee Edge for Private Cloud 管理员。

第 1 步:生成密钥库

请按照以下步骤创建密钥库,以保存密钥加密密钥 (KEK):

  1. 执行以下命令,生成一个密钥库,用于存储将用于加密 KEK 的密钥。输入与以下内容完全一致的命令。(您可以提供所需的任何密钥库名称):
    keytool -genseckey -alias KEYSTORE_NAME -keyalg AES -keysize 256 \
    -keystore kekstore.p12 -storetype PKCS12

    出现提示时,输入一个密码。在后面的部分中,您将在配置管理服务器和消息处理器时使用此密码。

    此命令会生成一个 kekstore.p12 密钥库文件,其中包含别名为 KEYSTORE_NAME 的密钥。

  2. (可选)使用以下命令验证文件是否已正确生成。如果文件正确,该命令会返回别名为 KEYSTORE_NAME 的密钥:
    keytool -list -keystore kekstore.p12

第 2 步:配置管理服务器

接下来,配置管理服务器。如果您在多个节点上安装了管理服务器,则必须在每个节点上重复这些步骤。

  1. 将您在第 1 步中生成的密钥库文件复制到管理服务器节点上的某个目录,例如 /opt/apigee/customer/application。例如:
    cp certs/kekstore.p12 /opt/apigee/customer/application
  2. 确保 apigee 用户可以读取该文件:
    chown apigee:apigee /opt/apigee/customer/application/kekstore.p12
    chmod 400 /opt/apigee/customer/application/kekstore.p12
  3. 将以下属性添加到 /opt/apigee/customer/application/management-server.properties。 如果该文件不存在,请创建它。另请参阅属性文件参考文档。
    conf_keymanagement_kmscred.encryption.enabled=true
    
    # Fallback is true to ensure your existing plaintext credentials continue to work
    conf_keymanagement_kmscred.encryption.allowFallback=true
    
    conf_keymanagement_kmscred.encryption.keystore.path=PATH_TO_KEYSTORE_FILE
    conf_keymanagement_kmscred.encryption.kek.alias=KEYSTORE_NAME
    
    # These could alternately be set as environment variables. These variables should be
    # accessible to Apigee user during bootup of the Java process. If environment
    # variables are specified, you can skip the password configs below.
    # KMSCRED_ENCRYPTION_KEYSTORE_PASS=
    # KMSCRED_ENCRYPTION_KEK_PASS=
    See also Using environment variables for configuration properties.
    
    conf_keymanagement_kmscred.encryption.keystore.pass=KEYSTORE_PASSWORD
    conf_keymanagement_kmscred.encryption.kek.pass=KEK_PASSWORD

    请注意,KEK_PASSWORD 可能与 KEYSTORE_PASSWORD 相同,具体取决于用于生成密钥库的工具。

  4. 使用以下命令重启管理服务器:
    /opt/apigee/apigee-service/bin/apigee-service edge-management-server restart
    /opt/apigee/apigee-service/bin/apigee-service edge-management-server wait_for_ready

    管理服务器准备就绪后,wait_for_ready 命令会返回以下消息:

    Checking if management-server is up: management-server is up.
  5. 如果您在多个节点上安装了管理服务器,请在每个管理服务器节点上重复执行上述第 1-4 步。

第 3 步:创建开发者应用

现在,管理服务器已更新,您必须创建一个开发者应用,以触发用于加密客户端凭据数据的密钥的生成:

  1. 创建开发者应用,以触发数据加密密钥 (KEK) 的创建。如需了解相关步骤,请参阅注册应用。
  2. 根据需要删除开发者应用。生成加密密钥后,您无需保留该密钥。

第 4 步:配置消息处理器

在消息处理器中启用加密之前,运行时请求将无法处理任何加密凭据。

  1. 将您在第 1 步中生成的密钥库文件复制到消息处理器节点上的目录,例如 /opt/apigee/customer/application。例如:
    cp certs/kekstore.p12 /opt/apigee/customer/application
  2. 确保 apigee 用户可以读取该文件:
    chown apigee:apigee /opt/apigee/customer/application/kekstore.p12
  3. 将以下属性添加到 /opt/apigee/customer/application/message-processor.properties。 如果该文件不存在,请创建它。另请参阅属性文件参考文档。
    conf_keymanagement_kmscred.encryption.enabled=true
    
    # Fallback is true to ensure your existing plaintext credentials continue to work
    conf_keymanagement_kmscred.encryption.allowFallback=true
    
    conf_keymanagement_kmscred.encryption.keystore.path=PATH_TO_KEYSTORE_FILE
    conf_keymanagement_kmscred.encryption.kek.alias=KEYSTORE_NAME
    
    # These could alternately be set as environment variables. These variables should be
    # accessible to Apigee user during bootup of the Java process. If environment
    # variables are specified, you can skip the password configs below.
    # KMSCRED_ENCRYPTION_KEYSTORE_PASS=
    # KMSCRED_ENCRYPTION_KEK_PASS=
    See also Using environment variables for configuration properties.
    
    
    conf_keymanagement_kmscred.encryption.keystore.pass=KEYSTORE_PASSWORD
    conf_keymanagement_kmscred.encryption.kek.pass=KEK_PASSWORD

    请注意,KEK_PASSWORD 可能与 KEYSTORE_PASSWORD 相同,具体取决于用于生成密钥库的工具。

  4. 使用以下命令重启消息处理器:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor wait_for_ready

    当消息处理器准备好处理消息时,wait_for_ready 命令会返回以下消息:

    Checking if message-processor is up: message-processor is up.
  5. 如果您在多个节点上安装了消息处理器,请在每个消息处理器节点上重复执行第 1-4 步。

摘要

从现在起,您创建的所有开发者应用的凭据密钥都将在 Cassandra 数据库中静态加密。

将环境变量用于配置属性

您也可以使用环境变量设置以下消息处理器和管理服务器配置属性。如果设置了环境变量,则环境变量会替换消息处理器或管理服务器配置文件中设置的属性。

conf_keymanagement_kmscred.encryption.keystore.pass=
conf_keymanagement_kmscred.encryption.kek.pass=

对应的环境变量如下:

export KMSCRED_ENCRYPTION_KEYSTORE_PASS=KEYSTORE_PASSWORD
export KMSCRED_ENCRYPTION_KEK_PASS=KEK_PASSWORD

如果您设置了这些环境变量,则可以从消息处理器和管理服务器节点上的配置文件中省略这些配置属性,因为它们将被忽略:

conf_keymanagement_kmscred.encryption.keystore.pass
conf_keymanagement_kmscred.encryption.kek.pass

属性文件参考

本部分介绍了您必须在所有消息处理器和管理服务器节点上设置的配置属性,如本文档前面所述。

属性 默认 说明
conf_keymanagement_kmscred.encryption.enabled false 必须为 true 才能启用密钥加密。
conf_keymanagement_kmscred.encryption.allowFallback false 将 allowFallback 设置为 true,以确保您现有的明文凭据继续有效。
conf_keymanagement_kmscred.encryption.keystore.path 不适用 提供消息处理器或管理服务器节点上的 KEK 密钥库的路径。 请参阅第 2 步:配置管理服务器和第 3 步:配置消息处理器。
conf_keymanagement_kmscred.encryption.kek.alias 不适用 KEK 在密钥库中的存储别名。
conf_keymanagement_kmscred.encryption.keystore.pass 不适用 如果您使用环境变量来设置这些属性,则此项为可选。另请参阅将环境变量用于配置属性。
conf_keymanagement_kmscred.encryption.kek.pass 不适用 如果您使用环境变量来设置这些属性,则此项为可选。另请参阅将环境变量用于配置属性。