SQL CLR을 사용한 보안 또는 성능 위험


11

SQL Server에서 CLR을 사용할 때 특별한 보안 또는 성능 위험이 있습니까?


아니요, SQLCLR 코드는 동일한 보안 컨텍스트에서 실행되는 동등한 T-SQL 코드 모듈보다 데이터베이스에서 더 많은 작업을 수행 할 수 없습니다. CLR을 무단으로 금지하면 SSISDB 배포가 방지되어 RDP 계정 감소, 파일 시스템 관리 및 권한 요구 감소, 유지 관리 계획 내 백업 상속, TDE를 통한 전체 패키지 암호화, 환경 섹션을 통한 SSIS 패키지 배포 및 유지 관리에 대한 모든 내용을 통해 보안이 크게 향상됩니다. CSIS가 필요한 SSIS에는 SSISDB의 많은 C # 함수가 부족합니다.
브라이언 스완

1
이 질문이 커뮤니티와 관련이 있다고 생각하기 때문에이 질문을 다시 열기로 투표했습니다. CLS 보안 설정에 대한 DBA의 입력 레벨이 매우 높기 때문에 문제는 올바른 질문입니다. @SolomonRutzky의 잘 작성된 답변은 Microsoft가 단순한 수준으로 제공하지 않는 CLR의 보안 설정에 대한 좋은 소개를 제공합니다.
John aka hot2use

답변:


10

Remus가 지적했듯이 질문은 답변이 사용되는 기능의 컨텍스트와 사용 방법에 따라 달라지기 때문에 답변을 얻기에는 너무 일반적입니다.

"보안"에 관하여 :

로 표시된 어셈블리에서 수행 할 수있는 작업에 대해 질문하는 경우 PERMISSION_SET = SAFE내가 찾은 문제가 없습니다. 그리고 SQLCLR은 사용 xp_cmdshell하거나 멋진 (비꼬 인) sp_OA*procs (혹은 확장 저장 프로 시저 (Extended Stored Procedures ))를 사용 하는 것보다 "더 안전하다" .

"SAFE"가 실제로 의미하는 바를 살펴 보려면 SQLCLR 계단 3 : 보안 (일반 및 SAFE 어셈블리)의 계단 (무료 등록 필요) 문서를 참조하십시오 .

로 표시된 어셈블리에서 수행 할 수있는 작업에 대해 묻는 경우 PERMISSION_SET = EXTERNAL_ACCESS사용중인 기능에 따라 다시 위험이 있습니다. 디렉토리와 파일 이름을 읽는 루틴을 작성하면 (즉, 읽기 전용),보아야 할 것과 보이지 않는 것의 문제 일뿐입니다. 파일을 삭제할 수있는 코드를 작성하면 위험이 증가합니다. 그러나 이러한 외부 리소스로 수행 할 수 있는 작업은 다음에 의해 제어됩니다.

  • 가장을 사용하는지 여부 :
    • 가장은 SQL Server 서비스의 "로그온 계정"계정을 통해 외부 리소스에 액세스하는 것을 의미합니다. 해당 계정이 액세스 할 수있는 모든 SQLCLR 기능이 가능합니다.
    • 가장을 사용한다는 것은 해당 로그인이 Windows 로그인에 해당하는 경우 함수를 실행하는 SQL Server의 로그인이 특정 Windows 로그인이 허용하는 모든 작업을 수행 할 수 있음을 의미합니다. SQL Server의 로그인이 SQL Server 로그인 인 경우 가장을 사용하려고하면 오류가 발생합니다.
  • 외부 리소스에 어떤 권한이 설정되어 있습니까? 파일 시스템 액세스의 경우 NTFS 드라이브의 ACL을 통해 제어됩니다.

로 표시된 어셈블리에서 수행 할 수있는 작업에 대해 질문하는 경우 PERMISSION_SET = UNSAFE, 그것은 상당히 개방적입니다. 많은 기능은 보안 또는 성능 이상의 안정성 및 / 또는 일관된 동작 문제이므로 UNSAFE 어셈블리에서만 사용할 수있는 것으로 간주됩니다. 예를 들어 UNSAFE 어셈블리에서 쓰기 가능한 정적 변수를 가질 수 있습니다. SQLCLR 클래스가 모든 세션에서 공유되므로 일반적으로이 방법은 좋지 않습니다. 모든 세션에서 메모리의 데이터를 공유하고 경쟁 조건을 계획하고 (많은 테스트를 수행하려는 경우)이 동작을 예상하는 것이 좋습니다. 그러나 단순히 특정 세션에 대한 값을 캐시하여 다시 조회하거나 다시 계산할 필요가없는 쓰기 가능한 정적 변수를 원했고 다른 세션이 해당 값을 읽고 덮어 쓸 수 있다는 것을 알지 못하는 경우, 그것은 문제가 될 것입니다.

그러나 누군가 레지스트리에 쓰는 것이 걱정되지만 실제로 레지스트리에 쓰는 코드가 없다면 걱정할 필요가 없습니다. ;-).

EXTERNAL_ACCESS 및 UNSAFE가 실제 용어로 작동하는 방식과 TRUSTWORTHY ON비대칭 키 또는 인증서 기반 로그인 사용과 설정 (권장하지 않음) 의 차이점을 살펴 보려면 SQLCLR 레벨 4의 계단을 참조하십시오 . 보안 (외부 및 UNSAFE 어셈블리) (무료 등록 필요).

