다음 문서는 IIS 6 에 해당되는 내용으로, CGI/ISAPI 실행시 나타날 수 있는 사항입니다.
현상
IIS에서 CGI 응용 프로그램을 실행하려고 하면 다음과 같은 메시지가 나타납니다.
액세스가 거부되었습니다.
원인
이 문제는 익명 계정에 CGI에 대한 권한이 없는 경우 발생합니다. CGI 응용 프로그램을 시작하려고 하면 IIS에서는 익명 사용자를 사용합니다. 익명 계정에 해당 파일에 대한 권한이 없기 때문에 프로세스 실행이 실패하고 STDOUT을 통해 오류 메시지가 반환됩니다.
그러나 IIS에서는 프로세스가 정상적으로 실행되고 종료된 것으로 인식합니다. 액세스 거부 오류 메시지가 STDOUT에 있기 때문에 IIS에서는 프로세스 실패를 인식할 방법이 없습니다.
익명 계정이 프로세스를 시작할 수 있었기 때문에 다른 인증 방법을 시도하지 않습니다. IIS에서는 CreateProcessAsUser API 호출을 사용하여 CGI 응용 프로그램을 시작합니다. 사용자에게 CGI/ISAPI 응용 프로그램에 대한 NTFS 권한이 없는 경우 CreateProcessAsUser는 정상적으로 종료됩니다.
해결
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ W3SVC\Parameters
W3SVC/Parameters 아래에 CreateProcessAsUser 값을 REG_DWORD로 추가하고 값을 0으로 지정합니다. 이렇게 하면 CGI가 CreateProcess API를 통해 시스템 컨텍스트에서 실행됩니다.
이 경우 CGI 스크립트의 시스템 액세스 권한이 보통 때보다 훨씬 커지기 때문에 심각한 보안 문제를 일으킬 수 있습니다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ W3SVC\Parameters
W3SVC/Parameters 아래에 CreateProcessAsUser 값을 REG_DWORD로 추가하고 값을 0으로 지정합니다. 이렇게 하면 CGI가 CreateProcess API를 통해 시스템 컨텍스트에서 실행됩니다.
이 경우 CGI 스크립트의 시스템 액세스 권한이 보통 때보다 훨씬 커지기 때문에 심각한 보안 문제를 일으킬 수 있습니다.
--> 위 적용에 대해서, 절대 추천하지 않습니다. 왜나면, 일반적으로 웹사이트 실행은 최소 권한인 IUSER 계정으로 접근을 하는데 위와 같이 값을 변경하게 되면 SYSTEM 권한으로 실행이 되므로 익명의 사용자가 서버 전체에 접근할수 있는 권한을 가지게 되는 것이죠..
이와 비슷한 예로, Windows 2000 서버에서 ASP.NET 실행시 잘 안되는 경우가 있다는 질문이 여러 게시판에 올라오는데요. 그 답변이 대부분 machine.config 에서 실행계정은 "system" 으로 변경하라고 제시를 해줍니다. 이 또한 위와 같이 system 권한으로 ASP.NET 웹사이트를 실행하므로 매우 위험한 답변을 제시해 주고 있는 것입니다.
웹개발자는, 서버보안에 상관없이 당장 제작된 웹프로그램 실행이 중요하기 때문에 이런 사항에 대해서는 서버운영자가 필히 적절한 조치 및 방향을 제시해 주어야 하는게 좋겠죠.^^