TRUSTWORTHY 데이터베이스 속성

적용 대상:SQL ServerAzure SQL Managed Instance

데이터베이스 속성은 TRUSTWORTHY SQL Server 인스턴스가 데이터베이스와 그 안의 내용을 신뢰하는지 여부를 나타냅니다. 기본값은 이 설정이OFF지만, 문 ALTER DATABASE 장을 사용해 로 ON 설정할 수 있습니다.

다음은 그 예입니다.

ALTER DATABASE AdventureWorks2025 SET TRUSTWORTHY ON;

참고

이 옵션을 설정하려면 CONTROL SERVER 권한이 있거나 sysadmin 고정 서버 역할의 멤버여야 합니다.

특정 위협을 완화하기 위해 데이터베이스 속성을 .로 설정OFF해 두 TRUSTWORTHY 세요. 이러한 위협은 다음 객체 중 하나를 포함하는 데이터베이스를 첨부함으로써 발생할 수 있습니다:

  • 또는 UNSAFE 권한 설정이 있는 EXTERNAL_ACCESS 악성 어셈블리. 자세한 내용은 CLR 통합 보안을 참조하세요.

  • 고도로 권한을 가진 사용자로 실행되도록 정의된 악성 모듈. 자세한 내용은 조항을 참조하세요EXECUTE AS.

두 경우 모두 특정 권한 수준이 필요하며, 이미 SQL Server 인스턴스에 연결된 데이터베이스 맥락에서 적절한 메커니즘으로 보호받습니다. 하지만 데이터베이스가 오프라인 상태인 경우 데이터베이스 파일에 액세스 할 수 있는 사용자가 자신이 선택한 SQL Server 인스턴스에 데이터베이스를 연결하고 악의적인 콘텐츠를 추가할 수 있습니다. 데이터베이스가 분리되어 SQL Server에 연결되면 데이터베이스 파일에 대한 액세스를 제한하는 데이터 및 로그 파일에 대해 특정 권한이 설정됩니다.

SQL Server 인스턴스에 연결된 데이터베이스는 즉시 신뢰할 수 없기 때문에, 데이터베이스가 명시적으로 신뢰할 수 있다고 표시되기 전까지는 데이터베이스의 범위를 넘어선 자원에 접근할 수 없습니다. 따라서 해당 옵션이 ON 있는 TRUSTWORTHY 데이터베이스를 백업하거나 분리하고, 동일하거나 다른 SQL Server 인스턴스에 첨부하거나 복원하면, TRUSTWORTHY 해당 속성은 첨부 또는 복원이 완료될 때 로 OFF 설정됩니다. 또한, 데이터베이스 외부의 자원에 접근하도록 설계된 모듈과 OR UNSAFE 권한 설정을 가진 EXTERNAL_ACCESS 어셈블리는 성공적으로 실행되기 위해 추가 요구사항이 있습니다.

참고

기본값으로는 TRUSTWORTHY 데이터베이스 설정 msdb 이 로 ON 설정되어 있습니다. 이 설정을 기본값에서 변경하면 msdb 데이터베이스를 사용하는 SQL Server 구성 요소에서 예기치 않은 동작이 발생할 수 있습니다.

설정을 로 설정 TRUSTWORTHYON하고, 데이터베이스 소유자가 시스템 관리자 그룹과 같은 관리 자격 증명을 가진 그룹의 멤버라면, 데이터베이스 소유자는 SQL Server 인스턴스를 위험에 빠뜨릴 수 있는 안전하지 않은 어셈블리를 생성하고 실행할 수 있습니다.

비고

웹 호스팅 서비스와 같은 인터넷 서비스 제공업체(ISP) 환경에서는 각 고객이 자신의 데이터베이스를 관리하며 시스템 데이터베이스나 다른 사용자 데이터베이스에 접근할 수 없습니다. 예를 들어, ISP는 두 경쟁 기업의 데이터베이스를 동일한 SQL Server 인스턴스에서 호스팅할 수 있습니다. 사용자 데이터베이스를 원래 인스턴스에 첨부하면 위험한 코드를 사용자 데이터베이스에 추가할 수 있습니다. 데이터베이스를 ISP 인스턴스에 배포하면 코드가 활성화됩니다. 이 시나리오는 데이터베이스 간 접근 통제를 매우 중요하게 만듭니다.

