.NET Framework 보안 기본 사항

코드 액세스 보안은 코드 실행을 제어하여 리소스에 대한 액세스를 제어하는 .NET Framework의 일부입니다.이 보안 기능은 운영 체제에서 제공하는 보안에 추가되는 별도의 기능입니다.

작동 방식

사용자가 응용 프로그램을 실행하면 이 응용 프로그램은 .NET Framework 공용 언어 런타임에 의해 영역에 할당됩니다.5개의 영역은 다음과 같습니다.

영역

설명

내 컴퓨터

응용 프로그램 코드는 사용자의 컴퓨터에 상주합니다.

Local Intranet

응용 프로그램 코드는 사용자 인트라넷의 파일 공유에서 실행됩니다.

Internet

응용 프로그램 코드는 인터넷에서 실행됩니다.

신뢰할 수 있는 사이트

Internet Explorer를 통해 "신뢰할 수 있는"으로 정의된 사이트의 응용 프로그램입니다.

신뢰할 수 없는 사이트

Internet Explorer를 통해 "제한된"으로 정의된 사이트의 응용 프로그램입니다.

처음 3개의 영역 내 컴퓨터, 로컬 인트라넷인터넷은 코드가 있는 위치를 기준으로 할당됩니다.Internet Explorer에서 신뢰할 수 있는 사이트 또는 신뢰할 수 없는 사이트에 특정 사이트를 할당하여 할당을 재정의할 수 있습니다.

이러한 각 영역에는 시스템 관리자가 설정한 특정 액세스 권한이 있습니다.영역의 보안 수준은 완전 신뢰, 보통 신뢰, 조금 신뢰 또는 신뢰 안 함으로 설정할 수 있습니다.신뢰 수준은 응용 프로그램에 액세스할 수 있는 리소스를 정의합니다.코드의 게시자, 강력한 이름, 웹 사이트 및 URL과 같은 다른 보안 증명과 함께 영역은 런타임에 코드에 부여되는 권한을 결정합니다.보안 증명에 대한 자세한 내용은 증명 정보를 참조하십시오. 사용자 컴퓨터의 보안 설정에 대한 제어 권한이 없지만 응용 프로그램은 실행될 때 응용 프로그램이 위치한 설정 내에서 작동해야 합니다.이로 인해 특정 리소스에 대한 응용 프로그램의 액세스가 거부될 수 있습니다.예를 들어, 응용 프로그램에서 파일에 데이터를 써야 하지만 사용자의 시스템이 런타임에 예외를 발생시켜 쓰기 액세스를 거부합니다.

이 상황을 처리하는 응용 프로그램을 개발하려는 경우반드시 응용 프로그램에서 데이터를 쓸 수 있는 다른 방법을 찾아야 하는 것은 아닙니다.응용 프로그램에서 데이터를 쓸 수 없는 상황을 예상하고 이러한 가능성에 응답하도록 하면 됩니다.추가 예외 처리 또는 System.Security.Permissions 네임스페이스의 몇 가지 개체를 사용하여 코드를 보다 강력하게 작성할 수 있습니다.이러한 메서드에 대한 간단한 설명은 이 문서의 나중 섹션 "부분 신뢰 환경 개발"에서 다룹니다.

영역의 보안 수준은 .NET Framework를 설치할 때 설치한 관리 도구를 사용하여 설정합니다.컴퓨터에서 영역 보안 수준을 설정하는 방법에 대한 자세한 내용은 관리 도구를 참조하십시오.

Full Trust

개발자는 대부분의 경우 완전 신뢰 환경에서 작업합니다.개발자는 소스 코드를 하드 드라이브에 보관하고 응용 프로그램을 개발 컴퓨터에서 테스트합니다.이 완전 신뢰 환경에서는 개발자가 컴파일하는 코드를 로컬 컴퓨터에서 실행할 수 있습니다.로컬 컴퓨터는 기본적으로 완전 신뢰 환경이므로 보안 예외가 발생하지 않습니다.

부분 신뢰

부분 신뢰는 완전 신뢰 영역이 아닌 모든 영역을 가리킵니다.응용 프로그램을 개발할 때 이 응용 프로그램은 응용 프로그램에 대해 완전 신뢰를 부여하지 않은 영역과 같은 새 영역으로 이동할 수 있습니다.코드를 부분 신뢰로 실행하는 가장 일반적인 시나리오 두 가지는 다음과 같습니다.

  • 인터넷에서 다운로드한 코드를 실행합니다.

  • 네트워크 공유(인트라넷)에 상주하는 코드를 실행합니다.

