ASP.NET 일반적인 권한 및 보안 관련 문제 해결

이 문서에서는 ASP.NET 일반적인 권한 및 보안 관련 문제를 해결하는 방법을 소개합니다.

원래 제품 버전: ASP.NET
원래 KB 번호: 910449

유용한 도구

손상된 문제를 해결하기 전에 문제를 좁히는 데 도움이 되는 몇 가지 도구를 숙지해야 합니다. 이 경우 FileMon, RegMon 및 보안 감사와 같은 도구에 관심이 있습니다. FileMon에 대한 자세한 내용은 Windows v7.04용 FileMon을 참조하세요.

RegMon에 대한 자세한 내용은 Windows Sysinternals를 참조하세요.

드릴다운하여 문제 격리

  • 애플리케이션이 작동했나요? 그렇다면 애플리케이션이 중단되었을 수 있는 변경된 내용은 무엇인가요? 소프트웨어 업데이트 또는 보안 업데이트가 서버에 적용되었을 수 있습니다. 코드 롤아웃으로 인해 문제가 발생할 수도 있습니다.
  • 간단한 .html 및 .asp 페이지는 IIS에서 제공합니까?
  • 애플리케이션이 다른 버전의 IIS로 마이그레이션되었나요?
  • 서버의 다른 ASP.NET 애플리케이션이 동일한 오류로 실패합니까? 이것이 실패한 유일한 애플리케이션인가요?
  • 모든 사용자 또는 특정 사용자에 대해서만 문제가 발생하나요?
  • 웹 서버에서 로컬로 검색하는 동안 문제를 재현할 수 있나요, 아니면 소수의 클라이언트만 재현할 수 있나요?
  • 가장을 사용하는 경우 가장된 사용자에게 리소스에 필요한 액세스 권한이 있나요?

위의 질문은 문제를 진단하는 데 유용합니다. ASP.NET 포럼에 문제를 게시하는 경우 이러한 질문의 대부분에 대한 답변이 이미 있는 경우 문제에 대한 빠른 포인터 또는 해결 방법을 얻을 수 있습니다. 키는 해당하는 경우 전체 ASP.NET 스택 추적 오류를 게시하는 것입니다. "ASP.NET 애플리케이션을 실행하는 동안 액세스 거부 오류가 발생합니다. 누구라도 도와줄 수 있을까요?" 사용자가 스택 추적을 보고 전체 오류 메시지가 표시되면 포인터를 제공하는 것이 훨씬 쉽습니다. 그래서 당신은 자신에게 물어봐야합니다 ...

고객에게 표시된 오류 메시지는 무엇인가요?

고객에게 가장 먼저 묻는 질문은 "정확한 오류 메시지는 무엇인가요?"입니다. Microsoft .NET Framework 발생한 오류 메시지에 대한 명확한 설명이 있는 경우 이 섹션을 건너뛸 수 있습니다. 애플리케이션이 실제 오류 메시지를 마스킹하고 대신 "예기치 않은 오류가 발생했습니다. 자세한 내용은 웹 사이트 관리자에게 문의하세요." 누구에게도 별로 사용되지 않습니다. 다음은 실제 오류 메시지를 가져오는 데 도움이 되는 몇 가지 단계입니다.

  • 애플리케이션 디렉터리에서 Web.config 파일을 찾아 열고 customErrors 를 mode="Off"로 변경합니다. 파일을 저장하고 문제를 재현합니다.

  • 애플리케이션 개발자가 수행한 사용자 지정 이벤트/오류 처리로 인해 위의 단계를 수행한 후에도 실제 오류 메시지가 표시되지 않을 수 있습니다. Global.asax 파일에서 Application_Error 이벤트를 찾아 함수를 사용하여 Server.Transfer("Errors.aspx") 사용자 지정 오류 페이지로 이동하는 코드를 주석 처리할 수 있습니다.

    //Global.asax 
    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs 
        //Server.Transfer("Errors.aspx"); 
    }
    

실제 오류 메시지가 표시되면 읽어 로컬 리소스 또는 ASP.NET 애플리케이션이 액세스하려는 원격 리소스에 대한 권한이 누락되어 오류가 발생하는지 확인합니다.

개발자에게 문의하여 실제 오류 메시지를 보는 방법을 알아볼 수 있습니다. 개발자가 파일에 로그온하거나 전자 메일 알림을 받을 수 있습니다. 항상 변경하려는 파일을 백업해야 합니다. 사용 가능한 백업을 사용하면 언제든지 변경 내용을 롤백할 수 있습니다.

ASP.NET 애플리케이션이 액세스하려고 하는 로컬 리소스에 대한 권한이 누락되어 문제가 발생합니다.

