操作方法:加密应用程序状态

自动加密状态并管理密钥轮换

对应用程序静态状态进行加密,以在企业工作负载或受监管的环境中提供更强大的安全性。 Dapr提供基于AES的自动客户端端加密,使用Galois/Counter Mode (GCM),支持128、192和256位的密钥。

除了自动加密之外,Dapr 还支持主密钥和辅助加密密钥,使开发人员和运营团队能够更轻松地启用密钥轮换策略。 所有 Dapr 状态存储都支持此功能。

加密密钥始终从密钥中提取,不能作为明文值提供在metadata部分。

启用自动加密

将以下 metadata 部分添加到任何 Dapr 支持的状态存储中:

  1. metadata:
  2. - name: primaryEncryptionKey
  3. secretKeyRef:
  4. name: mysecret
  5. key: mykey # key is optional.

例如,这是 Redis 加密状态存储的完整 YAML:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: statestore
  5. spec:
  6. type: state.redis
  7. version: v1
  8. metadata:
  9. - name: redisHost
  10. value: localhost:6379
  11. - name: redisPassword
  12. value: ""
  13. - name: primaryEncryptionKey
  14. secretKeyRef:
  15. name: mysecret
  16. key: mykey

现在你有一个Dapr状态存储,它被配置为从一个名为mysecret的密钥中获取加密密钥,在一个名为mykey的密钥中包含实际的加密密钥。

实际的加密密钥 必须 是一个有效的、十六进制编码的加密密钥。 虽然支持192位和256位密钥,但建议您使用128位加密密钥。 如果加密密钥无效,Dapr 将出错并退出。

例如,您可以使用以下方法生成一个随机的十六进制编码的128位(16字节)密钥:

  1. openssl rand 16 | hexdump -v -e '/1 "%02x"'
  2. # Result will be similar to "cb321007ad11a9d23f963bff600d58e0"

请注意,密钥存储不一定要支持keys.

密钥轮换

为了支持密钥轮换,Dapr 提供了一种指定辅助加密密钥的方法:

  1. metadata:
  2. - name: primaryEncryptionKey
  3. secretKeyRef:
  4. name: mysecret
  5. key: mykey
  6. - name: secondaryEncryptionKey
  7. secretKeyRef:
  8. name: mysecret2
  9. key: mykey2

当Dapr启动时,它将获取包含在metadata部分中列出的加密密钥的秘密。 Dapr 自动知道哪个状态项已使用哪个密钥加密,因为它会将 secretKeyRef.name 字段附加到实际状态密钥的末尾。

要旋转密钥,

  1. primaryEncryptionKey更改为指向包含您新密钥的秘密。
  2. 将旧的主加密密钥移动到secondaryEncryptionKey

新数据将使用新密钥进行加密,检索到的旧数据将使用辅助密钥进行解密。

对使用旧密钥加密的数据项的任何更新都将使用新密钥重新加密。

注意

当您旋转密钥时,使用旧密钥加密的数据不会自动重新加密,除非您的应用程序再次写入它。 如果您移除旋转的密钥(现在是次要的加密密钥),您将无法访问使用该密钥加密的数据。

相关链接