부분 신뢰 영역에서 거부될 수 있는 리소스의 예는 다음과 같습니다.

  • 파일의 읽기, 쓰기, 만들기, 삭제 또는 인쇄 등의 파일 I/O 작업

  • 레지스트리 값 및 환경 변수 등의 시스템 구성 요소

  • 디렉터리 서비스, 레지스트리, 이벤트 로그, 성능 카운터 및 메시지 큐 등의 서버 구성 요소

부분 신뢰로 허용되지 않는 리소스는결정하기가 어렵습니다..NET Framework의 각 클래스 및 각 클래스의 각 메서드에는 해당 메서드를 실행하는 데 필요한 신뢰 수준을 정의하는 보안 특성이 데 필요한 신뢰 수준을 정의하는 보안 특성이 있으며, 바로 이러한 보안 기능 때문에 런타임에 이 특성에 액세스할 수 없는 경우도 있습니다.영역 수준은 신뢰 수준을 특성에 단순 매핑한 것이 아니라 특정 클래스와 메서드에 제공된 특정 권한의 컬렉션입니다.응용 프로그램은 신뢰 수준에 대해 쿼리할 수 없으므로 사용할 수 없는 리소스를 예측할 수 없습니다.응용 프로그램이 완전 신뢰로 실행 중인지 여부를 확인할 수 있습니다.완전 신뢰로 실행되는 메서드에 대한 내용은 아래의 "부분 신뢰 환경 개발"에서 설명합니다.

부분 신뢰 환경 개발

이 섹션에서는 보안 문제가 작성한 코드에 영향을 미칠 수 있는 방식에 대해 간략하게 알아봅니다.부분 신뢰 환경을 개발하는 단일 솔루션은 없습니다.솔루션은 작성 중인 응용 프로그램에 따라 다릅니다.또한 신뢰 수준은 응용 프로그램이 실행되는 동안 변경될 수 있으므로 기존 신뢰 수준만 테스트하고 진행할 수는 없습니다.

보안 예외 코드

부분 신뢰 영역 개발의 첫 단계에서는 보안 예외 발생을 인식하는 코드를 작성합니다.다음 코드에서는 이 오류가 발생하는 경우를 보여 줍니다.

Public Sub MakeABitmap()
    Dim b As New System.Drawing.Bitmap(100, 100)
    ' Some code here to draw a nice picture in the bitmap
    b.Save("c:\PrettyPicture.bmp")
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b =
        new System.Drawing.Bitmap(100, 100);
    // Some code here to draw a nice picture in the bitmap
    b.Save("c:\\PrettyPicture.bmp");
}

프로젝트와 프로젝트 어셈블리가 컴퓨터의 하드 디스크에 저장되지 않은 경우와 사용자가 컴퓨터의 관리자 그룹 구성원이 아닌 경우 이 메서드는 예외를 throw하지 않고 실행됩니다.이 응용 프로그램을 인트라넷에 배포하면 응용 프로그램에서 비트맵 개체를 저장할 때 SecurityException이 throw될 수 있습니다.이 코드를 둘러싼 Try...Catch...Finally 문(Visual Basic) 또는 try-catch-finally (C# Reference) 블록이 없는 경우 응용 프로그램은 예외와 함께 종료됩니다.사용자는 이러한 상황을 달갑게 여기지 않을 것입니다.예외 처리 코드를 추가하면 응용 프로그램이 다음 작업을 수행할 수 있습니다.

  • 응용 프로그램에서 수행해야 할 모든 작업을 완료할 수 없음을 사용자에게 경고합니다.

  • 블록을 catch한 후에 실행되는 코드가 실패하지 않도록 기존 개체를 정리합니다.

다음 설명과 같이 비트맵 저장 코드를 수정할 수 있습니다.추가된 코드는 사용자에게 보안 거부로 인해 파일이 저장되지 않았음을 경고하고 보안 오류를 다른 파일 I/O 오류(예: 잘못된 파일 이름)와 구분합니다.이 방법은 보안 허점을 만들지 않습니다.사용자가 응용 프로그램을 신뢰하도록 보안을 수정할 수 있고 그렇지 않으면 응용 프로그램이 실행되지 않습니다.

Public Sub MakeABitmap()
    Dim b As System.Drawing.Bitmap = Nothing
    Try
        b = New System.Drawing.Bitmap(100, 100)
        b.Save("c:\PrettyPicture.bmp")
    Catch ex As System.Security.SecurityException
        ' Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " & 
               "and the bitmap was not saved.")
    Catch ex As System.Exception
        ' React to other exceptions here.
        MessageBox.Show("Unable to create and save the bitmap.")
    End Try
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b = null;

    try
    {
        b = new System.Drawing.Bitmap(100, 100);
        b.Save("c:\\PrettyPicture.bmp");
    }
    catch (System.Security.SecurityException ex)
    {
        // Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " +
            "and the bitmap was not saved.");
    }
    catch (System.Exception ex)
    {
        // React to other exceptions here.
        MessageBox.Show("Unable to create and save the bitmap.");
    }
}

