Applies to:SQL Server
CLR(공용 언어 런타임)은 관리 코드에 대해 코드 액세스 보안이라는 보안 모델을 지원합니다. 이 모델에서는 코드의 ID에 따라 어셈블리에 대한 사용 권한이 부여됩니다. 자세한 내용은 코드 액세스 보안참조하세요.
어셈블리에 부여된 권한을 결정하는 보안 정책은 다음 세 가지 위치에 정의됩니다.
Machine policy: This policy is in effect for all managed code running in the machine on which SQL Server is installed.
User policy: This policy is in effect for managed code hosted by a process. SQL Server의 경우 사용자 정책은 SQL Server 서비스가 실행 중인 Windows 계정과 관련이 있습니다.
Host policy: This policy is set up by the host of the CLR (in this case, SQL Server) that is in effect for managed code running in that host.
CLR에서 지원하는 코드 액세스 보안 메커니즘은 런타임이 완전히 신뢰할 수 있는 코드와 부분적으로 신뢰할 수 있는 코드를 모두 호스트할 수 있다는 가정을 기반으로 합니다. CLR 코드 액세스 보안으로 보호되는 리소스는 일반적으로 리소스에 대한 액세스를 허용하기 전에 해당 권한이 필요한 관리되는 애플리케이션 프로그래밍 인터페이스에 의해 래핑됩니다. 사용 권한에 대한 요구는 호출 스택의 모든 호출자(어셈블리 수준)에 해당하는 리소스 권한이 있는 경우에만 충족됩니다.
SQL Server 내에서 실행할 때 관리 코드에 부여되는 코드 액세스 보안 권한 집합은 이전의 세 가지 정책 수준에서 부여한 사용 권한 집합의 교집합입니다. SQL Server가 SQL Server에 로드된 어셈블리에 사용 권한 집합을 부여하더라도 사용자 코드에 부여된 최종 권한 집합은 사용자 및 컴퓨터 수준 정책에 의해 추가로 제한될 수 있습니다.
코드 액세스 보안이 지원되지 않음
CLR은 더 이상 보안 경계로 지원되지 않는 .NET Framework의 CAS(코드 액세스 보안)를 사용합니다.
PERMISSION_SET = SAFE로 만든 CLR 어셈블리에서 외부 시스템 리소스에 액세스하고, 비관리 코드를 호출하고, sysadmin 권한을 얻을 수 있습니다. SQL Server 2017(14.x) 이상 버전에서 sp_configure 옵션, clr strict security는 CLR 어셈블리의 보안을 향상시킵니다.
clr strict security는 기본적으로 사용되며 SAFE 및 EXTERNAL_ACCESS 어셈블리가 UNSAFE로 표시된 것처럼 처리됩니다.
clr strict security 옵션은 이전 버전과의 호환성을 위해 사용하지 않도록 설정할 수 있지만 권장하지는 않습니다.
모든 어셈블리는 UNSAFE ASSEMBLY 데이터베이스에서 master 권한이 부여된 해당 로그인이 포함된 인증서 또는 비대칭 키로 서명하는 것이 좋습니다. 또한 SQL Server 관리자는 데이터베이스 엔진에서 신뢰해야 하는 어셈블리 목록에 어셈블리를 추가할 수도 있습니다. For more information, see sys.sp_add_trusted_assembly.
SQL Server 호스트 정책 수준 권한 집합
SQL Server 호스트 정책 수준에서 어셈블리에 부여된 코드 액세스 보안 권한 집합은 어셈블리를 만들 때 지정된 권한 집합에 따라 결정됩니다. There are three permission sets: SAFE, EXTERNAL_ACCESS, and UNSAFE (specified using the PERMISSION_SET option of CREATE ASSEMBLY).
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 |
Execution: 관리 코드를 실행할 수 있는 권한입니다. |
SqlClientPermission |
Context connection = true, context connection = yes: 컨텍스트 연결만 사용할 수 있으며 연결 문자열은 context connection=true 또는 context connection=yes값만 지정할 수 있습니다.AllowBlankPassword = false: 빈 암호는 허용되지 않습니다. |
EXTERNAL_ACCESS
EXTERNAL_ACCESS 어셈블리는 SAFE 어셈블리와 동일한 권한을 가지며 파일, 네트워크, 환경 변수 및 레지스트리와 같은 외부 시스템 리소스에 액세스할 수 있는 추가 기능이 있습니다.
또한 EXTERNAL_ACCESS 어셈블리에는 다음과 같은 사용 권한과 값이 있습니다.
| Permission | 값/설명 |
|---|---|
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_CONFIG및 HKEY_USERS. 읽기 권한을 허용합니다. |
SecurityPermission |
Assertion: 이 코드의 모든 호출자에게 작업에 대한 필수 권한이 있음을 어설션하는 기능입니다.ControlPrincipal: 주 개체를 조작하는 기능입니다.Execution: 관리 코드를 실행할 수 있는 권한입니다.SerializationFormatter: serialization 서비스를 제공하는 기능입니다. |
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 어셈블리는 기본적으로 SQL Server 서비스 계정으로 실행됩니다.
EXTERNAL_ACCESS 코드는 호출자의 Windows 인증 보안 컨텍스트를 명시적으로 가장할 수 있습니다. 기본값은 SQL Server 서비스 계정으로 실행되므로 EXTERNAL_ACCESS 실행할 수 있는 권한은 서비스 계정으로 실행하기 위해 신뢰할 수 있는 로그인에만 부여되어야 합니다.
보안 관점에서 EXTERNAL_ACCESS 및 UNSAFE 어셈블리는 동일합니다. 그러나 EXTERNAL_ACCESS 어셈블리는 UNSAFE 어셈블리에 없는 다양한 안정성 및 견고성 보호를 제공합니다.
UNSAFE 지정하면 어셈블리의 코드가 SQL Server 프로세스 공간에 대해 잘못된 작업을 수행할 수 있으므로 SQL Server의 견고성과 확장성이 손상될 수 있습니다. SQL Server에서 CLR 어셈블리를 만드는 방법에 대한 자세한 내용은 CLR 통합 어셈블리 관리를 참조하세요.
Important
SQL Server에는 데이터베이스 엔진이 특정 기능을 제공하는 데 사용하는 CLR 어셈블리가 포함되어 있습니다. SQL Server 설치에 포함된 Microsoft.SQLServer.Types 어셈블리는 메타데이터에 UNSAFE 어셈블리로 표시됩니다. 이것은 의도적인 것입니다. 이러한 어셈블리는 기본적으로 신뢰할 수 있고 안전한 것으로 간주됩니다.
외부 리소스 액세스
UDT(사용자 정의 형식), 저장 프로시저 또는 기타 유형의 생성 어셈블리가 SAFE 권한 집합에 등록된 경우 구문에서 실행되는 관리 코드가 외부 리소스에 액세스할 수 없습니다. 그러나 EXTERNAL_ACCESS 또는 UNSAFE 권한 집합이 지정되고 관리 코드가 외부 리소스에 액세스하려고 하면 SQL Server는 다음 규칙을 적용합니다.
| If | Then |
|---|---|
| 실행 컨텍스트는 SQL Server 로그인에 해당합니다. | 외부 리소스에 대한 액세스 시도가 거부되고 보안 예외가 발생합니다. |
| 실행 컨텍스트는 Windows 로그인에 해당하며 실행 컨텍스트는 원래 호출자입니다. | 외부 리소스는 SQL Server 서비스 계정의 보안 컨텍스트에서 액세스됩니다. |
| 호출자는 원래 호출자가 아닙니다. | 액세스가 거부되고 보안 예외가 발생합니다. |
| 실행 컨텍스트는 Windows 로그인에 해당하며 실행 컨텍스트는 원래 호출자이며 호출자가 가장됩니다. | Access는 서비스 계정이 아닌 호출자 보안 컨텍스트를 사용합니다. |
사용 권한 집합 요약
다음 차트에는 SAFE, EXTERNAL_ACCESS및 UNSAFE 권한 집합에 부여된 제한 사항과 사용 권한이 요약되어 있습니다.
| Functionality | SAFE |
EXTERNAL_ACCESS |
UNSAFE |
|---|---|---|---|
| 코드 액세스 보안 권한 | Execute only | 실행 및 외부 리소스 액세스 | 제한 없음(P/Invoke 포함) |
| 프로그래밍 모델 제한 | Yes | Yes | No restrictions |
| Verifiability requirement | Yes | Yes | No |
| 로컬 데이터 액세스 | Yes | Yes | Yes |
| 네이티브 코드 호출 기능 | No | No | Yes |
Related content
- CLR 통합 보안
- 호스트 보호 특성 및 CLR 통합 프로그래밍
- CLR 통합 프로그래밍 모델 제한
- CLR 통합 아키텍처 - CLR 호스팅 환경