보안 투명 코드, 수준 1
투명성을 사용하면 부분적으로 신뢰할 수 있는 코드에 기능을 노출하는 .NET Framework 라이브러리를 개발자가 보다 안전하게 작성할 수 있습니다. 수준 1 투명도는 .NET Framework 버전 2.0에서 새로 추가되었으며 주로 Microsoft 내부에서만 사용되었습니다. .NET Framework 버전 4부터는 수준 2 투명성을 사용할 수 있습니다. 그러나 이전의 보안 규칙을 사용하여 실행되어야 하는 레거시 코드를 식별할 수 있도록 수준 1 투명성은 계속 유지되고 있습니다.
중요 |
---|
수준 1 투명성은 호환성을 위해서만 지정해야 합니다. 즉, AllowPartiallyTrustedCallersAttribute를 사용하거나 투명성 모델을 사용하지 않는 .NET Framework 3.5 또는 이전 버전으로 개발한 코드에 대해서만 수준 1을 지정합니다.예를 들어, 부분적으로 신뢰할 수 있는 호출자(APTCA)로부터의 호출을 허용하는 .NET Framework 2.0 어셈블리에 대해 수준 1 투명성을 사용합니다..NET Framework 4에 맞춰 개발한 코드의 경우에는 항상 수준 2 투명성을 사용합니다. |
이 항목에는 다음과 같은 단원이 포함되어 있습니다.
수준 1 투명성 모델
투명성 특성
보안 투명성 예제
수준 1 투명성 모델
수준 1 투명성을 사용하는 경우 코드를 보안 투명 메서드, 보안 안전에 중요한 메서드 및 보안에 중요한 메서드로 구분하는 보안 모델을 사용합니다.
전체 어셈블리, 어셈블리의 일부 클래스 또는 클래스의 일부 메서드를 보안 투명으로 표시할 수 있습니다. 보안 투명 코드를 사용하여 권한을 상승시킬 수는 없습니다. 이 제한에 따른 영향은 다음 세 가지입니다.
보안 투명 코드는 Assert 작업을 수행할 수 없습니다.
투명 보안 코드에 의해 충족되는 모든 링크 요청은 완전 요청이 됩니다.
보안 투명 코드에서 실행해야 하는 안전하지 않거나 확인할 수 없는 코드를 사용하면 UnmanagedCode 보안 권한에 대한 완전 요청이 발생합니다.
이러한 규칙은 CLR(공용 언어 런타임)에서 실행 시 적용됩니다. 보안 투명 코드는 호출하는 코드의 모든 보안 요구 사항을 해당 호출자에게 다시 전달합니다. 보안 투명 코드를 통해 흐르는 요청을 사용하여 권한을 상승시킬 수는 없습니다. 낮은 신뢰 응용 프로그램에서 보안 투명 코드를 호출하고 높은 권한에 대한 요청이 발생하면 이러한 요청이 낮은 신뢰 코드로 다시 흐르고 실패하게 됩니다. 보안 투명 코드는 어설션 작업을 수행할 수 없으므로 요청을 중지할 수 없습니다. 완전 신뢰 코드에서 호출된 동일한 보안 투명 코드를 사용하면 요청이 성공하게 됩니다.
보안에 중요는 보안 투명의 반대 개념입니다. 보안에 중요한 코드는 완전 신뢰로 실행되며, 모든 권한 있는 작업을 수행할 수 있습니다. 보안 안전에 중요한 코드는 광범위한 보안 감사를 통해 부분적으로 신뢰할 수 있는 호출자가 액세스 권한이 없는 리소스를 사용할 수 없는 것이 확인된 권한 있는 코드입니다.
투명성은 명시적으로 적용해야 합니다. 데이터 조작 및 논리를 처리하는 대부분의 코드는 일반적으로 보안 투명으로 표시되는 반면 권한 상승 작업을 수행하는 나머지 코드는 보안에 중요한 코드나 보안 안전에 중요한 코드로 표시됩니다.
중요 |
---|
수준 1 투명성은 어셈블리 범위로 제한되며, 어셈블리 간에는 적용되지 않습니다.수준 1 투명성은 주로 보안 감사 목적을 위해 Microsoft 내에서 사용되었습니다.수준 1 어셈블리 내의 보안에 중요한 형식 및 멤버는 다른 어셈블리의 보안 투명 코드에서 액세스할 수 있습니다.수준 1의 모든 보안에 중요한 형식 및 멤버에서 완전 신뢰에 대한 링크 요청을 수행하는 것이 중요합니다.보안 안전에 중요한 형식 및 멤버는 해당 형식이나 멤버가 액세스하는 보호된 리소스에 대한 권한이 호출자에게 있는지도 확인해야 합니다. |
.NET Framework 이전 버전과의 호환성을 위해 투명성 특성을 사용하여 주석이 지정되지 않은 모든 멤버는 보안 안전에 중요한 멤버로 간주됩니다. 주석이 지정되지 않은 모든 형식은 투명으로 간주됩니다. 투명성을 확인하는 정적 분석 규칙은 없습니다. 따라서 런타임에 투명성 오류를 디버깅해야 할 수도 있습니다.
투명성 특성
다음 표에서는 코드에 투명성에 대한 주석을 지정하는 데 사용하는 세 가지 특성에 대해 설명합니다.
특성 |
설명 |
---|---|
어셈블리 수준에서만 사용할 수 있습니다. 어셈블리의 모든 형식 및 멤버를 보안 투명으로 식별합니다. 어셈블리에 보안에 중요한 코드를 포함할 수 없습니다. |
|
Scope 속성 없이 어셈블리 수준에서 사용하는 경우 기본적으로 어셈블리의 모든 코드를 보안 투명으로 식별하지만 어셈블리가 보안에 중요한 코드를 포함할 수 있음을 나타냅니다. 클래스 수준에서 사용하는 경우 클래스 또는 메서드를 보안에 중요한 형식 또는 멤버로 식별하지만 클래스의 멤버는 보안에 중요한 형식 또는 멤버로 식별하지 않습니다. 모든 멤버를 보안에 중요한 멤버로 만들려면 Scope 속성을 Everything으로 설정합니다. 멤버 수준에서 사용하는 경우 특성이 해당 멤버에만 적용됩니다. 보안에 중요한 형식 또는 멤버로 식별된 클래스 또는 멤버는 권한 상승 작업을 수행할 수 있습니다.
중요
수준 1 투명성에서 보안에 중요한 형식 및 멤버는 어셈블리 외부에서 호출될 경우 보안 안전에 중요한 형식 또는 멤버로 처리됩니다.무단으로 권한이 상승되는 것을 방지하려면 완전 신뢰에 대한 링크 요청을 통해 보안에 중요한 형식 및 멤버를 보호해야 합니다.
|
|
어셈블리의 보안 투명 코드에서 액세스할 수 있는 보안에 중요한 코드를 식별합니다. 그렇지 않은 경우 보안 투명 코드는 동일한 어셈블리의 보안에 중요한 전용 또는 내부 멤버에 액세스할 수 없습니다. 이렇게 되면 보안에 중요한 코드가 영향을 받아 권한이 예기치 않게 상승될 수 있습니다. 보안 안전에 중요한 코드는 엄격한 보안 감사를 통과해야 합니다.
참고
보안 안전에 중요한 형식 및 멤버는 호출자의 권한을 확인하여 보호된 리소스에 액세스할 권한이 호출자에게 있는지 확인해야 합니다.
|
SecuritySafeCriticalAttribute 특성을 사용하면 보안 투명 코드가 동일한 어셈블리의 보안에 중요한 멤버에 액세스할 수 있습니다. 어셈블리의 보안 투명 코드와 보안에 중요한 코드를 서로 다른 두 어셈블리에 구분된 항목으로 생각하십시오. 보안 투명 코드는 보안에 중요한 코드의 전용 또는 내부 멤버를 볼 수 없습니다. 또한 보안에 중요한 코드는 일반적으로 해당 공용 인터페이스에 대한 액세스를 위해 감사됩니다. 어셈블리 외부에서 전용 또는 내부 상태에 액세스할 수 없어야 하며 격리된 상태를 유지해야 합니다. SecuritySafeCriticalAttribute 특성은 보안 투명 코드와 보안에 중요한 코드 간에 격리된 상태를 유지하며 필요한 경우 격리된 상태를 재정의할 수 있는 기능을 제공합니다. 보안 투명 코드는 보안에 중요한 전용 또는 내부 코드의 멤버가 SecuritySafeCriticalAttribute로 표시되지 않은 경우 이러한 코드에 액세스할 수 없습니다. SecuritySafeCriticalAttribute를 적용하기 전에 공개적으로 노출된 항목과 같이 해당 멤버를 감사해야 합니다.
어셈블리 수준 주석
다음 표에서는 보안 특성을 어셈블리 수준에서 사용하는 데 따른 영향을 설명합니다.
어셈블리 특성 |
어셈블리 상태 |
---|---|
부분적으로 신뢰할 수 있는 어셈블리에 특성이 없음 |
모든 형식과 멤버가 투명입니다. |
전역 어셈블리 캐시에 있거나 AppDomain에서 완전 신뢰로 식별된 완전 신뢰 어셈블리에 특성이 없음 |
모든 형식은 투명이고, 모든 멤버는 보안 안전에 중요한 멤버입니다. |
SecurityTransparent |
모든 형식과 멤버가 투명입니다. |
SecurityCritical(SecurityCriticalScope.Everything) |
모든 형식과 멤버가 보안에 중요한 형식 또는 멤버입니다. |
SecurityCritical |
모든 코드는 기본적으로 투명합니다. 그러나 개별 형식과 멤버는 다른 특성을 가질 수 있습니다. |
보안 투명성 예제
.NET Framework 2.0 투명성 규칙(수준 1 투명성)을 사용하려면 다음 어셈블리 주석을 사용합니다.
[assembly: SecurityRules(SecurityRuleSet.Level1)]
어셈블리에 중요한 코드가 포함되어 있지 않으며 해당 어셈블리가 어떠한 방법으로도 권한을 상승시키지 않음을 나타내기 위해 전체 어셈블리를 투명하게 만들려면 다음 특성을 사용하여 어셈블리에 투명성을 명시적으로 추가합니다.
[assembly: SecurityTransparent]
동일한 어셈블리에 중요한 코드와 투명 코드를 함께 유지하려면 다음과 같이 SecurityCriticalAttribute 특성으로 어셈블리를 표시하여 어셈블리에 중요한 코드가 포함될 수 있음을 나타냅니다.
[assembly: SecurityCritical]
보안에 중요한 작업을 수행하려면 다음 코드 예제에서와 같이 중요한 작업을 수행할 코드를 다른 SecurityCriticalAttribute 특성을 사용하여 명시적으로 표시해야 합니다.
[assembly: SecurityCritical]
Public class A
{
[SecurityCritical]
private void Critical()
{
// critical
}
public int SomeProperty
{
get {/* transparent */ }
set {/* transparent */ }
}
}
public class B
{
internal string SomeOtherProperty
{
get { /* transparent */ }
set { /* transparent */ }
}
}
명시적으로 보안에 중요한 항목으로 표시된 Critical 메서드를 제외하고 위의 코드는 투명합니다. 투명성은 기본 설정이며 이는 어셈블리 수준의 SecurityCriticalAttribute 특성에도 해당됩니다.