Visual Basic .NET 및 Visual C#.NET 프로그래머가 해결해야 할 안전 문제

12542 단어 .net
Visual Basic .NET 및 Visual C#.NET 프로그래머가 해결해야 할 안전 문제
Robin Reynolds-Haertle
Visual Studio Team
Microsoft Corporation
2002년 1월
요약: Visual Basic 에 대해 중점적으로 설명합니다.NET 및 Visual C#.NET 개발자가 사용하기 시작했습니다.NET 프레임워크에서 해결해야 할 주요 보안 문제이 개요는 Windows 응용 프로그램과 웹 응용 프로그램, 그리고 개발 과정의 실현, 디버깅과 배치 단계를 논의했다.
이 문서는 Visual Studio에 적용됩니다.NET 및.NET 프레임의 최종 버전입니다.만약 미리 발표된 버전을 사용한다면, 프로그램의 실행은 본고에서 논의한 것과 약간 다를 수 있습니다.
카탈로그
  • 간단한 소개
  • 코드 액세스 보안
  • 전적으로 신임하다
  • 부분적 신뢰
  • 일부 신뢰 환경의 개발
  • 테스트
  • 기타 자원
  • 웹 응용 프로그램
  • 동적 발견
  • 인증, 시뮬레이션 및 위임
  • ASPNET 프로세스 ID
  • ASPNET ID 아래 실행 시 파일 자원 보호
  • ASPNET ID를 사용하여 디버깅
  • Visual Studio .NET 개발 환경에서의 보안 메커니즘
  • 총결산
  • 간단한 소개
    이전 버전의 Visual Studio와 비교하여 Microsoft® Visual Studio® .NET는 어플리케이션 실행을 위한 보다 나은 보안 제어를 제공합니다.NET 프레임워크는 더 많은 제어를 제공할 뿐만 아니라 더 많은 프로그래밍 책임을 요구합니다.사용자를 위해 사용하기 쉬운 프로그램을 만들 때 보안 문제를 해결해야 합니다.
    일반적으로 다음 세 가지 상황에서 안전 문제를 해결해야 한다.
  • 프로그램을 실행하는 사용자는 프로그램이 실행되는 위치가 특정 시스템 자원에 대한 액세스를 거부하도록 지정되어 있기 때문에 이 프로그램의 권한을 거부할 수 있습니다.예를 들어 사용자는 공용 언어가 실행될 때 네트워크 드라이브에 저장된 모든 프로그램의 파일 권한을 거부할 수 있습니다.코드를 작성할 때 이 문제를 주의해야 하며, 이러한 거부에 대한 적절한 응답을 코드를 작성해야 합니다.
  • 웹 서버에서 웹 응용 프로그램에 액세스하는 사용자가 서버에서 악성코드를 실행하거나 데이터를 손상시키는 것을 방지해야 합니다.
  • Visual Studio를 설치하면 서버가 악성코드 공격에 노출될 위험이 많거나 적습니다.
  • 코드 액세스 보안
    코드 접근 보안은.NET 프레임워크는 코드의 실행을 제어함으로써 자원에 대한 접근을 제어하는 시스템이다.이런 안전 기능은 운영체제가 제공하는 안전성에 독립하고 운영체제가 제공하는 안전성에 대한 보충이다.사용자가 응용 프로그램을 실행할 때 응용 프로그램은.NET 공용 언어는 런타임에 5개 영역 중 하나에 할당됩니다.다섯 영역은 다음과 같습니다.
  • 내 컴퓨터 - 사용자 컴퓨터의 응용 프로그램.
  • 로컬 인트라넷 - 사용자의 인트라넷에 있는 응용 프로그램입니다.
  • 인터넷 - 인터넷에서 온 응용 프로그램입니다.
  • Trusted 사이트 - Internet Explorer에서 Trusted 사이트로 정의한 응용 프로그램입니다.
  • 신뢰할 수 없는 사이트 - Internet Explorer에서 제한된 사이트로 정의된 응용 프로그램입니다.
  • 위의 각 영역은 시스템 관리자가 특정 액세스 권한을 설정합니다.모든 구역의 안전 등급을 완전 신뢰, 중급 신뢰, 저급 신뢰, 불신임으로 설정할 수 있습니다.신뢰 수준은 프로그램이 접근할 수 있는 자원을 정의합니다.영역은 게시자, 고정 이름, 웹 사이트 및 코드의 URL과 같은 다른 보안 자격 증명과 함께 런타임에 이 코드에 부여할 권한을 결정합니다.사용자 컴퓨터의 보안 설정을 제어할 수 없지만, 프로그램이 실행될 때에도 실시간 설정의 제한을 받을 수 있습니다.이것은 프로그램이 특정한 자원에 접근하는 것을 거부할 수도 있다는 것을 의미한다.예를 들어, 프로그램은 데이터를 파일에 써야 할 수도 있지만, 사용자의 시스템은 이상을 일으켜 실행할 때 쓰기 접근을 거부할 것이다.보안 자격 증명에 대한 자세한 내용은 을 참조하십시오.
    Evidence(영어).
    이러한 상황을 처리하기 위해 응용 프로그램을 개발하는 것이 당신의 일입니다.이것은 응용 프로그램이 다른 방법으로 데이터를 쓸 수 있도록 하는 것이 아니라, 응용 프로그램이 데이터를 쓸 수 없을 수도 있다는 것을 예상하고 그 가능성에 응답해야 한다는 것이다.비정상 처리(Visual Basic의
    Try...Catch 또는 C#의
    try...catch) 또는
    System.Security.Permissions 네임스페이스의 일부 객체는 응용 프로그램 코드를 더욱 안정적으로 만듭니다.본고 뒤의'부분 신뢰 환경의 개발'1절에서 이러한 방법에 대해 간략하게 설명하였다.
    구역의 안전 수준은 따라갈 수 있다.NET 프레임과 함께 설치된 관리 도구로 설정합니다.컴퓨터에서 로케일 보안 수준 설정에 대한 자세한 내용은 을 참조하십시오.
    Administration Tools(영어).
    전적으로 신임하다
    개발자는 통상적으로 완전한 신뢰 환경에서 일한다.그들은 원본 코드를 하드디스크 드라이브에 저장하고 개발에 사용되는 컴퓨터에서 응용 프로그램을 테스트했다.이러한 완전한 신뢰 환경에서 개발자가 컴파일한 모든 코드는 로컬 컴퓨터에서 실행될 수 있다.로컬 컴퓨터는 기본적으로 완전 신뢰 환경으로 정의되어 있기 때문에 보안 이상이 발생하지 않습니다.
    부분적 신뢰
    일부 신뢰는 완전 신뢰 구역 이외의 모든 구역을 가리킨다.응용 프로그램을 배치할 때, 응용 프로그램은 새로운 구역으로 이동할 수 있고, 새로운 구역은 응용 프로그램을 완전히 신뢰하지 못할 수도 있습니다.일부 신뢰 환경에서 코드를 실행하는 두 가지 가장 흔한 경우는 다음과 같습니다.
  • 인터넷에서 다운로드한 코드를 실행합니다.
  • 네트워크 공유 위치(Intranet)에 주재하는 코드를 실행합니다.
  • 일부 신뢰 영역에서 액세스가 거부될 수 있는 리소스의 예는 다음과 같습니다.
  • 파일의 읽기, 쓰기, 생성, 삭제 또는 인쇄를 포함한 파일 I/O
  • 시스템 구성 요소, 예를 들어 등록표 값과 환경 변수.
  • 디렉터리 서비스, 등록표, 이벤트 로그, 성능 계수기와 메시지 대기열을 포함한 서버 구성 요소.
  • 일부 신뢰 환경에서 어떤 내용이 허용되지 않는가?확신하기가 쉽지 않은데..NET 프레임워크의 모든 클래스와 클래스의 모든 방법에는 보안 속성이 있습니다. 이 방법을 실행하는 데 필요한 신뢰 수준을 정의하는 데 사용되며, 이러한 보안 기능 때문에 실행할 때 이 속성에 접근할 수 없습니다.지역 레벨은 신뢰 레벨에서 속성까지의 간단한 매핑이 아니라 특정한 클래스와 방법에 대한 특정한 권한을 부여하는 집합입니다.응용 프로그램은 신뢰 수준을 간단하게 조회한 다음에 어떤 자원을 사용할 수 없는지 예측할 수 없습니다.응용 프로그램이 완전히 신뢰하는 환경에서 실행되는지 확인할 수 있습니다.다음 절'부분 신뢰 환경의 개발'에서 우리는 한 가지 방법을 소개할 것이다.
    일부 신뢰 환경의 개발
    이 절에서는 보안 문제가 작성된 코드에 어떤 영향을 미칠지 간략하게 소개한다.일부 신뢰 환경의 개발에는 단일한 해결 방안이 없다.솔루션은 작성한 애플리케이션에 따라 다릅니다.또한 신뢰 등급은 응용 프로그램의 실행 과정에서 변화가 발생할 수 있기 때문에 기존의 신뢰 등급만 테스트한 다음에 계속 실행할 수 없다.
    일부 신뢰 영역을 개발하는 첫 번째 단계는 보안 이상이 발생할 것을 식별할 수 있는 코드를 작성하는 것이다.다음 코드를 참고하십시오.
    ' Visual BasicPublic 
    Sub MakeABitmap() 
      Dim b As Bitmap = New Bitmap(100, 100)  
     '   
     b.Save("c:\PrettyPicture.bmp")
    End Sub
    // C#
    public void MakeABitmap()
    {  
     Bitmap b = new Bitmap(100, 100);   
    //    
    b.Save("c:\\PrettyPicture.bmp");
    }
    프로젝트와 프로젝트 프로그램 집합이 컴퓨터의 하드디스크 드라이브에 저장되어 있고, 컴퓨터 Administrators 그룹의 구성원이라면, 이 방법은 실행할 때 이상을 일으키지 않습니다.이 프로그램을 인트라넷에 배치하면, 프로그램이 비트맵 대상을 저장하려고 할 때
    System.Security.SecurityException(참조
    SecurityException Class[영어]).하면, 만약, 만약...
    Try...Catch(Visual Basic) 또는
    try...catch(C#) 블록은 예외로 인해 응용 프로그램이 종료됩니다.이것은 사용자를 불만족스럽게 할 것이다.비정상 처리 코드를 추가하면 애플리케이션에서 다음을 수행할 수 있습니다.
  • 사용자 애플리케이션에서 수행해야 할 모든 작업을 수행할 수 없음을 경고합니다.
  • catch 블록 뒤의 코드가 성공적으로 실행될 수 있도록 모든 기존 대상을 제거합니다.
  • 비트맵을 저장하는 코드를 다음과 같이 수정할 수 있습니다.추가된 코드는 보안이 거부되어 파일을 저장하지 못했음을 사용자에게 경고하여 보안 실패를 파일 I/O 실패(예: 잘못된 파일 이름)와 구분합니다.이런 방법은 어떠한 안전 구멍도 생기지 않을 것이다.사용자는 프로그램을 신뢰하기 위해 보안 설정을 수정해야 합니다. 그렇지 않으면 프로그램이 실행되지 않을 것입니다.
    ' Visual BasicPublic 
    Sub MakeABitmap() 
      Dim b As Bitmap  
     Try     
     b = New Bitmap(100, 100)   
       b.Save("c:\PrettyPicture.bmp")  
     Catch ex As System.Security.SecurityException   
       ' 。      
     MessageBox.Show(" ," & _        
     " 。")   
    Catch ex As System.Exception     
     ' 。     
     MessageBox.Show(ex.Message)  
     End Try
    End Sub
    // C#
    public void MakeABitmap()
    {  
     Bitmap b = null; 
      try    
    {     
     b = new Bitmap(100, 100);      
    b.Save("c:\\PrettyPicture.bmp");  
     }    
    catch (System.Security.SecurityException ex)   
     {      
    // 。    
       MessageBox.Show(" ," +        
      " 。");   }   
     catch (System.Exception ex)  
      {      // 。  
        MessageBox.Show(ex.Message);  
     }
    }
    사용
    System.Security.Permissions (영어) 명명 공간의 클래스, 속성과 매거진으로 응용 프로그램의 보안 작업을 더 많이 제어할 수 있습니다.다른 프로그램에서 호출할 수 있는 라이브러리를 작성하고 있다면, 라이브러리에서 호출 코드의 권한을 검증할 수 있습니다.예를 들어 코드 파일의 맨 위에 다음 프로그램 집합 단계의 속성을 추가하기만 하면 됩니다.프로그램 집합을 불러올 때, 실행할 때 권한을 검증합니다.실행 중 요청한 권한을 거부하면 프로그램 집합을 불러올 수 없고 보안 이상을 일으킬 수 있습니다.독립된 프로그램에 이 속성을 추가하면 프로그램이 실행되지 않을 수도 있습니다.이 속성이 클래스 라이브러리에 나타나면 실행할 때 이 라이브러리를 불러오지 않을 수도 있습니다.이 라이브러리를 호출하는 코드에try/catch 블록을 추가해야 합니다.
    ' Visual Basic
    <Assembly: System.Security.Permissions.FileIOPermissionAttribute
    ( _SecurityAction.RequestMinimum,
    Write:="c:\PrettyPicture.bmp")>
    // C#
    [assembly: System.Security.Permissions.FileIOPermissionAttribute
    (SecurityAction.RequestMinimum, Write="c:\\PrettyPicture.bmp")]
    실행할 때 권한을 요청할 수도 있습니다. 다음 예에서 사용했습니다
    Demand 방법.실행 중 이 요청을 허용하거나 거부할 수 있습니다.요청 거절은 안전 이상을 유발함으로써 이루어진다.다음과 같이 코드를 다시 작성하여 비트맵 파일에 대한 쓰기 권한을 명시적으로 요청할 수 있습니다.
    ' Visual BasicPublic 
    Sub MakeABitmap()  
     Dim filename As String = "c:\PrettyPicture.bmp"
      
     Dim permission As FileIOPermission = _
         
      New FileIOPermission(FileIOPermissionAccess.Write, _
       
        filename)
      
     Dim b As Bitmap = Nothing   
    Try     
     b = New Bitmap(100, 100)    
      permission.Demand()
        
      b.Save(filename)   
    Catch ex As System.Security.SecurityException    
      ' 。    
       MessageBox.Show(" ," & _    
         " 。")   
    Catch ex As System.Exception     
     ' 。     
     MessageBox.Show(ex.Message)  
     End Try
    End Sub
    // C#
    using System.Security.Permissions;
    public void MakeABitmap()
    {   
    string filename = "c:\\PrettyPicture.bmp";
      
     FileIOPermission permission = new
         
     FileIOPermission(FileIOPermissionAccess.Write,
        
      filename);
       
    Bitmap b = null;   
    try   
     {   
       b = new Bitmap(100, 100);    
      permission.Demand();
          
    b.Save(filename);  
     }   
     catch
    (System.Security.SecurityException ex)  
      {      
    // 。     
      MessageBox.Show(" ," +     
         " 。");   }   
     catch (System.Exception ex)    
    {      // 。    
      MessageBox.Show(ex.Message);  
     }
    }

    테스트
    일부 신뢰 영역을 개발하는 두 번째 단계는 여러 환경에서 테스트를 하는 것입니다. 특히 인트라넷과 인터넷에서.이것은 강제로 안전 이상을 일으킬 것이다.

    좋은 웹페이지 즐겨찾기