静态加密

自 NATS 服务器版本 2.3.0 起支持

自 NATS 服务器版本 2.11.0 起,Windows 上支持 TPM

{% hint style="warning" %} 请注意,尽管 NATS 服务器的静态加密功能已完全支持,但我们建议在可用的情况下使用文件系统加密。

文件系统加密(尤其是由云托管服务提供的)经过优化以提高吞吐量,不会给 NATS 服务器带来负担,并且无需在 NATS 安装中进行密钥管理。

{% endhint %}

NATS 服务器可以被配置为加密消息块,包括消息头和负载。其他元数据文件也会被加密,例如流元数据文件和消费者元数据文件。

目前支持两种加密算法:

启用加密是通过服务器上的 jetstream 配置块 来完成的。

jetstream : {
  cipher: chachapoly
  key : "6dYfBV0zzEkR3vxZCNjxmnVh/aIqgid1"
}

建议在运行时通过环境变量提供加密密钥,例如 $JS_KEY,这样密钥就不会保存在文件中。

jetstream : {
  cipher: chachapoly
  key: $JS_KEY
}

该变量可以在环境中导出,或在服务器启动时传递。

JS_KEY="mykey" nats-server -c js.conf

TPM(仅适用于 Windows)

jetstream {
  store_dir: nats
  max_file_store: 10G
  tpm {
          keys_file: "keys"
          encryption_password: "pwd"
  }
}
PropertyDescriptionDefaultVersion
keys_fileSpecifies the file where encryption keys are stored. This option is required, otherwise TPM will not be active. If the file does NOT EXIST, a new key will be dynamically created and stored in the pcrrequired2.11.0
encryption_passwordPassword used for decrypting data in the keys file. OR, the password used to seal the dynamically created key in the TPM store.required2.11.0
srk_passwordThe Storage Root Key (SRK) password is used to access the TPM's storage root key. The srk password is optional in TPM 2.0.not set2.11.0
pcrPlatform Configuration Registers (PCRs). 0-16 are reserved. Pick a value from 17 to 23.222.11.0
cipherchacha/chachapoly or aes.chachapoly2.11.0

更改加密设置

在已有数据的情况下启用加密

支持在已有数据的服务器上启用加密。需要注意的是,现有未加密的消息块不会被重新加密,但任何新存储的消息块将会被加密。

如果希望对现有块进行加密,可以备份并恢复流(备份时解密,恢复时重新加密)。

禁用或更改密钥

如果在服务器上启用了加密,并且服务器重启时使用了不同的密钥或完全禁用了加密,服务器将无法在从存储加载消息时解密这些消息。如果发生这种情况,您会看到类似以下的日志信息:

Error decrypting our stream metafile: chacha20poly1305: message authentication failed

请注意,这将影响 JetStream 功能,但服务器仍将支持 Core NATS 功能。

更改加密算法

可以更改 cipher,但必须使用相同的密钥。服务器将正确地使用新的加密算法加密新消息块,并使用现有加密算法解密现有消息块。

性能考虑因素

性能方面的考虑:正如预期的那样,加密可能会降低性能,但具体降低多少很难确定。在 MacbookPro 2.8 GHz Intel Core i7 和 SSD 上的一些性能测试中,我们观察到性能下降幅度从 1% 到超过 30% 不等。除了加密所需的 CPU 周期外,加密后的文件可能更大,导致存储或读取的数据量增加。