코드 액세스 보안의 변경 내용 요약
.NET Framework 버전 4에서는 보안 시스템을 간소화하기 위해 CAS(코드 액세스 보안) 시스템이 크게 변경되었습니다. 이전 버전의 .NET Framework에서는 관리되는 응용 프로그램의 권한이 런타임 설정을 구성하도록 컴퓨터 전반에 설정된 보안 정책 규칙에 의해 결정되었습니다. .NET Framework 4부터는 다음과 같이 변경되었습니다.
보안 정책이 더 이상 사용되지 않습니다. 권한은 계속 사용되며 정책 시스템만 제거되었습니다.
응용 프로그램에 대한 액세스 권한은 응용 프로그램의 권한(해당 응용 프로그램 도메인에 의해 설정된 권한 부여 집합) 및 응용 프로그램의 투명도에 의해 결정됩니다. 모든 부분 신뢰 응용 프로그램은 투명한 것으로 분류됩니다. 투명한 응용 프로그램은 보안을 신경 쓸 필요가 없습니다. 투명도는 Microsoft Silverlight에서 먼저 사용되었으며 이제는 모든 호스팅된 환경으로 확장되었습니다.
데스크톱 또는 로컬 인트라넷 응용 프로그램에는 완전 신뢰가 부여됩니다.
중요 |
---|
CAS에서 변경된 중요 사항은 제거된 보안 정책입니다.CAS 자체는 제거되지 않았으며, 정책 사용(및 일부 권한 요청)이 제거되었습니다. |
이 항목에서는 .NET Framework 4에서 변경된 CAS에 대해 간단히 설명합니다. 자세한 내용은 .NET Framework 4의 보안 변경 내용을 참조하십시오.
샌드박싱 및 권한 모델
다음 목록에서는 .NET Framework 4의 데스크톱 및 호스팅된 응용 프로그램에 대한 신뢰 모델에 대해 설명합니다. 자세한 내용은 .NET Framework 4의 보안 변경 내용을 참조하십시오.
데스크톱 응용 프로그램. 이전 버전의 .NET Framework에서와 같이 데스크톱 내에 있는 관리되는 응용 프로그램(웹에서 다운로드된 경우 제외)에는 완전 신뢰가 부여됩니다. 로컬 인트라넷의 공유 위치에 있는 응용 프로그램에도 완전 신뢰가 부여됩니다. 로컬 하드 드라이브의 폴더에 따라 응용 프로그램의 권한을 제한하는 정책은 더 이상 사용할 수 없습니다.
호스팅된 응용 프로그램. 샌드박스에서 실행되는 응용 프로그램(예: Silverlight 기반 응용 프로그램)에는 응용 프로그램이 액세스할 수 있는 컴퓨터 리소스(예: 응용 프로그램이 사용할 수 있는 파일)를 결정하는 제한된 권한 집합이 부여됩니다. 샌드박스는 샌드박스 내에서 일부 어셈블리를 부분적으로 신뢰할 수 있는 어셈블리 및 완전히 신뢰할 수 있는 어셈블리로 식별할 수 있는 기능을 제공합니다. 부분 신뢰 어셈블리에는 샌드박스를 만든 응용 프로그램 도메인(System.AppDomain)에 의해 결정된 특정 권한 집합이 부여됩니다. 완전 신뢰 라이브러리에서 일부 완전 신뢰 코드는 부분적으로 신뢰할 수 있는 코드로 호출할 수 있습니다. 이러한 신뢰할 수 있는 코드는 컴퓨터에서 보호되는 리소스를 호출할 수 있습니다. 그러나 보호되는 리소스를 호출할 수 있는 공개적으로 액세스할 수 있는 완전 신뢰 형식 및 멤버는 보안 감사를 거쳐야 합니다. 이러한 멤버는 다음 단원에서 설명하는 보안에 민감한 멤버로 분류됩니다. 이러한 멤버는 부분 신뢰(투명한) 코드로 호출할 수 있으며, 다시 중요한 코드를 호출할 수 있습니다.
보안 투명성
보안 투명성은 보안에 민감한 코드와 보안에 민감하지 않은 코드를 구분합니다. 보안 투명성은 보안에 민감한 작업을 수행해야 하는 코드를 보안에 중요한 작업으로 주석을 지정하여 보안 감사를 쉽게 수행할 수 있도록 하기 위해 .NET Framework 버전 2.0에 도입되었습니다. 즉, 보안에 중요하지 않은 모든 코드(투명한 코드)는 철저한 검토가 필요하지 않았습니다. 하지만 이러한 이전 버전의 .NET Framework에서는 투명도가 Microsoft 코드에서만 사용되었습니다.
.NET Framework 4에서는 이 모델이 확장되었으며 보안 투명성을 적용 모델로 변환하기 위해 규칙이 강화되었습니다. 이 향상된 모델에서 보안에 민감하고 부분 신뢰 응용 프로그램이 호출할 수 있는 코드는 보다 쉽게 식별할 수 있습니다. 그 결과 감사해야 하는 노출 영역이 줄어듭니다.
다음 표에서는 투명도 범주 및 주석 지정 코드에 대한 관련 특성을 보여 줍니다.
보안 범주 |
특성 |
설명 |
---|---|---|
투명 |
본질적으로 보안에 민감한 것은 아무 것도 수행하지 않는 코드입니다. |
|
Critical |
모든 작업을 수행할 수 있지만 부분 신뢰 응용 프로그램에서 호출할 수 없는 코드입니다. |
|
안전상 중요 |
모든 작업을 수행할 수 있으며 부분 신뢰 응용 프로그램에서 호출할 수 있는 코드입니다. 이 계층은 중요한 코드를 호출하기 전 적절한 보안 검사와 유효성 검사를 수행하기 위한 목적의 보안 조정 계층입니다. |
투명한 코드는 코드에 부여된 권한에 관계없이 다음을 수행할 수 없습니다.
확인할 수 없는 코드 포함
플랫폼 호출 사용
Assert 작업 수행
중요한 코드 호출
중요한 코드에서 파생
LinkDemand로 보호되는 코드(즉, 중요한 것으로 간주되는 코드) 호출
코드가 이러한 규칙을 위반하려고 할 경우 코드가 완전 신뢰를 포함하는 경우라도 예외가 throw됩니다. 자세한 내용은 .NET Framework 4의 보안 변경 내용을 참조하십시오.
보안 민감도는 CLR(공용 언어 런타임)에서 투명한 코드에 대해 금지된 작업으로 정의됩니다. 투명도 모델은 필드에 암호 저장과 같은 시나리오 특정 보안 위반에 대해 보호되지 않습니다.
보안 모델 작동 방식
각 AppDomain에는 호스팅된 시나리오에서 호스트에 의해 정의되는 연관된 권한 집합을 포함합니다. 권한 집합은 호스팅되지 않은 코드에 대해 완전 신뢰입니다.
부분 신뢰 코드는 항상 투명합니다. 따라서 투명한 코드에 대해 금지된 작업을 수행할 수 없습니다(투명도 참조).
기본적으로 완전 신뢰 코드는 투명한 것으로 표시되지 않는 한 중요한 코드입니다. 데스크톱 응용 프로그램이 투명한 것으로 표시된 경우 완전 신뢰를 포함하더라도 중요한 코드를 호출할 수 없습니다.
라이브러리는 호스트 및 .NET Framework 모두에서 부분 신뢰 코드에 노출될 수 있습니다. 이러한 라이브러리에는 투명한 코드, 중요한 코드, 안전에 중요한 코드가 혼합되어 있습니다.
안전에 중요한 코드는 중요한 기능을 사용하기 전에 적절한 권한을 요구해야 합니다. 예를 들어 File.Open 메서드는 파일을 열기 전에 FileIOPermission을 요구합니다.
안전에 중요한 코드는 중요한 기능을 호출하기 전 그리고 후에 다른 검사 및 유효성 검사를 수행해야 합니다. 예를 들어 예외 및 메시지는 부분 신뢰 코드에 전달하기 전에 필터링해야 할 수 있습니다.
중요한 코드는 부분 신뢰 코드가 수행하도록 허용되지 않은 작업을 수행할 수 있으므로 부분 신뢰 코드에서 호출될 때 필요한 권한을 어설션해야 합니다.