사용자 계정 컨트롤

사용자 계정 컨트롤 (User Account Control, UAC)은 마이크로소프트의 윈도우 비스타 운영 체제에서 처음 선보인 보안 기술이다. 윈도우 서버 2008과 윈도우 7에도 도입되었다. 관리자가 권한 수준을 높이는 것을 허용할 때까지 응용 프로그램들은 표준 사용자 권한으로 제한을 둠에 따라 운영 체제의 보안을 개선하는 데 중점을 두었다.
사용자 계정 컨트롤을 가지고 사용자는 관리자 권한을 얻을 수 있지만 사용자가 실행하는 응용 프로그램은 사용자가 더 높은 수준의 권한을 미리 승인하지 않는 한 그러한 권한을 얻을 수 없다. 사용자 계정 컨트롤은 사용자 인터페이스 권한 분리를 사용하여 관리자와 비관리자의 작업을 따로 떼어 놓는다. 한 예로 인터넷 익스플로러 7에서 선보인 "보호 모드"를 들 수 있다.
UAC는 사용자에게 추가적인 권한을 자동으로 확인할 수도 있지만, 사용자가 직접 프로그램 아이콘에서 마우스 오른쪽 단추를 누르고 "관리자 권한으로 실행"을 눌러도 효과는 같다.

역사

마이크로소프트의 가정용 운영 체제(윈도우 95, 윈도우 98, 윈도우 Me와 같은)들은 같은 컴퓨터에 각기 다른 사용자 계정을 사용한다는 개념이 없었고 모든 동작은 슈퍼 사용자의 권한으로 수행되었다.  윈도우 NT는 여러 개의 사용자 계정을 도입하였으나 실제로 대부분의 사용자들은 그들의 일상적인 작업을 위해 슈퍼 사용자 관리자로 운영하기 시작했다. 그뿐 아니라 수많은 응용 프로그램들은 컴퓨터를 사용하는 사람이 슈퍼 사용자인 것으로 판단하며 슈퍼 사용자가 아닐 경우 단순히 동작하지 않는다.
차후에 나온 윈도우와 마이크로소프트 응용 프로그램들은 관리자 권한이 없는 사용자 로그인을 사용할 것을 장려해 왔으나 이에 대한 진전은 느리게 진행되고 있다. 이를 위해 사용자 계정 컨트롤이 비스타에 도입되었지만 기존의 응용 프로그램들을 무너뜨리지 않고 새로운 보안 기능들을 도입하는 데 어려움이 있다.
비스타를 표준 사용자로 로그인할 때 로그온 세션이 만들어지고 가장 기본적인 권한만 보유하고 있는 토큰만이 할당된다. 이런 식으로 새로운 로그온 세션은 전체 시스템에 영향을 미칠 수 있는 사항들을 변경하지 못한다. 관리자 그룹에 있는 사용자로 로그인할 때 두 개의 별도의 토큰이 할당된다. 첫 토큰은 관리자에게 일반적으로 제공되는 모든 권한을 담고 있고 두 번째 토큰은 표준 사용자가 받는 것과 비슷한 제한된 토큰이다. 윈도우 셸을 비롯한 사용자 응용 프로그램들은 제한된 토큰을 가지고 시작하므로 결과적으로 관리자 계정을 사용한다 해도 제한된 권한 환경을 사용하게 된다. 응용 프로그램이 더 높은 권한을 요청하거나 "관리자 권한으로 실행"을 클릭할 때 사용자 계정 컨트롤은 확인 절차를 묻고 사용자가 동의하면 제한되지 않는 토큰을 사용하여 프로세스를 시작하게 된다.
윈도우 7에서 마이크로소프트는 여러 방향으로 UAC를 업데이트하고 있다. 기본적으로 UAC는 프로그램이 상승된 허가 권한을 요구하는 변경을 시도할 때에만 확인 절차를 밟는다. 윈도우 설정을 변경한다고 해서 사용자 계정 컨트롤 확인 창을 띄우는 것은 아니다. 이렇게 사용자는 UAC의 빈도 설정을 제어판에서 쉽게 바꿀 수 있게 하고 있다.

권한 상승 요청

프로그램은 여러 방식 안에서 권한 상승을 요청할 수 있다. 프로그램 개발자들이 쓰는 방법들 가운데 하나는 requestedPrivileges 섹션을 manifest라는 XML 문서 안에 추가하는 것이다. 그럼으로써 응용 프로그램에 이 문서 내용이 추가된다. manifest는 시각 스타일, 독립성, 그리고 적절한 보안 구문을 지정할 수 있다. 이를 쉽게 도와주는 유틸리티가 있으며, 자세한 것은 "외부 링크"를 참조하라.
권한 상승을 요청하는 보안 구문은 다음과 같다:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3">
    <v3:security>
      <v3:requestedPrivileges>
        <v3:requestedExecutionLevel level="highestAvailable" />
      </v3:requestedPrivileges>
    </v3:security>
  </v3:trustInfo>
</assembly>
requestedExecutionLevel에 대한 수준 특성을 "asInvoker"로 설정하면 응용 프로그램을 시작하는 토큰(token)을 가지고 실행되게 만들며, "highestAvailable"는 UAC가 권한이 낮은 일반 사용자에게 관리자 권한 상승을 묻게 해 주며, "requireAdministrator"는 권한 상승을 요구하게 만든다. highestAvailiable, requireAdministrator 모드 두 곳에서, 확인 제공을 실패할 경우 프로그램이 실행되지 않게 된다. manifest 안의 "requireAdministrator"로 표시된 실행 파일은 CreateProcess()를 사용하여 비상승 프로세스에서 실행될 수 없다. 그 대신, ERROR_ELEVATION_REQUIRED라는 값으로 반환된다. ShellExecute() 또는 ShellExecuteEx()를 대신 사용하여야 한다. HWND가 제공되지 않는 경우, 대화 상자는 작업 표시줄 안에 깜박이는 항목으로 표시된다.
권한이 상승된 새로운 프로세스는 "runas"를 사용하는 닷넷 응용 프로그램 안에서 실행될 수 있다. C++/CLI를 사용한 예는 다음과 같다:
System::Diagnostics::Process^ proc = gcnew System::Diagnostics::Process();
proc->StartInfo->FileName = "C:\\Windows\\system32\\notepad.exe";
proc->StartInfo->Verb = "runas"; // Elevate the application
proc->Start();
네이티브 윈32 응용 프로그램의 경우, 같은 "runas"가 ShellExecute()나 ShellExecuteEx() 콜에 추가될 수 있다.
  ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);