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

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

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

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

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

启用自动加密

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

metadata:
- name: primaryEncryptionKey
  secretKeyRef:
    name: mysecret
    key: mykey # key is optional.

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

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: localhost:6379
  - name: redisPassword
    value: ""
  - name: primaryEncryptionKey
    secretKeyRef:
      name: mysecret
      key: mykey

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

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

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

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

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

密钥轮换

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

metadata:
- name: primaryEncryptionKey
    secretKeyRef:
      name: mysecret
      key: mykey
- name: secondaryEncryptionKey
    secretKeyRef:
      name: mysecret2
      key: mykey2

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

要旋转密钥,

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

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

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

相关链接