Kit de développement logiciel (SDK) Microsoft Information Protection - Stockage du cache
Le SDK MIP implémente une base de données SQLite3 pour maintenir le stockage du cache du SDK. Avant la version 1.3 du kit de développement logiciel (SDK) Microsoft Information Protection, seuls deux types de stockage d’état du cache ont été pris en charge : sur disque et en mémoire. Ces deux types ont stocké certaines données, notamment des licences pour le contenu protégé et les informations de stratégie, en texte clair.
Pour améliorer l’état de la sécurité du kit de développement logiciel (SDK), nous avons ajouté la prise en charge d’un deuxième type de cache de disque qui utilise des API de chiffrement spécifiques à la plateforme pour protéger la base de données et son contenu.
L’application définit le type de cache lors du chargement du profil dans les objets FileProfileSettings
, PolicyProfileSettings
ou ProtectionProfileSettings
. Le type de cache est statique pour la durée du profil. Le passage à un autre type de stockage de cache nécessite de détruire le profil existant et d’en créer un nouveau.
Types de stockage de cache
À compter de la version 1.3 du kit de développement logiciel (SDK) MIP, les types de cache de stockage suivants sont disponibles.
Type | Objectif |
---|---|
InMemory | Conserve le cache de stockage en mémoire dans l’application. |
OnDisk | Stocke la base de données sur le disque dans l’annuaire fourni dans l’objet paramètres. La base de données est stockée en texte clair. |
OnDiskEncrypted | Stocke la base de données sur le disque dans l’annuaire fourni dans l’objet paramètres. La base de données est chiffrée à l’aide d’API spécifiques au système d’exploitation. |
Chaque moteur généré par l’application génère une nouvelle clé de chiffrement.
Le stockage du cache est défini via l’un des objets de paramètres de profil, via l’énumération 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>());
Quand utiliser chaque type
Le stockage du cache est important pour maintenir l’accès hors connexion aux informations précédemment déchiffrées et garantir les performances des opérations de déchiffrement lorsque les données ont été consommées précédemment.
- Stockage en mémoire : utilisez ce type de stockage pour les processus de longue durée où la persistance des informations de cache de stratégie ou de cache de licence sur les redémarrages de service n’est pas nécessaire.
- Sur disque : utilisez ce type de stockage pour les applications où les processus peuvent souvent s’arrêter et redémarrer, mais doivent conserver le cache de stratégie, de licence et de découverte de service entre les redémarrages. Ce type de cache de stockage est en texte clair. Il convient donc mieux aux charges de travail de serveur où les utilisateurs n’auront pas accès au stockage d’état. Des exemples de ce charge incluent un service Windows ou un démon Linux s’exécutant sur un serveur ou une application SaaS où seuls les administrateurs de service auraient accès aux données d’état.
- Sur disque et chiffré : utilisez ce type de stockage pour les applications où les processus peuvent souvent s’arrêter et démarrer, mais doivent conserver le cache de stratégie, de licence et de découverte de service entre les redémarrages. Ce cache de stockage est chiffré. Il convient donc mieux aux applications de station de travail où un utilisateur peut parcourir et découvrir la base de données d’état. Le chiffrement permet de s’assurer que les utilisateurs indiscrets n’auront pas accès via le contenu de la stratégie ou le contenu de la licence de protection en texte brut. Il est important de noter que dans tous les cas, les données sont chiffrées avec des clés auxquelles l’utilisateur peut accéder. Un adversaire qualifié est en mesure de déchiffrer le cache avec un effort minimal, mais cela empêche la falsification et la navigation.
Plateformes prises en charge pour le chiffrement
Plateforme | Version | Notes |
---|---|---|
Microsoft Windows | Windows 8 et ultérieur | Windows 7 prend uniquement en charge CacheStorageType::OnDisk |
macOS | High Sierra et versions ultérieures | |
Ubuntu Linux | 16.04 et versions ultérieures | Nécessite SecretService et l’indicateur de fonctionnalité LinuxEncryptedCache . |
Android | Android 7.0 ou version ultérieure | |
iOS | Toutes les versions prises en charge |
Bien que le SDK MIP prenne en charge d’autres distributions Linux, nous n’avons pas testé le chiffrement du cache sur RedHat Enterprise Linux, CentOS ou Debian.
Remarque
L’indicateur de fonctionnalité permettant d’activer le stockage de cache sur Linux est défini via mip::MipConfiguration::SetFeatureSettings()
Mettre en cache les tables de base de données de stockage
Le SDK MIP gère deux bases de données pour le cache. Il s’agit des kits de développement logiciel (SDK) Protection et de la maintenance des détails de l’état de protection. L’autre est destinée aux SDK Policy et à la gestion des détails de la stratégie et des informations de service. Les deux sont stockées dans le chemin défini dans l’objet settings, sous mip\mip.policies.sqlite3 et mip\mip.protection.sqlite3.
Remarque
Le SDK MIP ne garantit pas la compatibilité entre différentes versions de son cache. Il est recommandé d’effacer tous les fichiers dans le répertoire mip\ ou tout autre répertoire modifié par défaut avant de mettre à niveau l’application vers une nouvelle version du SDK MIP.
Base de données de protection
Table | Objectif | Chiffré |
---|---|---|
AuthInfoStore | Stocke les détails de la demande d’authentification. | Non |
ConsentStore | Stocke les résultats de consentement pour chaque moteur. | Non |
DnsInfoStore | Stocke les résultats de recherche DNS pour les opérations de protection | Non |
EngineStore | Stocke les détails du moteur, l’utilisateur associé et les données client personnalisées | Non |
KeyStore | Stocke les clés de chiffrement symétriques pour chaque moteur. | Oui |
LicenseStore | Stocke les informations de licence pour les données précédemment déchiffrées. | Oui |
SdInfoStore | Stocke les résultats de la découverte de service. | Non |
Remarque
Le cache LicenseStore nécessite une identité à définir sur le moteur de protection ou le moteur de fichiers.
Base de données de stratégie
Table | Objectif | Chiffré |
---|---|---|
KeyStore | Stocke les clés de chiffrement symétriques pour chaque moteur. | Oui |
Stratégies | Stocke les informations de stratégie des étiquettes pour chaque utilisateur. | Oui |
PoliciesUrl | Stocke l’URL du service de stratégie back-end pour un utilisateur spécifique. | Non |
Confidentialité | Stocke les règles de classification pour une stratégie d’utilisateur spécifique. | Oui |
SensitivityUrls | Stocke l’URL du service de stratégie de confidentialité back-end pour un utilisateur spécifique. | Non |
Considérations liées à la taille de la base de données
La taille de la base de données dépend de deux facteurs : la quantité de moteurs ajoutés au cache et la quantité de licences de protection mises en cache. À compter du SDK MIP 1.3, il n’existe aucun mécanisme permettant de nettoyer le cache de licences quand il expire. Un processus externe est nécessaire pour supprimer le cache s’il grandit au-delà de ce que vous souhaitez.
Le contributeur le plus important à la croissance de la base de données sera le cache de licences de protection. Si la mise en cache des licences n’est pas nécessaire, soit parce que les allers-retours de service n’affectent pas les performances de votre application, soit parce que le cache peut augmenter pour atteindre une trop grande taille, le cache de licences peut être désactivé. Pour ce faire, définissez CanCacheLicenses
sur l’objet FileProfile::Settings
à faux.
FileProfile::Settings profileSettings(mMipContext,
mip::CacheStorageType::OnDiskEncrypted,
mAuthDelegate,
std::make_shared<sample::consent::ConsentDelegateImpl>(),
std::make_shared<FileProfileObserver>());
profileSettings.SetCanCacheLicenses(false);
Moteurs de mise en cache
Dans le kit de développement logiciel (SDK) MIP, un moteur est créé pour chaque utilisateur effectuant une opération authentifiée. Les moteurs fournissent une interface pour toutes les opérations effectuées au nom d’une identité authentifiée. Comme indiqué dans les concepts profils et moteurs, FileEngine, PolicyEngine ou ProtectionEngine ont chacun deux états CREATED
et LOADED
. Un moteur doit être créé et chargé pour pouvoir effectuer des opérations du kit de développement logiciel (SDK). Si un moteur n’est pas utilisé, le SDK met en cache le moteur et le conserve dans l’état CREATED
aussi longtemps que possible en fonction des ressources disponibles. Chaque classe de profil du SDK respectif fournit également une méthode UnloadEngineAsync
pour y parvenir explicitement.
Chaque moteur possède un identificateur unique id
utilisé dans toutes les opérations de gestion du moteur. L’application cliente peut fournir explicitement un ID, ou le SDK peut en générer un, s’il n’est pas fourni par l’application. Si un identificateur unique est fourni à l’aide d’objets de paramètres de moteur au moment de la création du moteur et que la mise en cache est activée dans le profil d’API, comme décrit ci-dessus, les mêmes moteurs peuvent être utilisés chaque fois que l’utilisateur effectue une opération avec le kit de développement logiciel (SDK). Suivez les extraits de code pour créer un [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)
.
L’échec de la fourniture d’un engineId existant entraîne des allers-retours de service supplémentaires pour récupérer la stratégie et récupère des licences qui ont peut-être déjà été mises en cache pour le moteur existant. La mise en cache de l’ID du moteur permet au SDK hors connexion d’accéder aux informations précédemment déchiffrées et aux améliorations générales des performances.
Étapes suivantes
Ensuite, apprenez-en davantage sur les concepts d’objet Profile et Engine pour comprendre comment définir correctement les ID de moteur MIP pour utiliser correctement la mise en cache du SDK MIP.