Authz API를 사용하여 액세스 확인
애플리케이션은 AuthzAccessCheck 함수를 호출하여 보안 개체에 대한 액세스 권한을 부여할지 여부를 결정합니다.
AuthzAccessCheck 함수는 AUTHZ_ACCESS_REQUEST 및 SECURITY_DESCRIPTOR 구조를 매개 변수로 사용합니다. AUTHZ_ACCESS_REQUEST 구조는 요청된 액세스 수준을 지정합니다. AuthzAccessCheck 함수는 지정된 클라이언트 컨텍스트에 대해 지정된 SECURITY_DESCRIPTOR 대해 요청된 액세스를 평가합니다. 보안 설명자가 개체에 대한 액세스를 제어하는 방법에 대한 자세한 내용은 DACLs가 개체에 대한 액세스를 제어하는 방법을 참조하세요.
특성 변수는 논리 연산자에서 사용되는 경우 식 형식이어야 합니다. 그렇지 않으면 알 수 없음으로 평가됩니다.
Callback 함수
검사할 개체의 SECURITY_DESCRIPTOR DACL(임의 액세스 제어 목록)에 ACE(콜백 액세스 제어 항목)가 포함된 경우 AuthzAccessCheck는 DACL에 포함된 각 콜백 ACE에 대해 AuthzAccessCheckCallback 함수를 호출합니다. 콜백 ACE는 ACE 형식에 "콜백"이라는 단어가 포함된 ACE 구조체입니다. AuthzAccessCheckCallback 함수는 AuthzInitializeResourceManager 함수를 호출하여 리소스 관리자가 초기화될 때 등록해야 하는 애플리케이션 정의 함수입니다.
콜백 함수를 사용하면 애플리케이션이 런타임에 평가할 비즈니스 논리를 정의할 수 있습니다. AuthzAccessCheckCallback 함수가 호출되면 호출을 발생시킨 콜백 ACE가 평가를 위해 콜백 함수에 전달됩니다. 애플리케이션 정의 논리가 TRUE로 평가되면 콜백 ACE가 액세스 검사 포함됩니다. 그렇지 않은 경우 이 설정은 무시됩니다.
액세스 결과 캐싱
액세스 검사 결과는 AuthzCachedAccessCheck 함수에 대한 이후 호출에서 캐시되고 사용될 수 있습니다. 예제를 포함하여 액세스 검사를 캐싱하는 방법에 대한 자세한 내용은 액세스 검사 캐싱을 참조하세요.
예제
다음 예제에서는 기본 제공 관리자에 대한 READ_CONTROL 액세스를 허용하는 SECURITY_DESCRIPTOR 만듭니다. 이 보안 설명자를 사용하여 클라이언트 컨텍스트 초기화 예제에서 만든 클라이언트 컨텍스트에 지정된 클라이언트에 대한 액세스를 검사.
BOOL CheckAccess(AUTHZ_CLIENT_CONTEXT_HANDLE hClientContext)
{
#define MY_MAX 4096
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
ULONG cbSecurityDescriptorSize = 0;
AUTHZ_ACCESS_REQUEST Request;
CHAR ReplyBuffer[MY_MAX];
PAUTHZ_ACCESS_REPLY pReply = (PAUTHZ_ACCESS_REPLY)ReplyBuffer;
DWORD AuthzError =0;
//Allocate memory for the access request structure.
RtlZeroMemory(&Request, sizeof(AUTHZ_ACCESS_REQUEST));
//Set up the access request structure.
Request.DesiredAccess = READ_CONTROL;
//Allocate memory for the access reply structure.
RtlZeroMemory(ReplyBuffer, MY_MAX);
//Set up the access reply structure.
pReply->ResultListLength = 1;
pReply->Error = (PDWORD) ((PCHAR) pReply + sizeof(AUTHZ_ACCESS_REPLY));
pReply->GrantedAccessMask = (PACCESS_MASK) (pReply->Error + pReply->ResultListLength);
pReply->SaclEvaluationResults = NULL;
//Create security descriptor.
if(!ConvertStringSecurityDescriptorToSecurityDescriptor(
L"O:LAG:BAD:(A;;RC;;;BA)",
SDDL_REVISION_1,
&pSecurityDescriptor,
NULL))
{
printf_s("ConvertStringSecurityDescriptorToSecurityDescriptor failed with %d\n", GetLastError());
return FALSE;
}
//Call AuthzAccessCheck.
if(!AuthzAccessCheck(
0,
hClientContext,
&Request,
NULL,
pSecurityDescriptor,
NULL,
0,
pReply,
NULL))
{
printf_s("AuthzAccessCheck failed with %d\n", GetLastError());
LocalFree(pSecurityDescriptor);
return FALSE;
}
//Print results.
if(*pReply->GrantedAccessMask & READ_CONTROL)
{
printf_s("Access granted.\n");
}
else
{
printf_s("Access denied.\n");
}
LocalFree(pSecurityDescriptor);
return TRUE;
}
관련 항목