MongoDB 自动客户端字段级加密 | mongoCryptD 守护进程未标记要加密的字段

问题描述 投票:0回答:2

我正在使用 MongoDB 的自动客户端字段级加密,但我观察到字段在集合中没有得到加密。

  • 我使用的MongoDB-crypt库是1.6.1
  • mongo驱动核心和同步版本是4.9.1
  • MongoCryptD版本是5.0.3
  • 操作系统是linux(RHEL 7.9)
  • MongoDB 版本 4.2.11 企业版。
  • Java JDK- 17

代表我想要执行字段加密的文档的类使用带有数据密钥 ID 和加密算法的 @Encrypted 注释进行注释 而且我想要加密的类中的字段只是用 @Encypted 注释进行注释。

所以它看起来像这样 ->

@Data  // lombok
@Document
@Encrypted (keyID="<the key id>", algorithm= "<The algorithm>")
public class MyDocument{
   @Id
   private UUID dataID;

   @Encrypted
   private String fieldToBeEncrypted;
   
   private String otherField;
} 

我使用 MongoJsonSchemaCreator 的 createSchemaFor() 方法和过滤器方法 MongoJsonSchemaCreator.encryptedOnly() 来生成 Json Schema,然后从中创建 SchemaMap。

然后我在创建 AutoEncryptionSettings 时填充此 schemaMap。->

MongoClientSettings clientSettings = MongoClientSettings.builder()
.autoEncryptionSettings(AutoEncryptionSettings.builder()
        .keyVaultNamespace(keyVaultNamespace)
        .kmsProviders(kmsProviders)
        .schemaMap(schemaMap)
        .extraOptions(extraOptions)
        .build())
...(other settings)
    .build();

我放入 kmsProviders 中的主密钥是使用 OpenSSL 随机命令生成的 96 字节随机字符。


现在的问题是我没有看到任何数据被加密,而且我在控制台日志中也没有看到任何失败消息。

现在我的问题是->

  1. 实际加密发生在哪里?正如文档所述,它绝对不在 mongocryptd 中。 那么实际上是什么在处理加密呢?
  2. 为了启用自动字段加密,我们必须在 mongo 集群中启用任何设置吗?
  3. 我在问题顶部提到的版本是那些相互兼容且与 Linux 操作系统兼容的版本?
  4. 是否有任何一般性的清单可供我使用来解决未发生加密的问题?

mongocryptd 进程似乎没有标记要加密的写入字段,因此没有进行加密,但不确定


编辑1:

分享我在 AutoEncryptionSettings 中尝试过的粗略 SchemaMap,但这失败了 ->

schemaMap.put(getDatabaseName() + ".MyDocument", BsonDocument.parse("{"
  + "  bsonType: \"object\","
  + "  encryptMetadata: {"
  + "    keyId: [UUID(\"" + keyUuid + "\")]"
  + "  },"
  + "  properties: {"
  + "    fieldToBeEncrypted: {"
  + "      encrypt: {"
  + "        bsonType: \"string\","
  + "        algorithm: \"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic\""
  + "      }"
  + "    }"
  + "  }"
  + "}"));

这里的“keyUuid”是使用 ClientEncryption 类的 createDataKey() 方法生成的数据密钥的 UUID。为了传递这个硬编码的 SchemaMap,我暂时在 MyDocument 类上注释了 @Encrypted 注释。

java mongodb spring-data-mongodb java-17 mongodb-csfle
2个回答
0
投票

因为它很大,所以将其写为答案:

  1. Where does the actual encryption happens ?
    - 在 java 驱动程序内部(特别是在 libmongocrypt 库内部),但 mongocryptd 也是此工作流程所需的守护进程。
  2. Is there any settings we have to enable in the mongo cluster in order to enable auto field encryption.
    - 有一些选项可以禁用加密,但默认情况下,只要您指定了正确的 schemaMap,它就应该可以工作。
  3. are those inter compatible with each other
    - 应该是这样,但即使不是,这样简单的功能从一开始就在 csfle 逻辑中。
  4. @Encrypted
    属性来自哪里,我不是java开发人员,但我在文档中没有找到它。请参阅文章如何配置它这里。另外,为了进一步排除故障,请提供您添加到 clientSettings 的 schemaMap 值。

0
投票

我将生成 schemaMap 的代码放在下面 ->

private Map<String, BsonDocument> generateSchemaMap() {
    MongoJsonSchemaCreator schemaCreator = MongoJsonSchemaCreator.create(mappingContext);
    Map<String, BsonDocument> schemaMap = new HashMap<>();
    Class encryptedEntityClass = MyDocument.class ;  //Class that has fields to be encrypted -> MyDocument
    MongoJsonSchema schema = schemaCreator
            .filter(MongoJsonSchemaCreator.encryptedOnly); // this checks for entity marked with @Encrypted annotation only.
            .createSchemaFor(encryptedEntityClass);
    
    schemaMap.put("dbName.MyDocument", 
            schema.schemaDocument().toBsonDocument(encryptedEntityClass,
                 MongoClientSettings.getDefaultCodecRegistry()));
    return schemaMap;
        
}

这个 SchemaMap 然后我放入我的 AutoEncryptionSettings ->

MongoClientSettings.Builder.autoEncryptionSettings(
          AutoEncryptionSettings.builder()
            .keyVaultNamespace(encryptionConfig.getKeyVaultNamespace())
            .kmsProviders(LocalKmsUtils.providersMap(encryptionConfig.getMasterKeyPath()))
            .schemaMap(generateSchemaMap())
          .build())
         .build();
© www.soinside.com 2019 - 2024. All rights reserved.