将Amazon EC2 Oracle透明数据加密密钥库迁移至AWS CloudHSM的完整指南

本文详细介绍了如何将运行在Amazon EC2上的Oracle 19c数据库的透明数据加密(TDE)密钥库从基于软件的TDE钱包迁移到AWS CloudHSM硬件安全模块。内容包括迁移步骤、配置PKCS#11库、密钥轮换策略以及验证迁移成功的方法。

如何将Amazon EC2 Oracle透明数据加密数据库加密密钥库迁移到AWS CloudHSM

加密数据库对于保护敏感数据至关重要,有助于符合安全法规并防止数据丢失。Oracle透明数据加密(TDE)是一项功能,可用于加密Oracle数据库中的静态数据。TDE使用信封加密。信封加密是指用于加密数据库表的加密密钥由主密钥加密,该主密钥驻留在软件密钥库或硬件密钥库(如硬件安全模块(HSM))中。该主密钥设计为不可导出,以保护数据库操作的机密性和完整性。这为您提供了更细粒度的数据加密方案。因此,Oracle TDE是HSM设备(如AWS CloudHSM)的常见用例。

Oracle TDE支持密钥库安全存储TDE主加密密钥。您可以使用TDE钱包(软件密钥库)或外部密钥管理器(如HSM设备)。在本解决方案中,我们将展示如何将安装在Amazon Elastic Compute Cloud(Amazon EC2)上的Oracle 19c数据库的TDE密钥库从基于软件的TDE钱包迁移到AWS CloudHSM。

使用外部密钥管理器(如CloudHSM)相对于将密钥保留在主机上的Oracle钱包具有多个优势:

  • 增强的安全性:CloudHSM提供FIPS 140验证的硬件安全,将加密密钥保存在防篡改模块中。
  • 集中式密钥管理:CloudHSM支持集中管理加密密钥,使密钥轮换、备份和审计变得简单。
  • 合规性:您的监管要求可能包括加密,使用CloudHSM可以帮助您满足这些合规需求。

当您从一种类型的密钥库迁移到另一种时,新密钥库中会创建新的TDE主密钥。为确保您可以访问依赖于过去加密密钥的备份,请考虑在正常恢复窗口期间保留密钥库运行,或将现有密钥以完全相同的密钥标签复制到新密钥库。能够访问先前的主密钥有助于避免数据重新加密。

您可以使用TDE在线或离线加密数据。在线加密TDE表空间可以最小化对数据库操作的中断;但是,它需要两倍于被加密表空间的存储空间,因为加密过程发生在原始表空间的副本上。

解决方案概述

在本解决方案中,您将使用图1所示的步骤将Oracle 19c数据库的TDE密钥库从基于软件的TDE钱包迁移到CloudHSM。首先,通过将原始HSM的PKCS#11提供程序替换为CloudHSM PKCS#11软件库(步骤1-2),将当前加密密钥库(即原始TDE钱包)移动到软件钱包。接下来,您反向迁移到本地钱包(步骤3-5)。第三步是将数据库的加密钱包切换到CloudHSM集群(步骤6和7)。此过程完成后,您的数据库将自动使用新的主密钥重新加密数据密钥。

图1:将EC2 Oracle TDE数据库加密钱包迁移到CloudHSM的步骤

注意:以下说明已使用Oracle 19c版本进行测试。

先决条件

您必须满足以下先决条件才能完成本文中的解决方案。

  • AWS CloudHSM集群:您需要设置一个CloudHSM集群,并配置一个管理EC2实例用于与CloudHSM交互,遵循开始使用AWS CloudHSM中的步骤和最佳实践。
  • Oracle数据库:确保您的Oracle数据库正在运行。本文假设您有一个在EC2 Linux实例上运行的Oracle Database 19c数据库,并且已按照为AWS CloudHSM配置客户端Amazon EC2实例安全组中的说明设置了到CloudHSM的网络连接。

将Oracle数据库密钥库迁移到CloudHSM外部密钥库

作为迁移的第一步,您需要将Oracle数据库密钥库迁移到CloudHSM外部密钥库。您可以通过安装CloudHSM客户端和PKCS#11库,然后配置PKCS#11库连接到HSM集群来实现。

安装CloudHSM客户端:

  1. 在您的EC2实例上安装最新的CloudHSM客户端软件。
  2. 配置客户端以连接到集群中的HSM。对于Linux EC2,使用以下命令:
    1
    
    sudo /opt/cloudhsm/bin/configure-cli -a <HSM的ENI IPv4 / IPv6地址>
    
  3. 将初始化集群时创建的CloudHSM颁发证书(customerCA.crt)复制到/opt/cloudhsm/etc文件夹。有关更多信息,请参阅AWS CloudHSM中的激活集群
  4. 验证到CloudHSM集群的连接性:
    1
    
    /opt/cloudhsm/bin/cloudhsm-cli interactive
    
  5. 以管理员身份登录集群并创建一个加密用户(例如hsm-crypto-user),并为其分配crypto-user角色:
    1
    2
    
    aws-cloudhsm > login --username hsm-crypto-user --role admin
    aws-cloudhsm > user create --username hsm-crypto-user --role crypto-user
    
  6. 以hsm-crypto-user身份登录并验证配置。

