SDK da Proteção de Informações da Microsoft - Conceitos do mecanismo do SDK de política
mip::PolicyEngine
implementa todas as operações que o SDK de Política pode executar, com exceção do carregamento do perfil.
Implementação: adicionar um mecanismo de política
Implementação: criar configurações do mecanismo de política
Semelhante a um perfil, o mecanismo também requer um objeto de configurações, mip::PolicyEngine::Settings
. Esse objeto armazena o identificador exclusivo do mecanismo, um objeto da implantação do mip::AuthDelegate
, dados personalizáveis do cliente que podem ser usados para depuração ou telemetria e, opcionalmente, a localidade.
Aqui criamos um objeto FileEngine::Settings
chamado engineSettings usando a identidade do usuário do aplicativo:
PolicyEngine::Settings engineSettings(
mip::Identity(mUsername), // mip::Identity.
authDelegateImpl, // Auth delegate object
"", // Client data. Customizable by developer, stored with engine.
"en-US", // Locale.
false); // Load sensitive information types for driving classification.
Ao criar engineSettings dessa maneira, é importante também definir explicitamente um engineId exclusivo ao:
engineSettings.SetEngineId(engineId);
Usar o nome de usuário ou email ajuda a garantir que o mesmo mecanismo seja carregado sempre que o usuário usar o serviço ou aplicativo.
Também é válido fornecer uma ID de mecanismo personalizador:
PolicyEngine::Settings engineSettings(
"myEngineId", // String
authDelegateImpl, // Auth delegate object
"", // Client data in string format. Customizable by developer, stored with engine.
"en-US", // Locale. Default is en-US
false); // Load sensitive information types for driving classification. Default is false.
Como melhor prática, o primeiro parâmetro, id, deve ser algo que permita que o mecanismo seja facilmente conectado ao usuário associado, de preferência o nome principal de segurança.
Implementação: adicionar um mecanismo de política
Para adicionar o mecanismo, voltaremos ao padrão futuro/promessa usado para carregar o perfil. Em vez de criar a promessa para mip::Profile
, usaremos mip::PolicyEngine
.
// Auto profile will be std::shared_ptr<mip::Profile>.
auto profile = profileFuture.get();
// Create the delegate
auto authDelegateImpl = std::make_shared<sample::auth::AuthDelegateImpl>(appInfo, userName, password);
// Create the PolicyEngine::Settings object.
PolicyEngine::Settings engineSettings("UniqueID", authDelegateImpl, "");
// Create a promise for std::shared_ptr<mip::PolicyEngine>.
auto enginePromise = std::make_shared<std::promise<std::shared_ptr<mip::PolicyEngine>>>();
// Instantiate the future from the promise.
auto engineFuture = enginePromise->get_future();
// Add the engine using AddEngineAsync, passing in the engine settings and the promise.
profile->AddEngineAsync(engineSettings, enginePromise);
// Get the future value and store in std::shared_ptr<mip::PolicyEngine>.
auto engine = engineFuture.get();
O resultado final do código acima é que adicionamos com êxito ao perfil um mecanismo para o usuário autenticado.
Implementação: listar rótulos de confidencialidade
Com o uso do mecanismo adicionado, agora é possível listar todos os rótulos de confidencialidade disponíveis ao usuário autenticado chamando engine->ListSensitivityLabels()
.
ListSensitivityLabels()
buscará a lista de rótulos e atributos desses rótulos para um usuário específico no serviço. O resultado é armazenado em um vetor de std::shared_ptr<mip::Label>
.
Implementação: ListSensitivityLabels()
std::vector<shared_ptr<mip::Label>> labels = engine->ListSensitivityLabels();
Implementação: imprimir os rótulos
//Iterate through all labels in the vector
for (const auto& label : labels) {
//print the label name
cout << label->GetName() << endl;
//Iterate through all child labels
for (const auto& child : label->GetChildren()) {
//Print the label with some formatting
cout << "-> " << child->GetName() << endl;
}
}
A impressão dos nomes é uma maneira fácil de mostrar que retiramos com êxito a política do serviço e conseguimos obter os rótulos. Para aplicar o rótulo, é necessário o identificador de rótulo. A modificação do trecho acima para retornar a ID do rótulo resulta em:
for (const auto& label : labels) {
//Print label name and GUID
cout << label->GetName() << " : " << label->GetId() << endl;
//Print child label name and GUID
for (const auto& child : label->GetChildren()) {
cout << "-> " << child->GetName() << " : " << child->GetId() << endl;
}
}
A coleção de mip::Label
retornados por ListSensitivityLabels()
pode ser usada para exibir todos os rótulos disponíveis para o usuário e, em seguida, quando selecionado, use a ID para aplicar rótulos a um arquivo.