다음을 통해 공유


CLR 통합 코드 액세스 보안

CLR(공용 언어 런타임)은 관리 코드에 대해 코드 액세스 보안이라는 보안 모델을 지원합니다. 이 모델에서는 코드 ID를 기반으로 어셈블리에 사용 권한이 부여됩니다. 자세한 내용은 .NET Framework 소프트웨어 개발 키트의 "코드 액세스 보안" 섹션을 참조하십시오.

어셈블리에 부여되는 사용 권한을 결정하는 보안 정책은 다음 세 위치에서 정의됩니다.

  • 컴퓨터 정책: SQL Server 설치된 컴퓨터에서 실행되는 모든 관리 코드에 적용되는 정책입니다.

  • 사용자 정책: 프로세스에서 호스팅하는 관리 코드에 적용되는 정책입니다. SQL Server 서비스가 실행 중입니다.

  • 호스트 정책: 해당 호스트에서 실행되는 관리 코드에 적용되는 CLR(이 경우 SQL Server)의 호스트에서 설정한 정책입니다.

CLR에서 지원되는 코드 액세스 보안 메커니즘은 런타임에서 완전히 신뢰할 수 있는 코드와 부분적으로 신뢰할 수 있는 코드를 모두 호스팅할 수 있다는 가정을 기반으로 합니다. CLR 코드 액세스 보안으로 보호되는 리소스는 일반적으로 리소스에 대한 액세스를 허용하기 전에 해당 권한이 필요한 관리되는 애플리케이션 프로그래밍 인터페이스에 의해 래핑됩니다. 호출 스택의 모든 호출자(어셈블리 수준)에 해당하는 리소스 권한이 있는 경우에만 사용 권한에 대한 요구가 충족됩니다.

SQL Server 내에서 실행할 때 관리 코드에 부여되는 코드 액세스 보안 권한 집합은 SQL Server 로드된 어셈블리에 대한 사용 권한 집합을 부여합니다. 사용자 코드에 부여된 최종 권한 집합은 사용자 및 컴퓨터 수준 정책에 의해 추가로 제한될 수 있습니다.

SQL Server 호스트 정책 수준 권한 집합

SQL Server 호스트 정책 수준에서 어셈블리에 부여된 코드 액세스 보안 권한 집합은 어셈블리를 만들 때 지정된 권한 집합에 의해 결정됩니다. 세 가지 권한 집합SAFE이 있습니다. , EXTERNAL_ACCESSUNSAFE (CREATE ASSEMBLY(Transact-SQL)PERMISSION_SET 옵션을 사용하여 지정됨).

SQL Server. SQL Server에서 CLR의 인스턴스를 만들 때 적용되는 기본 응용 프로그램 도메인에는 이 정책이 적용되지 않습니다.

SQL Server 시스템 어셈블리에 대한 고정 정책 및 사용자 어셈블리에 대한 사용자 지정 정책입니다.

CLR 어셈블리 및 SQL Server 시스템 어셈블리용 고정 정책은 어셈블리에 완전 신뢰를 제공합니다.

SQL Server 호스트 정책의 사용자 지정 부분은 각 어셈블리에 대해 세 개의 권한 버킷 중 하나를 지정하는 어셈블리 소유자를 기반으로 합니다. 아래에 나열된 보안 권한에 대한 자세한 내용은 .NET Framework SDK를 참조하십시오.

SAFE

내부 계산 및 로컬 데이터 액세스만 허용됩니다. SAFE는 가장 제한적인 권한 집합입니다. SAFE 권한을 사용하여 어셈블리에서 실행한 코드는 파일, 네트워크, 환경 변수 또는 레지스트리와 같은 외부 시스템 리소스에 액세스할 수 없습니다.

SAFE 어셈블리는 다음과 같은 사용 권한 및 값을 갖습니다.

사용 권한 값/설명
SecurityPermission Execution: 관리 코드를 실행하는 데 필요한 권한입니다.
SqlClientPermission Context connection = true, context connection = yes: 컨텍스트 연결만 사용할 수 있으며 연결 문자열은 "context connection=true" 또는 "context connection=yes" 값만 지정할 수 있습니다.

AllowBlankPassword = false: 빈 암호는 허용되지 않습니다.

EXTERNAL_ACCESS

EXTERNAL_ACCESS 어셈블리는 파일, 네트워크, 환경 변수 및 레지스트리와 같은 외부 시스템 리소스에 액세스할 수 있는 추가 기능을 통해 어셈블리와 동일한 권한을 SAFE 갖습니다.

또한 EXTERNAL_ACCESS 어셈블리는 다음과 같은 사용 권한 및 값을 갖습니다.