사용자 지정 오류 메시지로 인해 문제에 대한 명확한 설명을 얻을 수 없는 경우 FileMon을 실행하고 문제를 재현합니다. 캡처를 중지하고 FileMon.xls 저장하고 Microsoft Excel에서 파일을 엽니다. 데이터 메뉴에서 필터를 클릭한 다음 자동 필터를 클릭하여 Excel의 필터링 기능을 사용합니다. 이제 열 F 에서 드롭다운 목록을 선택하고 "ACCESS DENIED" 오류를 찾습니다.

샘플 FileMon 출력은 다음과 같습니다.

10381 1:01:11 PM w3wp.exe:2320 OPEN C:\winnt\microsoft.net\framework\v1.1.4322\Temporary ASP.NET Files\sessiontest\8832e585\275ec327\global.asax.xml 
ACCESS DENIED NT 
AUTHORITY\NETWORK SERVICE

필터링된 결과에서 볼 수 있듯이 문제의 원인을 좁혀 보았습니다. FileMon은 NT AUTHORITY\NETWORK SERVICE 계정에 폴더에 대한 NTFS 권한이 없음을 C:\Winnt\Microsoft.net\Framework\v1.1.4322\Temporary ASP.NET Files 보여 줍니다. 이 문제를 해결하려면 바로 앞으로 나아가야 합니다.

ASP.NET 프로세스 계정을 관리 계정으로 변경하여 문제를 해결하는지 확인하는 것이 좋습니다. IIS 6.0 이상 버전에서는 IIS AppPool ID를 "로컬 시스템"으로 변경하여 애플리케이션이 작동하는지 확인합니다.

참고

이는 솔루션으로만 사용되는 것이 아니라 문제 해결 단계로만 사용되어야 합니다.

대부분의 사람들은 Microsoft .NET Framework 다시 설치하거나 운영 체제를 다시 설치하는 정도까지 이동하는 경향이 있습니다. 이는 권장되는 문제 해결 단계가 아니며 문제가 다시 발생하지 않도록 보장하지는 않습니다. 나는 하나의 예를 제공 할 것입니다. 간헐적인 문제는 종종 격리하고 문제를 해결하기 어렵습니다. 이 시나리오에서 고객의 애플리케이션은 몇 시간 동안 제대로 작동한 다음 갑자기 아래 오류로 실패합니다. 고객은 이미 운영 체제뿐만 아니라 .NET Framework 다시 설치하려고 했습니다. 이것은 며칠 동안 문제를 해결하는 것처럼 보였지만 다시 나타났습니다.

FileMon을 실행해도 액세스 거부 오류가 표시되지 않았습니다. ASPNET 계정에 필요한 모든 권한이 준비되었습니다. 문제에서 복구하는 유일한 방법은 상자를 다시 부팅하는 것입니다. IIS 재설정조차도 도움이 되지 않습니다. "아, Microsoft Software는 복구하려면 항상 재부팅이 필요합니까?" 하고 생각하고 있습니다. 글쎄, 당신은 틀렸다!

여기서 핵심은 오류 메시지를 자세히 살펴보는 것입니다. 오류는 일반적인 ACCESS DENIED 오류가 아니라 "쓰기 위해 파일을 열 수 없습니다"라고 명확하게 표시되므로 파일이나 폴더에 대한 잠금을 유지하고 ASP.NET 쓰기를 허용하지 않는 다른 프로세스라고 생각합니다. 다시 부팅이 다른 프로세스를 죽이고 불량 프로세스가 파일을 다시 잠기기 전까지 ASP.NET 애플리케이션이 다시 작동하기 시작하는 것이 합리적입니다. 논리적인 작업은 모든 바이러스 백신 프로그램, 타사 스파이웨어 또는 서버에서 실행되는 다른 파일 모니터링 소프트웨어를 끄는 것입니다. 특정 타사 소프트웨어를 지적하고 싶지 않습니다. 그러나 일반적으로 바이러스 백신 소프트웨어는 IIS 및 ASP.NET 애플리케이션에 많은 슬픔을 일으키는 것으로 알려져 있습니다. 바이러스 백신 소프트웨어로 인한 또 다른 알려진 문제는 Bin 폴더 또는 .config 파일을 터치할 때 AppDomain 재활용으로 인한 세션 손실입니다.

타사 서비스를 끄는 가장 쉬운 방법은 다음과 같습니다.

  1. 시작을 클릭하고 실행을 클릭한 다음 msconfig를 입력합니다.
  2. 서비스를 선택하고 모든 Microsoft 서비스 숨기기를 검사.
  3. 모두 사용 안 함을 클릭하여 타사 서비스를 중지합니다.
  4. 시작을 클릭하고 실행을 클릭한 다음 iisreset을 입력하여 CLR을 작업자 프로세스로 다시 로드합니다.

