CLR 통합 코드 액세스 보안

적용 대상:SQL Server

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

어셈블리에 부여된 권한을 결정하는 보안 정책은 다음 세 가지 위치에 정의됩니다.

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

  • 사용자 정책: 프로세스에서 호스팅하는 관리 코드에 적용되는 정책입니다. SQL Server의 경우 사용자 정책은 SQL Server 서비스가 실행 중인 Windows 계정과 관련이 있습니다.

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

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

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

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

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

SQL Server는 호스트 수준 보안 정책 수준을 호스트하는 동안 CLR에 제공합니다. 이 정책은 항상 적용되는 두 정책 수준 이하의 추가 정책 수준입니다. 이 정책은 SQL Server에서 만든 기본 모든 애플리케이션에 대해 설정됩니다. 이 정책은 SQL Server에서 CLR 인스턴스를 만들 때 적용되는 기본 애플리케이션 기본 위한 것이 아닙니다.

SQL Server 호스트 수준 정책은 시스템 어셈블리에 대한 SQL Server 고정 정책과 사용자 어셈블리에 대한 사용자 지정 정책의 조합입니다.

CLR 어셈블리 및 SQL Server 시스템 어셈블리에 대한 고정 정책은 모든 신뢰를 부여합니다.

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

SAFE

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

SAFE 어셈블리에는 다음과 같은 사용 권한과 값이 있습니다.

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

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

EXTERNAL_ACCESS

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

EXTERNAL_ACCESS 어셈블리에는 다음과 같은 권한과 값도 있습니다.

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

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

실행: 관리 코드를 실행할 수 있는 권한입니다.

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

UNSAFE

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

UNSAFE 어셈블리에는 FullTrust가 제공됩니다.

SAFE 는 SQL Server 외부의 리소스에 액세스하지 않고 계산 및 데이터 관리 작업을 수행하는 어셈블리에 권장되는 권한 설정입니다.

EXTERNAL_ACCESS SQL Server 외부의 리소스에 액세스하는 어셈블리에 권장됩니다. EXTERNAL_ACCESS 어셈블리는 기본적으로 SQL Server 서비스 계정으로 실행됩니다. EXTERNAL_ACCESS 코드는 호출자의 Windows 인증 보안 컨텍스트를 명시적으로 가장할 수 있습니다. 기본값은 SQL Server 서비스 계정으로 실행되므로 EXTERNAL_ACCESS 실행할 수 있는 권한은 서비스 계정으로 실행하기 위해 신뢰할 수 있는 로그인에만 부여되어야 합니다.

보안 관점에서 EXTERNAL_ACCESSUNSAFE 어셈블리는 동일합니다. 그러나 EXTERNAL_ACCESS 어셈블리는 UNSAFE 어셈블리에 없는 다양한 안정성 및 견고성 보호를 제공합니다.

UNSAFE를 지정하면 어셈블리의 코드가 SQL Server 프로세스 공간에 대해 잘못된 작업을 수행할 수 있으므로 SQL Server의 견고성과 확장성이 손상될 수 있습니다. SQL Server에서 CLR 어셈블리를 만드는 방법에 대한 자세한 내용은 CLR 통합 어셈블리 관리를 참조 하세요.

Important

SQL Server에는 데이터베이스 엔진 엔진이 특정 기능을 제공하는 데 사용하는 CLR 어셈블리가 포함되어 있습니다. Microsoft.SQLServer.Types SQL Server 설치에 포함된 어셈블리는 메타데이터에 UNSAFE 어셈블리로 표시됩니다. 이것은 의도적인 것입니다. 이러한 어셈블리는 기본적으로 신뢰할 수 있고 안전한 것으로 간주됩니다.

외부 리소스 액세스

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

If 결과
실행 컨텍스트는 SQL Server 로그인에 해당합니다. 외부 리소스에 대한 액세스 시도가 거부되고 보안 예외가 발생합니다.
실행 컨텍스트는 Windows 로그인에 해당하며 실행 컨텍스트는 원래 호출자입니다. 외부 리소스는 SQL Server 서비스 계정의 보안 컨텍스트에서 액세스됩니다.
호출자가 원래 호출자가 아닙니다. 액세스가 거부되고 보안 예외가 발생합니다.
실행 컨텍스트는 Windows 로그인에 해당하며 실행 컨텍스트는 원래 호출자이며 호출자가 가장되었습니다. Access는 호출자 보안 컨텍스트를 사용합니다. 서비스 계정이 아닙니다.

사용 권한 집합 요약

다음 차트에는 SAFE, EXTERNAL_ACCESS 및 UNSAFE 권한 집합에 부여된 제한 사항 및 사용 권한이 요약되어 있습니다.

기능 안전 금고 EXTERNAL_ACCESS 하지 않은
코드 액세스 보안 권한 실행만 실행 및 외부 리소스 액세스 제한 없음(P/Invoke 포함)
프로그래밍 모델 제한 제한 없음
안정성 요구 사항 아니요
로컬 데이터 액세스
네이티브 코드 호출 기능 아니요 없음

참고 항목

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