Настройка уровня безопасности процесса по умолчанию с помощью C++
При первом входе клиентского приложения в инструментарий управления Windows (WMI) необходимо задать уровень безопасности процесса по умолчанию с вызовом CoInitializeSecurity. COM использует сведения в вызове, чтобы определить, какой уровень безопасности должен иметь другой процесс для доступа к процессу клиентского приложения.
В этом разделе рассматриваются следующие разделы:
- Изменение учетных данных аутентификации по умолчанию с помощью C++
- изменение уровней олицетворения по умолчанию с помощью C++
Для большинства клиентских приложений аргументы, показанные в следующем примере, задают безопасность по умолчанию для 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 | Сервер может олицетворить клиента через несколько границ и выполнять вызовы от имени клиента. |