"성능"에 관하여 :

이것은 모두 당신이하려는 일과 그것을하는 방법에 관한 문제입니다. 몇 가지 일들이 있습니다 훨씬 빠른 SQLCLR, 그리고 느린 몇 가지. 그러나 T-SQL과 마찬가지로 다소 간단하고 효율적인 작업을 수행하고 잘못 수행하여 복잡하고 비효율적으로 만들 수 있습니다. 그러나 SQL CLR을 사용하는 것이 본질적으로 느리지는 않습니다.


6

SQLCLR 어셈블리는 세 가지 보안 액세스 수준으로 설치할 수 있습니다 SAFE | EXTERNAL_ACCESS | UNSAFE. 이것은 충분히 문서화되어 CREATE ASSEMBLY있으며 어셈블리 디자인 및 참조 :

어셈블리 보안
관리 관리 코드를 실행할 때 어셈블리가 .NET 코드 액세스 보안으로 보호되는 리소스에 액세스 할 수있는 양을 제어 할 수 있습니다. 어셈블리를 만들거나 수정할 때 SAFE, EXTERNAL_ACCESS 또는 UNSAFE의 세 가지 권한 집합 중 하나를 지정하면됩니다.

SAFE
SAFE가 기본 권한 집합이며 가장 제한적입니다. SAFE 권한이있는 어셈블리에서 실행 한 코드는 파일, 네트워크, 환경 변수 또는 레지스트리와 같은 외부 시스템 리소스에 액세스 할 수 없습니다. SAFE 코드는 로컬 SQL Server 데이터베이스의 데이터에 액세스하거나 로컬 데이터베이스 외부의 리소스에 액세스하지 않는 계산 및 비즈니스 논리를 수행 할 수 있습니다.
대부분의 어셈블리는 SQL Server 외부의 리소스에 액세스 할 필요없이 계산 및 데이터 관리 작업을 수행합니다. 따라서 어셈블리 권한 집합으로 SAFE를 권장합니다.

EXTERNAL_ACCESS
EXTERNAL_ACCESS를 사용하면 어셈블리가 파일, 네트워크, 웹 서비스, 환경 변수 및 레지스트리와 같은 특정 외부 시스템 리소스에 액세스 할 수 있습니다. EXTERNAL ACCESS 권한이있는 SQL Server 로그인 만 EXTERNAL_ACCESS 어셈블리를 작성할 수 있습니다. SAFE 및 EXTERNAL_ACCESS 어셈블리는 형식적으로 안전한 코드 만 포함 할 수 있습니다. 이는 이러한 어셈블리가 형식 정의에 유효한 잘 정의 된 진입 점을 통해서만 클래스에 액세스 할 수 있음을 의미합니다. 따라서 코드에서 소유하지 않은 메모리 버퍼에 임의로 액세스 할 수 없습니다. 또한 SQL Server 프로세스의 견고성에 부정적인 영향을 줄 수있는 작업을 수행 할 수 없습니다.

UNSAFE
UNSAFE는 어셈블리에 SQL Server 내부 및 외부의 리소스에 대한 무제한 액세스를 제공합니다. UNSAFE 어셈블리 내에서 실행되는 코드는 관리되지 않는 코드를 호출 할 수 있습니다. 또한 UNSAFE를 지정하면 어셈블리의 코드가 CLR 검증 자에 의해 형식이 안전하지 않은 것으로 간주되는 작업을 수행 할 수 있습니다. 이러한 조작은 제어되지 않은 방식으로 SQL Server 프로세스 공간의 메모리 버퍼에 액세스 할 수 있습니다. UNSAFE 어셈블리는 SQL Server 또는 공용 언어 런타임의 보안 시스템을 잠재적으로 파괴 할 수도 있습니다. UNSAFE 권한은 숙련 된 개발자 또는 관리자가 신뢰하는 어셈블리에만 부여해야합니다. sysadmin 고정 서버 역할의 멤버 만 UNSAFE 어셈블리를 만들 수 있습니다.

허용 된 CLR 속성에 대한 추가 제한 사항이 있으며 .Net Framework 어셈블리의 하위 집합 만 지원됩니다. 다시, 링크 된 문서를 참조하십시오.

성능면에서 가장 중요한 생각은 SQL Server는 공동 멀티 태스킹 환경이지만 CLR은 그렇지 않다는 것입니다. SQLCLR 코드 Thread.BeginThreadAffinity() 블로킹을 포함하여 모든 시간 동안 CPU를 사용할 때마다 호출 해야합니다 . Adam Machanic은 Data, Faster : SQLCLR을 사용한 Microsoft SQL Server 성능 기법 에 대한 주제를 훌륭하게 소개합니다 .

주제는 광대하고 질문은 모호합니다. SQLCLR은 다른 기능과 비교할 수없는 고유 한 작업을 수행 할 수 있습니다. 그리고 SQLCLR은 SQL Server 무기고의 또 다른 무기 일뿐 아니라 성능, 보안 등을 직접 경험할 수 있습니다. 설명서를 읽으십시오.


이 Remus에 감사드립니다. 질문이 모호하다는 것을 알고 있지만 이에 관한 보안 문제가 있습니까? 감사합니다
SQLBen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.