소유권 체인
여러 데이터베이스 개체가 서로를 순차적으로 액세스하는 경우 이러한 시퀀스를 체인이라고 합니다. 이러한 체인이 독립적으로 존재하지는 않지만 SQL Server가 체인에 있는 링크를 통과할 때 SQL Server는 개체를 개별적으로 액세스할 때와는 달리 구성된 개체에 대한 사용 권한을 평가합니다. 이러한 차이는 보안 관리에 중요한 영향을 줍니다.
소유권 체인을 지정하면 뷰와 같은 하나의 개체에 대해 사용 권한을 설정하여 여러 테이블과 같은 다중 개체에 대한 액세스를 관리할 수 있습니다. 소유권 체인은 또한 사용 권한 검사 생략이 가능한 시나리오에서 약간의 성능 우위를 제공합니다.
체인에서의 사용 권한 검사 방법
체인을 통해 개체를 액세스할 때 SQL Server는 먼저 개체의 소유자와 호출 중인 개체의 소유자를 비교합니다. 이것이 체인에서의 이전 링크입니다. 두 개체의 소유자가 동일하면 참조되는 개체의 사용 권한이 평가되지 않습니다.
소유권 체인의 예
다음 그림에서 July2003 뷰는 Mary의 소유입니다. Mary는 이 뷰에 대한 사용 권한을 Alex에게 부여했습니다. Alex는 이 인스턴스에서 데이터베이스 개체에 대한 다른 사용 권한이 없습니다. Alex가 이 뷰를 선택하면 어떻게 될까요?
Alex가 July2003 뷰에서 SELECT *를 실행하면 SQL Server가 뷰에 대한 사용 권한을 검사하고 Alex에게 이 뷰를 선택할 권한이 있는지 확인합니다.
July2003 뷰에는 SalesXZ 뷰의 정보가 필요합니다. SQL Server는 SalesXZ 뷰의 소유권을 검사합니다. 이 뷰의 소유자는 이 뷰를 호출한 뷰의 소유자(Mary)와 동일하기 때문에 SalesXZ에 대한 사용 권한은 검사되지 않습니다. 필요한 정보가 반환됩니다.
SalesXZ 뷰에는 InvoicesXZ 뷰의 정보가 필요합니다. SQL Server는 InvoicesXZ 뷰의 소유권을 검사합니다. 이 뷰의 소유자는 이전 개체의 소유자와 동일하기 때문에 InvoicesXZ에 대한 사용 권한은 검사되지 않습니다. 필요한 정보가 반환됩니다. 이 시점까지 시퀀스의 모든 항목에는 소유자(Mary)가 하나였습니다. 이러한 상황을 손상되지 않은 소유권 체인이라고 합니다.
InvoicesXZ 뷰에는 AcctAgeXZ 뷰의 정보가 필요합니다. SQL Server는 AcctAgeXZ 뷰의 소유권을 검사합니다. 이 뷰의 소유자는 이전 개체의 소유자(Mary가 아니라 Sam)와 다르기 때문에 이 뷰의 사용 권한에 대한 전체 정보가 검색됩니다. AcctAgeXZ 뷰에 Alex가 액세스할 수 있는 권한이 있으면 정보가 반환됩니다.
AcctAgeXZ 뷰에는 ExpenseXZ 테이블의 정보가 필요합니다. SQL Server는 ExpenseXZ 테이블의 소유권을 검사합니다. 이 테이블의 소유자는 이전 개체의 소유자(Sam이 아니라 Joe)와 다르기 때문에 이 테이블의 사용 권한에 대한 전체 정보가 검색됩니다. ExpenseXZ 테이블에 Alex가 액세스할 수 있는 권한이 있으면 정보가 반환됩니다.
July2003 뷰가 ProjectionsXZ 테이블에서 정보를 검색하려고 시도할 때 서버는 먼저 Database 1과 Database 2 사이에 데이터베이스 간 체인이 설정되어 있는지 여부를 검사합니다. 데이터베이스 간 체인이 설정된 경우 서버는 ProjectionsXZ 테이블의 소유권을 검사합니다. 이 테이블의 소유자는 호출 중인 뷰의 소유자(Mary)와 동일하기 때문에 이 테이블에 대한 사용 권한은 검사되지 않습니다. 요청된 정보가 반환됩니다.
데이터베이스 간 소유권 체인
특정 데이터베이스 간 또는 단일 SQL Server 인스턴스 내의 모든 데이터베이스 간의 소유권 체인을 허용하도록 SQL Server를 구성할 수 있습니다. 데이터베이스 간 소유권 체인은 기본적으로 해제되어 있으며 특별히 필요한 경우가 아니면 설정하지 않아야 합니다.
잠재적 위협
소유권 체인은 데이터베이스의 사용 권한을 관리하는 데 매우 유용하지만 개체 소유자가 모든 의사 결정에 대한 전체 결과로 보안 개체에 사용 권한을 부여한다고 가정합니다. 이전 그림에서 Mary는 July 2003 뷰에 대한 대부분의 기본 개체를 소유합니다. Mary는 자신이 소유하는 개체를 다른 사용자가 액세스할 수 있도록 만들 수 있는 권한이 있기 때문에 SQL Server는 Mary가 체인에서 첫 번째 뷰에 대한 액세스를 부여할 때마다 Mary가 뷰와 뷰를 참조하는 테이블을 공유하는 의식적 결정을 내린 것으로 가정하고 동작합니다. 실제 환경에서 이러한 가정은 잘못된 가정일 수 있습니다. 프로덕션 데이터베이스는 그림에 표시된 것보다 상당히 복잡할 수 있으며, 이에 대한 액세스를 제어하는 권한은 이를 사용하는 조직의 관리 구조에 완벽하게 일치하는 경우가 드뭅니다.
사용 권한이 많은 데이터베이스 역할의 멤버는 데이터베이스 간 소유권 체인을 사용하여 자신의 데이터베이스 외부의 데이터베이스 개체를 액세스할 수 있습니다. 예를 들어 데이터베이스 A와 데이터베이스 B 사이에 데이터베이스 간 소유권 체인이 설정된 경우 두 데이터베이스 중 하나의 db_owner 고정 데이터베이스 역할의 멤버는 다른 데이터베이스에 대한 자신의 경로를 속일 수 있습니다. 그 과정은 간단합니다. 데이터베이스 A의 db_owner 멤버인 Diane이 데이터베이스 A에 사용자 Stuart를 만듭니다. Stuart는 이미 데이터베이스 B에 사용자로 존재합니다. 그런 다음 Diane은 Stuart가 데이터베이스 B에서 소유하고 있는 임의의 개체를 호출하는 개체(Stuart가 소유)를 데이터베이스 A에 만듭니다. 호출 중인 개체와 호출되는 개체의 소유자가 동일하기 때문에 Diane이 만든 개체를 통해 Daine이 데이터베이스 B의 개체를 액세스하면 이 데이터베이스의 개체에 대한 사용 권한이 검사되지 않습니다.