동일한 일반 법인이 각 데이터베이스를 소유하고 관리한다면, 데이터베이스 간 서비스 브로커 통신과 같은 애플리케이션 특화 기능이 필요하지 않는 한 데이터베이스와 신뢰 관계를 구축하는 것은 여전히 좋은 관행이 아닙니다. 데이터베이스 간 신뢰 관계를 구축하려면 데이터베이스 간 소유권 체인을 활성화하거나, 속성을 사용하는 TRUSTWORTHY 인스턴스가 데이터베이스를 신뢰받는 것으로 표시함으로써 가능합니다. 카탈로그 뷰의 sys.databases 열은 is_trustworthy_on 데이터베이스가 속성 세트를 가지고 TRUSTWORTHY 있는지 여부를 나타냅니다.

데이터베이스 소유권 및 신뢰에 대한 모범 사례는 다음과 같습니다.

  • 데이터베이스에 대한 고유한 소유자가 있습니다. 시스템 관리자가 모든 데이터베이스를 소유해야 하는 것은 아닙니다.

  • 각 데이터베이스의 소유자 수를 제한합니다.

  • 트러스트를 선택적으로 부여합니다.

  • 여러 데이터베이스를 하나의 유닛으로 배포하지 않는 한, 크로스 DB 소유권 체인 설정은 계속 OFF 설정하세요.

  • TRUSTWORTHY 속성을 사용하는 대신 선택적 신뢰로 사용량을 마이그레이션합니다.

다음 예시Transact-SQL 속성이 설정된 ON 데이터베이스 TRUSTWORTHY 목록을 반환하며, 그 데이터베이스 소유자가 시스템 관리자 고정 서버 역할에 속합니다.

SELECT SUSER_SNAME(owner_sid) AS DBOWNER,
       d.name AS DATABASENAME
FROM sys.server_principals AS r
     INNER JOIN sys.server_role_members AS m
         ON r.principal_id = m.role_principal_id
     INNER JOIN sys.server_principals AS p
         ON p.principal_id = m.member_principal_id
     INNER JOIN sys.databases AS d
         ON suser_sname(d.owner_sid) = p.name
WHERE is_trustworthy_on = 1
      AND d.name NOT IN ('msdb')
      AND r.type = 'R'
      AND r.name = N'sysadmin';
GO

다음 예시는 데이터베이스의 msdb 속성을 결정합니다TRUSTWORTHY.

SELECT name,
       CASE is_trustworthy_on
           WHEN 1 THEN 'Trustworthy setting is ON for msdb'
           ELSE 'Trustworthy setting is OFF for msdb'
       END AS trustworthy_setting
FROM sys.databases
WHERE database_id = 4;
GO

만약 이 쿼리에서 속성이 TRUSTWORTHY 에 대해 설정 OFFmsdb되어 있다면, 다음 쿼리를 실행하여 기본값 ON인 로 복원할 수 있습니다.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

보안 경고

속성이 TRUSTWORTHY 존재 ON하고 데이터베이스 소유자가 시스템 관리자 고정 서버 역할의 멤버일 때, db_owner 고정 데이터베이스 역할의 구성원은 자신의 권한을 시스템 관리자로 올릴 수 있습니다. 두 조건 모두 필수입니다. 부동산에 대해 TRUSTWORTHY 주의하세요.

다음 Transact-SQL 코드는 고정된 데이터베이스 역할을 부여받은 데이터베이스 사용자 목록을 반환 db_owner .

SELECT roles.principal_id AS RolePrincipalID,
       roles.name AS RolePrincipalName,
       database_role_members.member_principal_id AS MemberPrincipalID,
       members.name AS MemberPrincipalName
FROM sys.database_role_members AS database_role_members
     INNER JOIN sys.database_principals AS roles
         ON database_role_members.role_principal_id = roles.principal_id
     INNER JOIN sys.database_principals AS members
         ON database_role_members.member_principal_id = members.principal_id
WHERE roles.name = 'db_owner'
      AND members.name <> 'dbo';
GO