적용 대상: SQL Server
Azure SQL 데이터베이스
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System(PDW)
사용자가 소유하고 있거나 사용 권한을 부여 받은 보안 개체에 대해서만 메타데이터를 볼 수 있습니다.
예를 들어, 사용자가 테이블 myTable
에 SELECT
또는 INSERT
과 같은 권한을 부여하면, 다음 쿼리는 행을 반환합니다.
SELECT name, object_id
FROM sys.tables
WHERE name = N'myTable';
GO
그러나 사용자에게 권한이 myTable
없는 경우 쿼리는 빈 결과 집합을 반환합니다.
메타데이터 표시 유형 구성의 범위 및 영향
메타데이터 표시 유형 구성은 다음 보안 개체에만 적용됩니다.
- 카탈로그 뷰
- 기본 제공 함수를 노출하는 메타데이터
- 호환성 뷰
- 데이터베이스 엔진
sp_help
저장 프로시저 - 정보 스키마 뷰
- 확장 속성
메타데이터 표시 유형 구성은 다음 보안 개체에 적용되지 않습니다.
- 로그 전달 시스템 테이블
- 데이터베이스 유지 관리 플랜 시스템 테이블
- 복제 시스템 테이블
- SQL Server 에이전트 시스템 테이블
- 백업 시스템 테이블
- 복제 및 SQL Server 에이전트
sp_help
저장 프로시저
제한된 메타데이터 접근성은 다음을 의미합니다.
- 시스템 뷰에 대한 쿼리는 행의 하위 집합이나 일부 경우에는 빈 결과 집합을 반환합니다.
- OBJECTPROPERTYEX와 같은 메타데이터 내보내기 기본 제공 함수가 반환
NULL
될 수 있습니다. - 데이터베이스 엔진
sp_help
저장 프로시저는 행의 하위 집합이나NULL
만 반환할 수 있습니다. - 따라서 공용 메타데이터 액세스를 가정하는 애플리케이션이 중단됩니다.
저장 프로시저 및 트리거와 같은 SQL 모듈은 호출자의 보안 컨텍스트에서 실행되므로 메타데이터 접근성이 제한됩니다. 예를 들어 다음 코드에서 저장 프로시저가 호출자에게 권한이 없는 테이블 myTable
의 메타데이터에 액세스하려고 하면 빈 결과 집합이 반환됩니다. SQL Server의 이전 릴리스에서는 행이 반환됩니다.
CREATE PROCEDURE assumes_caller_can_access_metadata
BEGIN
SELECT name, object_id
FROM sys.objects
WHERE name = N'myTable';
END;
GO
호출자가 메타데이터를 볼 수 있도록 허용하려면 호출자 VIEW DEFINITION
권한 또는 SQL Server 2022(16.x) 이상 버전에서 개체 수준, 데이터베이스 수준 또는 VIEW SECURITY DEFINITION
서버 수준과 같은 적절한 범위에서 VIEW PERFORMANCE DEFINITION
권한을 부여할 수 있습니다. 따라서 이전 예제에서 호출자에 대한 VIEW DEFINITION
권한이 있는 경우 저장 프로시저는 myTable
행을 반환합니다. 자세한 내용은 GRANT 및 GRANT 데이터베이스 사용 권한을 참조하세요.
또한 소유자의 자격 증명에 따라 실행되도록 저장 프로시저를 수정할 수 있습니다. 프로시저 소유자와 테이블 소유자가 같은 경우 소유권 체인이 적용되며 프로시저 소유자의 보안 컨텍스트로 myTable
에 대한 메타데이터에 액세스할 수 있습니다. 이 시나리오에서 다음 코드는 호출자에게 메타데이터 행을 반환합니다.
참고 항목
다음 예제에서는 sys.sysobjects 호환성 보기 대신 sys.objects 카탈로그 보기를 사용합니다.
CREATE PROCEDURE does_not_assume_caller_can_access_metadata
WITH EXECUTE AS OWNER
AS
BEGIN
SELECT name, object_id
FROM sys.objects
WHERE name = N'myTable';
END
GO
참고 항목
호출자의 보안 컨텍스트로 일시적으로 전환하는 데 사용할 EXECUTE AS
수 있습니다. 자세한 내용은 EXECUTE AS를 참조하세요.
메타데이터 표시 유형 구성의 이점 및 제한
메타데이터 표시 유형 구성은 전체 보안 계획에서 중요한 역할을 할 수 있습니다. 하지만 경우에 따라서는 결정권을 가진 사용자가 일부 메타데이터를 공개할 수도 있습니다. 메타데이터 권한을 여러 심층 방어 중 하나로 배포하는 것이 좋습니다.
이론적으로 쿼리에서 조건자 평가 순서를 조작하여 오류 메시지에서 메타데이터를 강제로 배출할 수 있습니다. 이러한 시행착오 공격의 가능성은 SQL Server와 관련이 없습니다. 관계형 대수에서 허용되는 결합 및 통근 변환에 의해 암시됩니다. 오류 메시지에 반환되는 정보를 제한하여 이 위험을 줄일 수 있습니다. 이러한 방식으로 메타데이터의 표시 유형을 추가로 제한하려면 추적 플래그 3625로 서버를 시작할 수 있습니다. 이 추적 플래그는 오류 메시지에 표시되는 정보를 제한하므로 그러면 강제 공개를 방지하는 데 도움이 됩니다. 단점은 오류 메시지가 복잡하며 디버깅을 위해 사용하기 어려울 수 있다는 것입니다. 자세한 내용은 데이터베이스 엔진 서비스 시작 옵션 및 추적 플래그를 참조하세요.
다음 메타데이터는 강제 공개 대상이 아닙니다.
provider_string
의sys.servers
열에 저장된 값입니다.ALTER ANY LINKED SERVER
권한이 없는 사용자는 이 열에NULL
값이 표시됩니다.저장 프로시저 또는 트리거와 같은 사용자 정의 개체의 원본 정의입니다. 소스 코드는 다음 조건 중 하나가 true인 경우에만 표시됩니다.
사용자에게
VIEW DEFINITION
개체에 대한 권한이 있습니다.사용자가 개체에 대해
VIEW DEFINITION
권한이 거부되지 않았고CONTROL
,ALTER
, 또는TAKE OWNERSHIP
권한을 가지고 있습니다. 다른 모든 사용자는NULL
를 봅니다.
다음 카탈로그 보기에 있는 정의 열입니다.
sys.all_sql_modules
sys.server_sql_modules
sys.default_constraints
sys.numbered_procedures
sys.sql_modules
sys.check_constraints
sys.computed_columns
ctext
호환성 보기의syscomments
열입니다.sp_helptext
프로시저의 출력입니다.정보 스키마 보기에 있는 다음 열입니다.
INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE
INFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULT
INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION
INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT
INFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULT
INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
OBJECT_DEFINITION()
기능password_hash
의sys.sql_logins
열에 저장된 값입니다.CONTROL SERVER
또는 SQL Server 2022(16.x) 이상의 경우,VIEW ANY CRYPTOGRAPHICALLY SECURED DEFINITION
권한이 없는 사용자는 이 열에서NULL
값을 확인할 수 있습니다.
기본 제공 시스템 프로시저 및 함수의 SQL 정의는 sys.system_sql_modules
카탈로그 뷰, sp_helptext
저장 프로시저, OBJECT_DEFINITION()
함수를 통해 공개적으로 표시됩니다.
참고 항목
시스템 저장 프로시저 sp_helptext
는 Azure Synapse Analytics에서 지원되지 않습니다. 대신 sys.sql_modules
개체 카탈로그 뷰를 사용하세요.
메타데이터 표시 유형에 대한 일반적인 원칙
다음은 메타데이터 표시 유형과 관련하여 고려해야 할 몇 가지 일반적인 원칙입니다.
- 고정 역할 암시적 권한
- 권한 범위
-
DENY
의 우선순위 - 하위 구성 요소 메타데이터의 표시 유형
고정 역할 및 암시적 권한
고정 역할에서 액세스할 수 있는 메타데이터는 해당하는 암시적 권한에 따라 달라집니다.
권한 범위
한 범위의 권한은 해당 범위 및 모든 포함된 범위에서 메타데이터를 볼 수 있는 기능을 의미합니다. 예를 들어 SELECT
스키마에 대한 권한은 SELECT
수령인이 해당 스키마에 포함된 모든 보안 개체에 대한 권한이 있음을 의미합니다. 따라서 스키마에 대한 사용 권한을 부여 SELECT
하면 사용자는 스키마의 메타데이터와 모든 테이블, 뷰, 함수, 프로시저, 큐, 동의어, 형식 및 XML 스키마 컬렉션도 볼 수 있습니다. 범위에 대한 자세한 내용은 사용 권한 계층 구조(데이터베이스 엔진)를 참조하세요.
참고 항목
UNMASK
권한은 메타데이터 가시성에 영향을 주지 않습니다. UNMASK
권한을 부여하는 것만으로 메타데이터가 공개되지 않습니다.
UNMASK
이 항상 영향력을 가지려면 반드시 SELECT
권한이 함께 동반되어야 합니다. 예: 데이터베이스 범위를 부여 UNMASK
하고 개별 테이블에 부여하면 SELECT
사용자가 선택할 수 있는 개별 테이블의 메타데이터만 볼 수 있고 다른 테이블은 볼 수 없습니다.
DENY 선행 조건
DENY
일반적으로 다른 권한보다 우선합니다. 예를 들어 데이터베이스 사용자에게 스키마에 대한 사용 권한이 부여 EXECUTE
되었지만 해당 스키마의 저장 프로시저에 대한 사용 권한이 거부된 EXECUTE
경우 사용자는 해당 저장 프로시저에 대한 메타데이터를 볼 수 없습니다.
또한 사용자가 스키마에 대한 사용 권한이 거부 EXECUTE
되었지만 해당 스키마의 저장 프로시저에 대한 사용 권한이 부여된 EXECUTE
경우 사용자는 해당 저장 프로시저에 대한 메타데이터를 볼 수 없습니다.
예를 들어, 사용자가 여러 역할 멤버 자격을 통해 가능하게 된 저장 프로시저에 대한 EXECUTE
권한이 부여되고 DENY
권한이 거부된 경우, DENY
권한이 우선시되어 사용자가 저장 프로시저의 메타데이터를 볼 수 없습니다.
하위 구성 요소 메타데이터의 표시 유형
인덱스, CHECK 제약 조건 및 트리거와 같은 하위 구성 요소의 표시 유형은 부모에 대한 권한에 따라 결정됩니다. 이러한 하위 구성 요소에는 부여할 수 있는 권한이 없습니다. 예를 들어 사용자에게 테이블에 대한 일부 권한이 부여된 경우 사용자는 테이블, 열, 인덱스, CHECK 제약 조건, 트리거 및 기타 하위 구성 요소에 대한 메타데이터를 볼 수 있습니다. 또 다른 예는 지정된 테이블의 개별 열에만 SELECT
를 부여하는 것입니다. 이렇게 하면 수혜자가 모든 열을 포함하여 전체 테이블의 메타데이터를 볼 수 있습니다. 한 가지 방법은 VIEW DEFINITION
사용 권한이 엔터티 수준(이 경우 테이블)에서만 작동하며 하위 엔터티 목록(예: 열 또는 보안 식)에 사용할 수 없다는 것입니다.
다음 코드에서는 이 동작을 볼 수 있습니다.
CREATE TABLE t1
(
c1 INT,
c2 VARCHAR
);
GO
CREATE USER testUser WITHOUT LOGIN;
GO
EXECUTE AS USER = 'testUser';
SELECT OBJECT_SCHEMA_NAME(object_id),
OBJECT_NAME(object_id),
name
FROM sys.columns;
SELECT * FROM sys.tables;
-- this returns no data, as the user has no permissions
REVERT;
GO
-- granting SELECT on only 1 column of the table:
GRANT SELECT ON t1 (c1) TO testUser;
GO
EXECUTE AS USER = 'testUser';
SELECT OBJECT_SCHEMA_NAME(object_id),
OBJECT_NAME(object_id),
name
FROM sys.columns;
SELECT * FROM sys.tables;
-- this returns metadata for all columns of the table and the table itself
;
REVERT;
GO
DROP TABLE t1;
DROP USER testUser;
모든 데이터베이스 사용자가 액세스할 수 있는 메타데이터
일부 메타데이터는 특정 데이터베이스에서 모든 사용자가 액세스할 수 있어야 합니다. 예를 들어 파일 그룹에는 참조 가능한 권한이 없습니다. 따라서 사용자에게 파일 그룹의 메타데이터를 볼 수 있는 권한을 부여할 수 없습니다. 그러나 테이블을 만들 수 있는 모든 사용자는 파일그룹 메타데이터에 액세스하여 CREATE TABLE
문의 ON <filegroup>
절과 TEXTIMAGE_ON <filegroup>
절을 사용할 수 있어야 합니다.
및 DB_ID()
함수에서 DB_NAME()
반환되는 메타데이터는 모든 사용자에게 표시됩니다.
public 역할에 표시할 수 있는 카탈로그 뷰 목록입니다.
sys.allocation_units
sys.column_type_usages
sys.configurations
sys.data_spaces
sys.database_files
sys.destination_data_spaces
sys.filegroups
sys.messages
sys.parameter_type_usages
sys.partition_functions
sys.partition_range_values
sys.partition_schemes
sys.partitions
sys.schemas
sys.sql_dependencies
sys.type_assembly_usages