Microsoft 信息保护 SDK - 缓存存储

MIP SDK 实现用于维护 SDK 缓存存储的 SQLite3 数据库。 在版本 1.3 Microsoft 信息保护 SDK 之前,仅支持两种类型的缓存状态存储:在磁盘上和内存中。 这两种类型以纯文本格式存储特定数据,尤其是受保护内容和策略信息的许可证。

为了改善 SDK 的安全状况,我们添加了对磁盘缓存的第二种类型的支持,该缓存使用特定于平台的加密 API 来保护数据库及其内容。

应用程序在将配置文件作为 、 或 对象的一部分加载时 FileProfileSettingsPolicyProfileSettings 定义缓存 ProtectionProfileSettings 类型。 缓存类型在配置文件的生命周期内是静态的。 若要更改到不同类型的缓存存储类型,需要销毁现有配置文件并创建新配置文件。

缓存存储类型

从 MIP SDK 版本 1.3 开始,可以使用以下存储缓存类型。

类型 用途
InMemory 维护应用程序中内存中的存储缓存。
OnDisk 将数据库存储在 settings 对象中提供的 目录中的磁盘上。 数据库以纯文本格式存储。
OnDiskEncrypted 将数据库存储在 settings 对象中提供的 目录中的磁盘上。 数据库使用特定于 OS 的 API 进行加密。

应用程序 生成的 每个引擎将生成新的加密密钥。

缓存存储通过枚举中的一个配置文件设置对象 mip::CacheStorageType 进行设置。

FileProfile::Settings profileSettings(mMipContext,
    mip::CacheStorageType::OnDiskEncrypted, // Define the storage type to use.
    mAuthDelegate,
    std::make_shared<sample::consent::ConsentDelegateImpl>(),
    std::make_shared<FileProfileObserver>());

何时使用每种类型

缓存存储对于保持对以前解密的信息的脱机访问,以及确保以前使用数据时解密操作的性能非常重要。

  • 在内存存储:此存储类型用于不需要跨服务重启持久保存策略或许可证缓存信息的长期进程。
  • 在磁盘上:对于进程可能经常停止和启动,但必须在重启时维护策略、许可证和服务发现缓存的应用程序,请使用此存储类型。 此存储缓存类型是纯文本的,因此更适合用户无法访问状态存储的服务器工作负荷。 例如,在服务器上运行的 Windows 或 Linux 守护程序,或者只有服务管理员有权访问状态数据的 SaaS 应用程序。
  • 在"磁盘"和"加密"上:对于进程可能经常停止和启动,但必须在重启时维护策略、许可证和服务发现缓存的应用程序,请使用此存储类型。 此存储缓存已加密,因此更适合用户浏览和发现状态数据库的工作站应用程序。 加密有助于确保通过策略内容或纯文本保护许可证内容,防止被窥探用户访问。 必须注意,所有情况下,数据都使用用户可能能够访问的密钥进行加密。 技能高超的攻击者几乎可以解密缓存,但这可以防止篡改和浏览。

支持的加密平台

平台 版本 说明
Microsoft Windows Windows 8及更高版本 Windows 7 仅支持 CacheStorageType::OnDisk
macOS High Sierra 及更高版本
Ubuntu Linux 16.04 及更高版本 需要 SecretService 和 feature 标志。
Android Android 7.0 或更高版本
iOS 所有支持的版本

虽然 MIP SDK 支持其他 Linux 分发版,但我们并未在 Linux、CentOS 或 Debian Enterprise RedHat 上测试缓存加密。

注意

通过 设置在 Linux 上启用缓存存储的功能标志 mip::MipConfiguration::SetFeatureSettings()

缓存存储数据库表

MIP SDK 维护两个缓存数据库。 一个适用于保护 SDK,并维护保护状态详细信息。 另一个策略 SDK 用于维护策略详细信息和服务信息。 两者存储在设置对象中定义的路径中,在 mip\mip.policies.sqlite3mip\mip.protection.sqlite3 下

保护数据库

用途 加密
AuthInfoStore 存储身份验证质询详细信息。
ConsentStore 存储每个引擎的同意结果。
DnsInfoStore 存储保护操作 DNS 查找结果
EngineStore 存储引擎详细信息、关联的用户和自定义客户端数据
KeyStore 存储每个引擎的对称加密密钥。 是的
LicenseStore 存储使用以前解密的数据的许可证信息。 是的
SdInfoStore 存储服务发现结果。

策略数据库

用途 加密
KeyStore 存储每个引擎的对称加密密钥。 是的
策略 存储每个用户的标签策略信息。 是的
PoliciesUrl 存储特定用户的后端策略服务 URL。
敏感度 存储特定用户策略的分类规则。 是的
SensitivityUrls 存储特定用户的后端敏感度策略服务 URL。

数据库大小注意事项

数据库大小取决于两个因素:要添加到缓存的引擎数量和已缓存的保护许可证数量。 从 MIP SDK 1.3 开始,没有机制在许可证缓存过期时清理许可证缓存。 如果缓存增长超过所需大小,则必须存在外部进程来删除缓存。

对数据库增长最重要的参与者是保护许可证缓存。 如果不需要许可缓存,因为服务往返不会影响应用程序性能,或者缓存可能增长过大,可以禁用许可证缓存。 可通过将 对象 CanCacheLicenses 上的 设置为 false FileProfile::Settings 来完成此操作。

FileProfile::Settings profileSettings(mMipContext,
    mip::CacheStorageType::OnDiskEncrypted,
    mAuthDelegate,
    std::make_shared<sample::consent::ConsentDelegateImpl>(),
    std::make_shared<FileProfileObserver>());

profileSettings.SetCanCacheLicenses(false);

Caching 引擎

在 MIP SDK 中,为执行任何身份验证操作的每个用户创建一个引擎。 引擎为代表经过身份验证的标识执行的所有操作提供接口。 如配置文件和引擎 概念中所讨论的,FileEngine、PolicyEngine 或 ProtectionEngine 各有两种 状态和 LOADED 。 需要创建并加载引擎才能执行 SDK 操作。 如果未使用引擎,SDK 会缓存该引擎,并尽可能长时间地保留该引擎, CREATED 具体取决于可用的资源。 每个相应 SDK 的配置文件 类还提供了一种显式 实现此目的的方法。

每个引擎都有一个 id 唯一标识符,用于所有引擎管理操作。 客户端应用程序可以显式提供 ID,或者 SDK 可以生成 ID(如果应用程序未提供)。 如果在创建引擎时使用引擎设置对象提供唯一标识符,并且如上所述在 API 配置文件中启用缓存,则每次用户通过 SDK 执行操作时,都可以使用相同的引擎。 按照代码片段创建 [mip::FileEngine](./concept-profile-engine-file-engine-cpp.md#create-file-engine-settings)[mip::PolicyEngine](./concept-profile-engine-policy-engine-cpp.md#implementation-create-policy-engine-settings)

未能提供现有 engineId 将导致额外的服务往返以提取策略,并提取可能已经缓存的现有引擎的许可证。 Caching ID 允许 SDK 脱机访问以前解密的信息和常规性能改进。

下一步

接下来,详细了解配置文件 和引擎对象 概念,了解如何正确设置 MIP 引擎 ID 以正确利用 MIP SDK 缓存。