사용 권한 값/설명
DistributedTransactionPermission Unrestricted: 분산 트랜잭션이 허용됩니다.
DNSPermission Unrestricted: 도메인 이름 서버에서 정보를 요청할 수 있는 권한입니다.
EnvironmentPermission Unrestricted: 시스템 및 사용자 환경 변수에 대한 모든 액세스 권한이 허용됩니다.
EventLogPermission Administer: 이벤트 원본 만들기, 기존 로그 읽기, 이벤트 원본 또는 로그 삭제, 엔트리에 응답, 이벤트 로그 지우기, 이벤트 수신, 모든 이벤트 로그 컬렉션에 액세스 등의 동작이 허용됩니다.
FileIOPermission Unrestricted: 파일 및 폴더에 대한 모든 액세스 권한이 허용됩니다.
KeyContainerPermission Unrestricted: 키 컨테이너에 대한 모든 액세스 권한이 허용됩니다.
NetworkInformationPermission Access: Ping 수행이 허용됩니다.
RegistryPermission HKEY_CLASSES_ROOT, HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER, HKEY_CURRENT_CONFIGHKEY_USERS.에 대한 읽기 권한을 허용합니다.
SecurityPermission Assertion: 이 코드의 모든 호출자에게 작업에 대한 필수 권한이 있다고 어설션하는 기능입니다.

ControlPrincipal: 보안 주체 개체를 조작하는 기능입니다.

Execution: 관리 코드를 실행하는 데 필요한 권한입니다.

SerializationFormatter: 직렬화 서비스를 제공하는 기능입니다.
SmtpPermission Access: SMTP 호스트 포트 25에 대한 아웃바운드 연결이 허용됩니다.
SocketPermission Connect: 전송 주소에 대해 아웃바운드 연결(모든 포트, 모든 프로토콜)이 허용됩니다.
SqlClientPermission Unrestricted: 데이터 원본에 대한 모든 액세스 권한이 허용됩니다.
StorePermission Unrestricted: X.509 인증서 저장소에 대한 모든 액세스 권한이 허용됩니다.
WebPermission Connect: 웹 리소스에 대한 아웃바운드 연결이 허용됩니다.

UNSAFE

UNSAFE를 사용하면 어셈블리가 SQL Server 내부 및 외부에서 리소스에 무제한으로 액세스할 수 있습니다. UNSAFE 어셈블리 내에서 실행되는 코드는 비관리 코드를 호출할 수도 있습니다.

UNSAFE 어셈블리에는 FullTrust가 부여됩니다.

중요

SAFE는 SQL Server 외부의 리소스에 액세스하지 않고 계산 및 데이터 관리 작업을 수행하는 어셈블리에 권장되는 권한 설정입니다. EXTERNAL_ACCESS어셈블리는 기본적으로 SQL Server 서비스 계정으로 실행되며, 실행할 EXTERNAL_ACCESS 수 있는 권한은 서비스 계정으로 실행하기 위해 신뢰할 수 있는 로그인에만 부여되어야 합니다. 보안 측면에서 EXTERNAL_ACCESSUNSAFE 어셈블리는 같습니다. 그러나 EXTERNAL_ACCESS 어셈블리는 UNSAFE 어셈블리에 없는 다양한 안정성 및 견고성 보호 기능을 제공합니다. 를 지정하면 UNSAFE 어셈블리의 코드가 SQL Server 대해 잘못된 작업을 수행할 수 있습니다. SQL Server CLR 어셈블리를 만드는 방법에 대한 자세한 내용은 CLR 통합 어셈블리 관리를 참조하세요.

외부 리소스 액세스

UDT(사용자 정의 형식), 저장 프로시저 또는 다른 유형의 구문 어셈블리가 SAFE 권한 집합에 등록되어 있으면 구문에서 실행되는 관리 코드가 외부 리소스에 액세스할 수 없습니다. 그러나 또는 UNSAFE 권한 집합이 EXTERNAL_ACCESS 지정되고 관리 코드가 외부 리소스에 액세스하려고 시도하는 경우 SQL Server 다음 규칙을 적용합니다.

조건 결과
실행 컨텍스트가 SQL Server 로그인에 해당하는 경우 외부 리소스에 액세스하려고 하면 거부되고 보안 예외가 발생합니다.
실행 컨텍스트가 Windows 로그인에 해당하고 원래 호출자입니다. SQL Server 서비스 계정의 보안 컨텍스트 내에서 외부 리소스에 액세스합니다.
호출자가 원래 호출자가 아닙니다. 액세스가 거부되고 보안 예외가 발생합니다.
실행 컨텍스트가 Windows 로그인에 해당하고 원래 호출자인데 호출자를 가장했습니다. 서비스 계정이 아니라 호출자 보안 컨텍스트가 액세스에 사용됩니다.

권한 집합 요약

다음 차트에서는 SAFE, EXTERNAL_ACCESSUNSAFE 권한 집합에 부여되는 사용 권한과 제한을 요약하여 보여 줍니다.

SAFE EXTERNAL_ACCESS UNSAFE
Code Access Security Permissions 실행 전용 실행 및 외부 리소스 액세스 제한 없음(P/Invoke 포함)
Programming model restrictions 제한 없음
Verifiability requirement 아니요
Local data access Yes Yes
Ability to call native code 아니요 아니요

참고 항목

CLR 통합 보안
호스트 보호 특성 및 CLR 통합 프로그래밍
CLR 통합 프로그래밍 모델 제한 사항
CLR 호스팅 환경