MongoDb 具有 .NET 驱动程序服务器端手动客户端字段加密验证

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

我正在对文档中的特定属性实施手动客户端加密。 MongoDB 文档建议我可以指定一个可用于执行服务器端验证的模式,我尝试进行设置以确保客户端代码正确加密属性。

我在创建集合时指定架构。

var schemaMap = new Dictionary<string, BsonDocument> { { collectionNamespace.CollectionName, schema } };

var options = new AutoEncryptionOptions(
    keyVaultNamespace,
    kmsProviders,
    schemaMap: schemaMap,
    bypassAutoEncryption: true);

var settings = MongoClientSettings.FromConnectionString(connectionString);
settings.AutoEncryptionOptions = options;
var client = new MongoClient(settings);
var encryptedDatabase = client.GetDatabase(collectionNamespace.DatabaseNamespace.DatabaseName);
encryptedDatabase.CreateCollection(collectionNamespace.CollectionName);

然后再次创建用于

Insert
文档的 MongoDB 客户端。

var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
var autoEncryptionOptions = new AutoEncryptionOptions(
    
    keyVaultNamespace: keyVaultNamespace,
    kmsProviders: kmsProviders,
    schemaMap: schemaMap,
    bypassAutoEncryption: true
    );
clientSettings.AutoEncryptionOptions = autoEncryptionOptions;
var secureClient = new MongoClient(clientSettings);

当我插入一个故意符合配置架构的文档时,不会抛出任何异常来识别问题。

secureCollection.InsertOne(sampleDocument);

所使用的模式基于 MongoDB 示例代码

我正在使用 Azure Cosmos DB for MongoDB 帐户,服务器版本 4.2。 MongoDB.Driver版本是2.20.0。

我是否误解了模式验证的功能?还是我漏掉了一个步骤?

任何指示都会有用,谢谢。

mongodb mongodb-.net-driver
2个回答
0
投票

虽然最初使用

AutoEncryptionOptions
进行模式验证的尝试是不正确的(@dododo 很有帮助地指出),但对如何实现服务器端模式验证的进一步调查导致在创建集合时定义了
Validator

    encryptedDatabase.CreateCollection(
        collectionNamespace.CollectionName,
        new CreateCollectionOptions<Student>
        {
            Validator = new FilterDefinitionBuilder<Student>().JsonSchema(schemaDocument)
        });

这种方法仍然不起作用,但这是由于使用的数据库而不是实现造成的。正在研究的解决方案是使用 MongoDB API 访问 Azure CosmosDB。 Microsoft 的答复指出 CosmosDB 不支持此功能

我们从团队获得信息 - Cosmos DB 不支持架构验证

仔细检查 Microsoft Azure Cosmos DB for MongoDB 与 MongoDB Atlas 文档显示“用于数据治理控制的 JSON 架构”“目前正在开发中”


0
投票

见下图:

  1. 当您设置
    bypassAutoEncryption=true
    时,您将跳过所有加密逻辑,因此如果该字段之前已加密,则只有解密才会发生。
  2. “没有抛出任何异常来识别问题。” - 预计,
    schemaMap
    的唯一目标是提供到加密字段的路径,它不会验证文档,如果该路径通向不存在的字段 - 那么整个加密逻辑将被跳过。
  3. “Azure Cosmos DB for MongoDB 帐户,服务器版本 4.2。MongoDB.Driver 版本为 2.20.0。” - 我不能 100% 确定 CSFLE(版本 1)逻辑是否可以与 cosmosdb 一起使用。至少你应该从 mongo (不是 cosmos)服务器二进制文件生成 mongocryptd 守护进程,如果这不是这种情况下唯一的问题,我不会感到惊讶。此外,新发布的可查询加密(CSFLE 版本 2)肯定不适用于 Cosmos,因为它包含服务器工作流程
© www.soinside.com 2019 - 2024. All rights reserved.