Поделиться через


Настройка уровня безопасности процесса по умолчанию с помощью C++

При первом входе клиентского приложения в инструментарий управления Windows (WMI) необходимо задать уровень безопасности процесса по умолчанию с вызовом CoInitializeSecurity. COM использует сведения в вызове, чтобы определить, какой уровень безопасности должен иметь другой процесс для доступа к процессу клиентского приложения.

В этом разделе рассматриваются следующие разделы:

Для большинства клиентских приложений аргументы, показанные в следующем примере, задают безопасность по умолчанию для WMI.

HRESULT hr = NULL;
hr = CoInitializeSecurity(
        NULL,                       // security descriptor
       -1,                          // use this simple setting
       NULL,                        // use this simple setting
       NULL,                        // reserved
       RPC_C_AUTHN_LEVEL_DEFAULT,   // authentication level  
       RPC_C_IMP_LEVEL_IMPERSONATE, // impersonation level
       NULL,                        // use this simple setting
       EOAC_NONE,                   // no special capabilities
       NULL);                          // reserved

if (FAILED(hr))
{
  CoUninitialize();
  cout << "Failed to initialize security. Error code = 0x"
       << hex << hr << endl;
  return;
}

Для правильной компиляции кода требуются следующие ссылки и инструкции #include.

#define _WIN32_DCOM
#include <iostream>
using namespace std;
#include <Wbemidl.h>

#pragma comment(lib, "wbemuuid.lib")

Установка уровня проверки подлинности на RPC_C_AUTHN_LEVEL_DEFAULT позволяет DCOM согласовывать уровень проверки подлинности для соответствия требованиям безопасности целевого компьютера. Дополнительные сведения см. в статьях Изменение учетных данных проверки подлинности по умолчанию с помощью C++ и Изменение параметров олицетворения по умолчанию с помощью C++.

Изменение учетных данных проверки подлинности по умолчанию с помощью C++

Учетные данные проверки подлинности по умолчанию работают в большинстве ситуаций, но в разных ситуациях может потребоваться использовать разные учетные данные проверки подлинности. Например, может потребоваться добавить шифрование в процедуры проверки подлинности.

В следующей таблице перечислены и описаны различные уровни проверки подлинности.

Уровень проверки подлинности Описание
RPC_C_AUTHN_LEVEL_DEFAULT Проверка подлинности по умолчанию.
RPC_C_AUTHN_LEVEL_NONE Проверка подлинности отсутствует.
RPC_C_AUTHN_LEVEL_CONNECT Проверка подлинности только в том случае, если клиент создает связь с сервером.
RPC_C_AUTHN_LEVEL_CALL Проверка подлинности каждый раз, когда сервер получает RPC.
RPC_C_AUTHN_LEVEL_PKT Проверка подлинности каждый раз, когда сервер получает данные от клиента.
RPC_C_AUTHN_LEVEL_PKT_INTEGRITY Проверка подлинности, подтверждающая, что данные из пакета не были изменены.
RPC_C_AUTHN_LEVEL_PKT_PRIVACY Включает все предыдущие уровни проверки подлинности и шифрует значение каждого вызова RPC.

 

Вы можете указать учетные данные аутентификации по умолчанию для нескольких пользователей, используя структуру SOLE_AUTHENTICATION_LIST в параметре pAuthList функции CoInitializeSecurity.

В следующем примере кода показано, как изменить учетные данные проверки подлинности.

// Auth Identity structure
SEC_WINNT_AUTH_IDENTITY_W        authidentity;
SecureZeroMemory( &authidentity, sizeof(authidentity) );

authidentity.User = L"MyUser";
authidentity.UserLength = wcslen( authidentity.User );
authidentity.Domain = L"MyDomain ";
authidentity.DomainLength = wcslen( authidentity.Domain );
authidentity.Password = L"";
authidentity.PasswordLength = wcslen( authidentity.Password );
authidentity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE;

SecureZeroMemory( authninfo, sizeof(SOLE_AUTHENTICATION_INFO)*2 );

// NTLM Settings
authninfo[0].dwAuthnSvc = RPC_C_AUTHN_WINNT;
authninfo[0].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authninfo[0].pAuthInfo = &authidentity;

// Kerberos Settings
authninfo[1].dwAuthnSvc = RPC_C_AUTHN_GSS_KERBEROS ;
authninfo[1].dwAuthzSvc = RPC_C_AUTHZ_NONE;
authninfo[1].pAuthInfo = &authidentity;

SOLE_AUTHENTICATION_LIST    authentlist;

authentlist.cAuthInfo = 2;
authentlist.aAuthInfo = authninfo;

CoInitializeSecurity( 
  NULL, 
  -1, 
  NULL, 
  NULL, 
  RPC_C_AUTHN_LEVEL_CALL, 
  RPC_C_IMP_LEVEL_IMPERSONATE,
  &authentlist, 
  EOAC_NONE,
  NULL);

Изменение уровней олицетворения по умолчанию с помощью C++

COM предоставляет уровни безопасности по умолчанию, прочитанные из системного реестра. Однако, если они не были специально изменены, параметры реестра задают слишком низкий уровень олицетворения для функционирования WMI. Как правило, уровень олицетворения по умолчанию — это RPC_C_IMP_LEVEL_IDENTIFY, но для работы с большинством поставщиков WMI нужен по крайней мере RPC_C_IMP_LEVEL_IMPERSONATE, и может возникнуть ситуация, когда необходимо задать более высокий уровень олицетворения. Дополнительные сведения см. в подключении к WMI на удаленном компьютере. В следующей таблице перечислены различные уровни олицетворения.

Уровень Описание
RPC_C_IMP_LEVEL_DEFAULT Операционная система выбирает уровень олицетворения.
RPC_C_IMP_LEVEL_ANONYMOUS Сервер может олицетворить клиента, но маркер олицетворения не может использоваться для чего-либо.
RPC_C_IMP_LEVEL_IDENTIFY Сервер может получить удостоверение личности клиента и олицетворить клиента для проверки ACL.
RPC_C_IMP_LEVEL_IMPERSONATE Сервер может олицетворить клиент в пределах одного компьютера.
уровень делегирования RPC_C_IMP_LEVEL_DELEGATE Сервер может олицетворить клиента через несколько границ и выполнять вызовы от имени клиента.