System.Security.Permissions 네임스페이스의 클래스, 특성 및 열거형은 응용 프로그램의 보안 작업에 대해 보다 강력한 제어 권한을 지원합니다.다른 응용 프로그램에서 호출될 수 있는 라이브러리를 작성 중이면 라이브러리에서 호출 코드의 권한을 확인해야 합니다.예를 들어, 다음 어셈블리 수준 특성을 코드 파일의 맨 위에 추가하거나 AssemblyInfo.vb 또는 AssemblyInfo.cs 파일에 추가하면 됩니다.자세한 내용은 어셈블리 특성 설정을 참조하십시오.

<Assembly: System.Security.Permissions.FileIOPermissionAttribute( 
    System.Security.Permissions.SecurityAction.RequestMinimum, 
    Write:="c:\PrettyPicture.bmp")> 
[assembly: System.Security.Permissions.FileIOPermissionAttribute(
    System.Security.Permissions.SecurityAction.RequestMinimum,
    Write = "c:\\PrettyPicture.bmp")]

런타임에서는 어셈블리가 로드될 때 권한을 확인합니다.런타임이 요청된 권한을 거부하면 어셈블리는 로드에 실패하고 보안 예외가 throw됩니다.이 특성을 독립형 응용 프로그램에 추가하면 응용 프로그램이 실행되지 않을 수 있습니다.이 특성이 클래스 라이브러리에 나타나면 런타임에 해당 라이브러리가 로드되지 않을 수 있습니다.try/catch 블록을 클래스 라이브러리를 호출하는 코드에 추가해야 합니다.

또한 Demand 메서드를 사용하여 아래와 같이 특히 런타임에 권한을 요청할 수 있습니다.그러면 런타임에서는 요청된 권한을 부여하거나 요청을 거부합니다.보안 예외가 발생하여 요청이 거부됩니다.다음과 같은 코드를 다시 작성하여 비트맵 파일을 쓸 권한을 명시적으로 요청할 수 있습니다.

Public Sub MakeABitmap()
    Dim b As System.Drawing.Bitmap = Nothing
    Dim filename = "c:\PrettyPicture.bmp"
    Dim permission As New System.Security.Permissions.FileIOPermission( 
        System.Security.Permissions.FileIOPermissionAccess.Write, 
        filename)

    Try
        permission.Demand()
        Try
            b = New System.Drawing.Bitmap(100, 100)
            b.Save(filename)
        Catch ex As System.Exception
            MessageBox.Show("Unable to create and save the bitmap.")
        End Try
    Catch ex As System.Security.SecurityException
        ' Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " & 
               "and the bitmap was not saved.")
    Catch ex As System.Exception
        ' React to other exceptions here.
        MessageBox.Show("Other error.")
    End Try
End Sub
public void MakeABitmap()
{
    System.Drawing.Bitmap b = null;
    string filename = "c:\\PrettyPicture.bmp";

    System.Security.Permissions.FileIOPermission permission;
    permission = new System.Security.Permissions.FileIOPermission(
        System.Security.Permissions.FileIOPermissionAccess.Write, filename);

    try
    {
        permission.Demand();
        try
        {
            b = new System.Drawing.Bitmap(100, 100);
            b.Save(filename);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show("Unable to create and save the bitmap.");
        }
    }
    catch (System.Security.SecurityException ex)
    {
        // Let the user know the save won't work. 
        MessageBox.Show("Permission to save the file was denied, " +
               "and the bitmap was not saved.");
    }
    catch (System.Exception ex)
    {
        // React to other exceptions here.
        MessageBox.Show("Other error.");
    }
}

테스트

부분 신뢰 영역 개발의 두 번째 단계에서는 다양한 환경, 특히 인트라넷과 인터넷에서 테스트합니다.이 작업으로 인해 보안 예외가 throw됩니다.관리자 권한이 없는 로컬 컴퓨터에서 사용자 계정을 만들고 해당 계정으로 응용 프로그램을 실행하는 것은 중요한 테스트의 하나입니다.

참고 항목

작업

방법: 샌드박스에서 부분 신뢰 코드 실행

방법: RequestMinimum 플래그를 사용하여 최소 권한 요청

개념

코드 액세스 보안

보안 코딩 지침

.NET Framework 4의 보안 변경 내용