애플리케이션을 모니터링하여 문제가 다시 발생하는지 확인합니다. 여러 바이러스 백신 프로그램을 실행하는 경우 평가판 및 오류 메서드를 사용하여 문제를 일으키는 특정 프로그램을 확인합니다.

참고

동일한 오류가 100% 재현 가능한 경우 바이러스 백신 소프트웨어가 원인이 아닐 수 있습니다. 이 오류의 다른 원인이 있을 수 있습니다. 간단한 ASP.NET 테스트 애플리케이션을 만들어 Test.aspx 페이지에 대해 동일한 오류가 발생하는지 여부를 격리해 보세요. 이 경우 ACL(필수 Access Control Lists)이 모두 ASP.NET 적합한지 확인합니다.

ASP.NET ACL(필수 Access Control Lists)을 참조하세요.

폴더는 %SystemRoot%\Assembly 전역 어셈블리 캐시입니다. Windows Explorer 직접 사용하여 이 폴더의 ACL을 편집할 수 없습니다.

대신 명령 프롬프트를 사용하고 다음 명령을 실행합니다.

cacls %windir%\assembly /e /t /p domain\useraccount:r

또는 Windows Explorer 사용하기 전에 다음 명령으로 Shfusion.dll 등록을 취소하여 GUI를 통해 권한을 부여합니다.

C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32-u shfusion.dll

Windows Explorer 사용 권한을 설정한 후 다음 명령을 사용하여 Shfusion.dll 다시 등록합니다.

C:\WINDOWS\Microsoft.NET\Framework\VersionNumber>regsvr32 shfusion.dll

ASP.NET 애플리케이션이 액세스하려는 원격 리소스에 대한 권한이 누락되어 문제가 발생합니다.

ASP.NET 애플리케이션이 Microsoft SQL Server 또는 UNC(유니버설 명명 규칙) 공유와 같은 원격 리소스에 액세스하는 경우 많은 문제가 발생할 수 있습니다. 또한 원격 리소스에서 많은 항목이 잘못 설정될 수 있습니다. 리소스가 작동하려면 이러한 문제를 해결해야 합니다.