安装PKCS#11库

  1. 安装AWS CloudHSM Client SDK 5的PKCS #11库。
  2. 配置Oracle使用PKCS库:
    • 将PKCS#11库复制到适当的Oracle文件夹。通常,这是:
      1
      
      cp /opt/cloudhsm/libcloudhsm_pkcs11.so /opt/oracle/extapi/[32,64]/hsm/aws/{VERSION}/libcloudhsm_pkcs11.so
      
    • 确保/opt/oracle文件夹具有正确的所有权,通常是oracle:dba作为所有者:组。

配置PKCS#11库连接到HSM集群

使用以下命令:

1
2
sudo /opt/cloudhsm/bin/configure-pkcs11 -a <HSM IP地址>
sudo /opt/cloudhsm/bin/configure-pkcs11 --hsm-ca-cert <customerCA证书文件>

配置Oracle钱包位置

在本节中,您将使用sqlnet.ora文件配置Oracle指向CloudHSM。

要配置Oracle钱包位置:

  1. 编辑sqlnet.ora参数ENCRYPTION_WALLET_LOCATION以指向HSM:
    1
    2
    3
    
    ENCRYPTION_WALLET_LOCATION=
      (SOURCE=(METHOD=HSM)
      )
    
  2. 验证WALLET_ROOT参数是否指向当前基于文件的TDE钱包位置。此参数定义TDE钱包(和其他相关文件)的存储位置。您可以将其设置为现有目录, preferably one in your $ORACLE_BASE or $ORACLE_HOME directory, but other locations are also possible.
    1
    2
    
    show parameter wallet_root
    show parameter tde_configuration
    
  3. 如果尚未设置WALLET_ROOT,使用以下命令设置:
    1
    2
    
    ALTER SYSTEM SET WALLET_ROOT = '/u01/app/oracle/admin/orcl/wallet' SCOPE=BOTH SID='*';
    ALTER SYSTEM SET TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=FILE" SCOPE=BOTH SID="*"
    

注意

  • 在Oracle Database 19c及更高版本中,sqlnet.ora中的ENCRYPTION_WALLET_LOCATION参数已弃用,转而使用WALLET_ROOTTDE_CONFIGURATION
  • 您还可以使用V$ENCRYPTION_WALLET视图检查当前密钥库位置和状态。

将Oracle数据库指向使用本地基于文件的密钥库和CloudHSM

TDE_CONFIGURATION中的KEYSTORE_CONFIGURATION属性决定了密钥库类型。

要将Oracle数据库指向:

  1. 使用以下代码将数据库指向本地密钥库和CloudHSM:
    1
    
    ALTER SYSTEM SET TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=HSM|FILE" SCOPE = BOTH SID = '*';
    
  2. 重新启动数据库以获得一致的结果。

验证基于文件的密钥库钱包是否打开

要继续进行加密密钥迁移,您需要检查当前密钥库状态并确保基于文件的钱包已打开。

要验证钱包是否打开:

  1. 检查基于文件的钱包是否打开:
    1
    
    Select * from V$encryption_wallet;
    
    图2:验证钱包状态为OPEN
  2. 如果钱包状态不是OPEN,使用以下命令打开它:
    1
    
    ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "wallet_password";
    

将加密密钥迁移到CloudHSM

使用ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY命令启动TDE主加密密钥迁移。

要迁移加密密钥:

使用以下命令迁移加密密钥:

1
ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY IDENTIFIED BY "hsm-crypto-user:password" MIGRATE USING "wallet-password" WITH BACKUP USING 'backup_tag';

用于迁移加密密钥的参数是:

  • SET ENCRYPTION KEY:指定该命令与TDE主加密密钥相关
  • IDENTIFIED BY:指定迁移密钥库的详细信息,包括外部密钥库用户和密码
  • MIGRATE USING:指定包含主加密密钥的基于文件的钱包的密码
  • WITH BACKUP:在迁移前创建密钥库的备份

验证迁移是否完成

此时,从Oracle到Cloud HSM的迁移应该已完成。使用以下步骤进行验证。

要验证迁移:

  1. 再次检查钱包状态。如果迁移成功,WALLET_TYPE将为HSM,WALLET_OR将为PRIMARY。
    1
    
    Select * from V$encryption_wallet;
    
    图3:验证WALLET_TYPE和WALLET_OR是否正确
  2. 如果钱包未打开,使用:
    1
    
    SQL>administer key management set keystore open identified by "hsm-crypto-user:password"
    
  3. 验证数据库是否可以无问题地访问加密数据,确认迁移成功。

设置自动登录

创建自动登录以在数据库重新启动期间打开钱包连接到AWS CloudHSM。

