다음을 통해 공유


TRUSTWORTHY 데이터베이스 속성

적용 대상: SQL Server Azure SQL Managed Instance

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

노트

이 옵션을 설정하려면 sysadmin 고정 서버 역할의 구성원이어야 합니다.

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

  • EXTERNAL_ACCESS 또는 UNSAFE 권한 집합이 있는 악의적인 어셈블리 입니다. 더 자세한 정보는 CLR 통합 보안을 참조하세요.

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

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

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

노트

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

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

자세한 정보

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

동일한 일반 엔터티가 각 데이터베이스를 소유하고 관리하는 경우 데이터베이스 간 Service Broker 통신과 같은 응용 프로그램별 기능이 필요하지 않는 한 데이터베이스와 트러스트 관계를 설정하는 것은 좋지 않습니다. 데이터베이스 간 소유권 체인을 사용하도록 설정하거나 속성을 사용하여 TRUSTWORTHY 데이터베이스를 instance에서 신뢰할 수 있는 데이터베이스로 표시하여 데이터베이스 간의 트러스트 관계를 설정할 수 있습니다. 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

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

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로 설정되어 있음을 보여 주는 경우, 다음 쿼리를 실행하여 TRUSTWORTHY 속성을 ON으로 설정할 수 있습니다.

ALTER DATABASE msdb SET TRUSTWORTHY ON;
GO

경고

TRUSTWORTHY ON으로 sysadmin 설정할 때 db_owner 역할이 있는 사용자를 상승시키는 방법이 있습니다. TRUSTWORTHY 속성을 사용할 때는 주의해야 합니다. 다음 SQL Code를 사용하여 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

다음 단계