첫 번째 단계는 Windows Explorer 통해 원격 서버에 연결할 수 있는지 확인하는 것입니다.

  1. 원격 서버에서 Test라는 폴더를 만듭니다. 테스트 폴더의 공유보안 탭에서 도메인/계정 및 ASP.NET 애플리케이션에서 사용하는 프로세스 계정을 추가하고 모두 모든 권한을 부여합니다.

  2. IIS 서버에서 도메인/계정으로 로그인하고 시작을 클릭하고 실행을 클릭한 다음 원격 서버 \\RemoteServerName*\Test의 UNC 공유 경로를 입력합니다.

    이 폴더에 액세스할 수 없는 경우 네트워크 관리자에게 문의하여 이 문제를 해결합니다. 그런 다음에만 ASP.NET 애플리케이션이 공유에 액세스할 수 있습니다.

  3. 아래 코드를 사용하여 CreateUNCFile.aspx 라는 파일을 만들고 애플리케이션 디렉터리에 파일을 저장합니다.

    <%@ Page Language="vb" %>
    <%@ Import Namespace="System.IO" %>
    <html>
    <head>
    <title>Writing to a Text File</title>
    <script runat="server">
        Sub WriteToFile(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim fp As StreamWriter
                fp = File.CreateText("\\<RemoteServerName>\Test\" & "test.txt")
                fp.WriteLine(txtMyFile.Text)
                lblStatus.Text = "The File Successfully created! Your ASP.NET process is able to access this remote share"
                fp.Close()
        End Sub
    </script>
    
    </head>
    <body style="font: 10pt verdana">
                <h3 align="center">Creating a Text File in ASP.NET</h3>
        <form id="Form1" method="post" runat="server">
                            Type your text:
                            <asp:TextBox ID="txtMyFile" TextMode="MultiLine" Rows="10" Columns="60" Runat="server" /><br>
                            <asp:button ID="btnSubmit" Text="Create File" OnClick="WriteToFile" Runat="server" />
                            <asp:Label ID="lblStatus" Font-Bold="True" ForeColor="#ff0000" Runat="server" />
        </form>
    </body>
    </html> 
    
  4. 다음 코드 줄에서 RemoteServerName>을 수정<해야 합니다.

    fp = File.CreateText("\\<RemoteServerName>\Test\" &"test.txt")
    

    원격 서버의 이름을 반영합니다.

  5. Windows 인터넷 Explorer 열고 IIS 서버 이외의 클라이언트 컴퓨터에서 찾 http://**IISServerName**/**AppName**/CreateUNCFile.aspx 습니다.

  6. Test.txt 파일이 성공적으로 만들어지면 ASP.NET 애플리케이션이 원격 리소스에 인증할 수 있습니다.

  7. 인터넷 Explorer 클라이언트 브라우저에서 파일 만들기가 실패하지만 IIS 서버 자체에서 동일한 페이지로 이동하면 작동하는 경우 "이중 홉" 시나리오가 실행 중일 가능성이 높습니다. 사용자 지정 기본 제공 웹 파트를 사용하여 사용자 인증 및 권한 부여가 필요한 원격 리소스에 액세스하는 경우 "이중 홉" 문제가 발생할 수 있습니다. 원격 리소스에 액세스하려면 리소스의 출력이 최종 사용자에게 액세스 권한이 있는 데이터로 제한되도록 최종 사용자의 자격 증명을 리소스에 제공해야 할 수 있습니다.

위의 단계에서는 IIS에서 NTLM 인증이 켜져 있다고 가정합니다. 기본 인증은 Kerberos를 사용하지 않습니다.

자세한 내용은 인터넷 Explorer Kerberos 오류 문제 해결을 참조하세요.

IIS 인증 방법에 대한 자세한 내용은 Visual Studio 2003 사용 중지 기술 설명서를 참조하세요.

원격 UNC 공유에 연결할 수 있지만 ASP.NET 애플리케이션에서 SQL Server 실행 중인 원격 서버에 연결할 수 없는 경우 SQL Server 대한 SPN(서비스 사용자 이름)을 검사 설정해야 할 수 있습니다. IIS에서 애플리케이션에 대해 기본 인증만 사용하도록 설정하고 SQL Server 실행 중인 원격 서버에 연결할 수 있는지 확인합니다.

"서버 애플리케이션을 사용할 수 없음" 오류 메시지에 대한 여러 가지 다른 원인이 있습니다. 이벤트 로그는 문제의 원인에 대한 자세한 정보를 얻는 것이 가장 좋습니다.

IIS 로그는 IIS 인증 관련 오류의 경우에 유용합니다.

이 특정 오류에 대한 상태 및 하위 상태 코드를 찾아야 합니다.

2006-10-12 22:47:28 W3SVC1 65.52.18.230 GET /MyAPP/login.aspx - 80  
MyDomain\UserID_91 65.52.22.58 Mozilla/4.0+  
(compatible;+MSIE+6.0;+Windows+NT+5.2;+SV1;+.NET+CLR+1.1.4322;+.NET+CLR+2.0.50727;+InfoPath.1) 401 3 5

"리소스의 ACL로 인해 권한이 없음"을 나타내는 하위 통계 3이 있는 401이 표시됩니다.

이는 파일 또는 폴더에 대한 NTFS 권한이 없음을 나타냅니다. 이 오류는 액세스하려는 파일에 대한 권한이 올바른 경우에도 발생할 수 있지만 다른 SYSTEM 및 IIS 폴더에는 기본 권한 및 사용자 권한이 누락될 수 있습니다. 예를 들어 IUSR_ComputerName 계정에 C:\Winnt\System32\Inetsrv 디렉터리에 대한 액세스 권한이 없는 경우 이 오류가 표시 될 수 있습니다.

시작을 클릭하고 실행을 클릭한 다음 로그 파일을 입력하여 IIS 로그가 포함된 폴더를 엽니다. 또는 IIS의 웹 사이트에 대한 속성 페이지에서 WebSiteName 탭을 클릭하고 활성 로그 형식에서 속성을 클릭하여 로그 파일 디렉터리와 이름을 확인합니다.

여기서 관심 있는 또 다른 점은 상태 코드 5입니다. net helpmsg 명령을 사용하여 이 상태 코드에 대한 자세한 정보를 얻을 수 있습니다.

C:\Documents and Settings\User> net helpmsg 5

액세스가 거부되었습니다.

또 다른 일반적인 상태 코드인 코드 50을 사용해 보겠습니다.

C:\Documents and Settings\User> net helpmsg 50

요청은 지원되지 않습니다.

다른 일반적인 악명 높은 "500 내부 서버 오류" 메시지가 표시될 때마다 친숙한 HTTP 오류 메시지를 사용하지 않도록 설정하여 오류에 대한 자세한 설명을 받는 것이 좋습니다. 이벤트 뷰어에도 추가 정보가 포함될 수 있으므로 이벤트 뷰어를 살펴보는 것을 잊지 마세요.

아이디어는 현재 문제에 대한 최대 세부 정보를 얻기 위해 사용할 수있는 모든 기록 된 정보를 사용하는 것입니다.

리소스

자세한 내용은 다음 항목을 참조하세요.