要设置自动登录:

  1. 创建一个新的基于文件的密钥库,使用与CloudHSM加密用户相同的用户名和密码:
    1
    
    ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/etc/oracle/wallets/<path>/tde' IDENTIFIED BY "hsm-crypto-user:password";
    
  2. 将CloudHSM加密用户密码添加到密钥库(TDE钱包):
    1
    
    ADMINISTER KEY MANAGEMENT ADD SECRET 'hsm-crypto-user:password' FOR CLIENT 'HSM_PASSWORD' TO KEYSTORE '/etc/oracle/wallets/<path>/tde' IDENTIFIED BY "hsm-crypto-user:password" WITH BACKUP;
    
  3. 以下命令创建一个新的自动登录密钥库。这对于需要无需人工干预即可访问密钥库的场景非常有用:
    1
    
    ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/etc/oracle/wallets/<path>/tde' IDENTIFIED BY "<hsm-crypto-user:password>";
    
  4. 打开新创建的基于文件的密钥库:
    1
    
    ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "<hsm-crypto-user:password>"
    

密钥轮换

密钥轮换通过提供多种数据安全优势,帮助您遵守安全最佳实践。定期轮换TDE密钥减少了可能获得密钥的不良行为者的机会窗口,从而最小化潜在泄露的影响。

许多已建立的安全框架和合规标准(如PCI DSS和HIPAA)建议或要求定期轮换密钥以维护加密数据的完整性和机密性。通过确保密钥不会无限期使用,您可以帮助减少暴露或泄露的风险,从而增强整体安全性。

由于计算能力的进步或新发现的漏洞,加密算法可能会随着时间的推移变得不那么安全。通过定期轮换密钥,您可以根据需要过渡到更强的加密方法,从而提高对新兴风险的防护。

何时轮换TDE密钥

密钥轮换的频率取决于多个因素,包括组织策略、监管要求和受保护数据的敏感性。以下是一些常见做法:

  • 每年:许多组织每年轮换一次TDE密钥,以符合常见的合规要求。
  • 每季度:对于更高安全性的环境或更敏感的数据,每季度轮换密钥可以提供额外的安全层。
  • 如果密钥被泄露或怀疑被泄露:如果您认为密钥被泄露,建议尽快轮换该密钥以减少影响窗口。

使用HSM密钥进行Oracle TDE主密钥轮换

在本节中,您选择一个32位十六进制值作为生成密钥时使用的前缀,然后使用该密钥更新Oracle数据库以使用新的主密钥。

  1. 以具有ADMINISTER KEY MANAGEMENTSYSKM权限的用户身份登录数据库实例,并执行以下命令:
    1
    
    ADMINISTER KEY MANAGEMENT SET ENCRYPTION KEY IDENTIFIED BY "<hsm-crypto-user:password>"
    
  2. 决定要使用的32位十六进制值模式。我们在本示例中使用了15A5142C9E2D3C2F18FD435814257DFD
  3. 将前缀ORACLE.TDE.HSM.MK添加到十六进制模式:
    1
    
    ORACLE.TDE.HSM.MK.0615A5142C9E2D3C2F18FD435814257DFD
    
  4. 登录CloudHSM并使用上一步生成的标签生成密钥:
    1
    
    key generate-symmetric aes --label 'ORACLE.TDE.HSM.MK.0615A5142C9E2D3C2F18FD435814257DFD' --key-length-bytes 32 —attributes encrypt=true decrypt=true
    
  5. 如果原始密钥是通过另一个用户生成的,请与Oracle hsm-crypto-user共享该密钥:
    1
    
    key share --filter attr.label="ORACLE.TDE.HSM.MK.0615A5142C9E2D3C2F18FD435814257DFD" attr.class=secret-key --username hsm_crypto_user --role crypto-user
    
  6. 更新Oracle数据库以使用新的主TDE密钥:
    1
    
    ADMINISTER KEY MANAGEMENT USE KEY '0615A5142C9E2D3C2F18FD435814257DFD' FORCE KEYSTORE IDENTIFIED BY "hsm-crypto-user:password"
    

通过遵循这些指南,您可以增强加密数据的安全性,符合监管要求,并维护强大的密钥管理实践。

结论

在本文中,我们向您展示了透明数据加密(TDE)的重要性以及使用外部密钥管理器(如AWS CloudHSM)存储TDE加密密钥的好处。我们讨论了TDE相对于加密底层存储的优势,以及为什么使用外部密钥管理器优于将密钥保留在主机上的Oracle钱包。遵循这些指南可以帮助您增强加密数据的安全性,符合监管要求,并维护强大的密钥管理实践。

本文的关键要点是:

  • TDE提供细粒度加密、合规性优势和强大的密钥管理。
  • 外部密钥管理器提供增强的安全性、集中管理、改进的可审计性和可扩展性。
  • 定期轮换TDE密钥对于维护安全、符合法规和遵循密钥管理中的推荐实践至关重要。

要开始使用TDE和AWS CloudHSM保护您的Oracle数据库,请访问AWS管理控制台。遵循本指南中概述的步骤将您的TDE加密密钥库迁移到AWS CloudHSM,并开始定期轮换密钥以增强数据安全态势。通过采取这些行动,您可以确保您的敏感数据受到保护,您的组织符合法规,并且您遵循数据加密和密钥管理的最佳实践。

有关更多信息,请参阅:

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计