TRUSTWORTHY 데이터베이스 속성

적용 대상:SQL ServerAzure SQL Managed Instance

TRUSTWORTHY 데이터베이스 속성은 SQL Server 인스턴스가 데이터베이스와 데이터베이스 내의 내용을 신뢰하는지 여부를 나타내는 데 사용됩니다. 기본적으로 이 설정은 OFF이지만 문을 사용하여 ALTER DATABASE ON으로 설정할 수 있습니다. 예: ALTER DATABASE AdventureWorks2022 SET TRUSTWORTHY ON;.

참고 항목

이 옵션을 설정하려면 sysadmin 고정 서버 역할의 멤버여야 합니다.

다음 개체 중 하나가 포함된 데이터베이스를 TRUSTWORTHY 연결한 결과로 존재할 수 있는 특정 위협을 완화하려면 데이터베이스 속성을 OFF로 설정하는 것이 좋습니다.

  • EXTERNAL_ACCESS 또는 UNSAFE 권한 설정이 있는 악의적인 어셈블리입니다. 자세한 내용은 CLR Integration Security을 참조하세요.

  • 고급 권한 사용자로 실행하도록 정의된 악의적인 모듈. 자세한 내용은 EXECUTE AS 절(Transact-SQL)을 참조하세요.

두 경우 모두 특정 수준의 권한이 필요하며 SQL Server 인스턴스에 이미 연결된 데이터베이스의 컨텍스트에서 사용되는 경우 적절한 메커니즘으로 보호됩니다. 그러나 데이터베이스가 오프라인으로 전환되는 경우 데이터베이스 파일에 액세스할 수 있는 경우 원하는 SQL Server 인스턴스에 데이터베이스를 연결하고 악의적인 콘텐츠를 데이터베이스에 추가할 수 있습니다. 데이터베이스가 분리되어 SQL Server에 연결되면 데이터베이스 파일에 대한 액세스를 제한하는 데이터 및 로그 파일에 대해 특정 권한이 설정됩니다.

SQL Server 인스턴스에 연결된 데이터베이스는 즉시 신뢰할 수 없으므로 데이터베이스가 명시적으로 신뢰할 수 있는 것으로 표시될 때까지 데이터베이스가 데이터베이스 범위를 벗어나는 리소스에 액세스할 수 없습니다. 따라서 ON 옵션이 있는 TRUSTWORTHY 데이터베이스를 백업하거나 분리하고 데이터베이스를 동일하거나 다른 SQL Server 인스턴스 TRUSTWORTHY 에 연결하거나 복원하는 경우 연결 또는 복원이 완료되면 속성이 OFF로 설정됩니다. 또한 데이터베이스 외부의 리소스에 액세스하도록 설계된 모듈과 EXTERNAL_ACCESS 및 UNSAFE 권한 설정이 있는 어셈블리에는 성공적으로 실행하기 위한 추가 요구 사항이 있습니다.

참고 항목

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

설정이 TRUSTWORTHY ON으로 설정되어 있고 데이터베이스 소유자가 sysadmin 그룹과 같은 관리 자격 증명이 있는 그룹의 구성원인 경우 데이터베이스 소유자는 SQL Server 인스턴스를 손상시킬 수 있는 안전하지 않은 어셈블리를 만들고 실행할 수 있습니다.

추가 정보

ISP(인터넷 서비스 공급자) 환경(예: 웹 호스팅 서비스)에서 각 고객은 자체 데이터베이스를 관리할 수 있으며 시스템 데이터베이스 및 기타 사용자 데이터베이스에 액세스할 수 없습니다. 예를 들어 두 경쟁 회사의 데이터베이스는 동일한 ISP에서 호스트될 수 있으며 SQL Server의 동일한 인스턴스에 존재할 수 있습니다. 데이터베이스가 원래 인스턴스에 연결되면 위험한 코드를 사용자 데이터베이스에 추가할 수 있으며 데이터베이스가 배포될 때 ISP 인스턴스에서 코드가 사용하도록 설정됩니다. 이 경우 데이터베이스 간 액세스를 제어하는 것이 중요합니다.

동일한 일반 엔터티가 각 데이터베이스를 소유하고 관리하는 경우 데이터베이스 간 Service Broker 통신과 같은 애플리케이션별 기능이 필요하지 않는 한 데이터베이스와 트러스트 관계를 설정하는 것은 좋지 않습니다. 데이터베이스 간 소유권 체인을 사용하도록 설정하거나 속성을 사용하여 TRUSTWORTHY 데이터베이스를 인스턴스에서 신뢰할 수 있는 데이터베이스로 표시하여 데이터베이스 간의 트러스트 관계를 설정할 수 있습니다. 카탈로그 뷰의 sys.databases 열은 is_trustworthy_on 데이터베이스에 속성 TRUSTWORTHY 집합이 있는지를 나타냅니다.

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

  • 데이터베이스에 대한 고유한 소유자가 있습니다. 시스템 관리자가 모든 데이터베이스를 소유해야 하는 것은 아닙니다.
  • 각 데이터베이스의 소유자 수를 제한합니다.
  • 트러스트를 선택적으로 부여합니다.
  • 여러 데이터베이스가 단일 단위로 배포되지 않는 한 교차 db 소유권 체인 설정을 OFF로 설정합니다.
  • 속성을 사용하는 대신 선택적 신뢰로 사용량을 마이그레이션합니다 TRUSTWORTHY .

다음 코드 샘플을 사용하여 속성이 TRUSTWORTHY ON으로 설정되고 데이터베이스 소유자가 sysadmin 서버 역할에 속하는 데이터베이스 목록을 가져올 수 있습니다.

SELECT SUSER_SNAME(owner_sid) AS DBOWNER,
    d.name AS DATABASENAME
FROM sys.server_principals r
INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id
INNER JOIN sys.server_principals p ON p.principal_id = m.member_principal_id
INNER JOIN sys.databases 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

다음 쿼리를 실행하여 데이터베이스의 TRUSTWORTHYmsdb 속성을 확인할 수 있습니다.

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

이 쿼리에서 TRUSTWORTHY 속성이 OFF로 설정되어 있음을 보여 주는 경우 다음 쿼리를 실행하여 속성을 ON으로 설정할 TRUSTWORTHY 수 있습니다.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

경고

ON으로 설정할 TRUSTWORTHY 때 역할이 있는 사용자를 db_owner 상승시키는 sysadmin 방법이 있습니다. 속성을 사용할 때는 주의해야 합니다 TRUSTWORTHY . 다음 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  
JOIN sys.database_principals AS roles  
   ON database_role_members.role_principal_id = roles.principal_id  
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

다음 단계