메타데이터 표시 유형 구성Metadata Visibility Configuration

사용자가 소유하고 있거나 일부 사용 권한이 부여된 보안 개체에 대해서만 메타데이터를 볼 수 있도록 제한됩니다.The visibility of metadata is limited to securables that a user either owns or on which the user has been granted some permission. 예를 들어 다음 쿼리는 사용자에게 myTable테이블에 대한 SELECT 또는 INSERT와 같은 권한을 부여한 경우에 행을 반환합니다.For example, the following query returns a row if the user has been granted a permission such as SELECT or INSERT on the table myTable.

SELECT name, object_id  
FROM sys.tables  
WHERE name = 'myTable';  
GO  

하지만 사용자에게 myTable에 대한 사용 권한이 없으면 쿼리가 빈 결과 집합을 반환합니다.However, if the user does not have any permission on myTable, the query returns an empty result set.

메타데이터 표시 유형 범위 및 영향 구성Scope and Impact of Metadata Visibility Configuration

메타데이터 표시 유형 구성은 다음 보안 개체에만 적용됩니다.Metadata visibility configuration only applies to the following securables.

카탈로그 뷰Catalog views 데이터베이스 엔진Database Engine sp_help 저장 프로시저 sp_help stored procedures
메타데이터를 제공하는 기본 제공 함수Metadata exposing built-in functions 정보 스키마 뷰Information schema views
호환성 뷰Compatibility views 확장 속성Extended properties

메타데이터 표시 유형 구성이 적용되지 않는 보안 개체는 다음과 같습니다.Metadata visibility configuration does not apply to the following securables.

로그 전달 시스템 테이블Log shipping system tables SQL ServerSQL Server 에이전트 시스템 테이블 Agent system tables
데이터베이스 유지 관리 계획 시스템 테이블Database maintenance plan system tables 백업 시스템 테이블Backup system tables
복제 시스템 테이블Replication system tables 복제 및 SQL ServerSQL Server 에이전트 sp_help 저장 프로시저Replication and SQL ServerSQL Server Agent sp_help stored procedures

제한된 메타데이터 액세스란 다음을 의미합니다.Limited metadata accessibility means the following:

  • public 메타데이터 액세스가 사용되는 응용 프로그램이 차단됩니다.Applications that assume public metadata access will break.

  • 시스템 뷰에 대한 쿼리는 행의 하위 집합이나 일부 경우에는 빈 결과 집합을 반환합니다.Queries on system views might only return a subset of rows, or sometimes an empty result set.

  • OBJECTPROPERTYEX와 같은 메타데이터 내보내기 기본 제공 함수가 NULL을 반환합니다.Metadata-emitting, built-in functions such as OBJECTPROPERTYEX may return NULL.

  • 데이터베이스 엔진Database Engine sp_help 저장 프로시저가 행의 하위 집합이나 NULL을 반환합니다.The 데이터베이스 엔진Database Engine sp_help stored procedures might return only a subset of rows, or NULL.

    저장 프로시저 및 트리거와 같은 SQL 모듈은 호출자의 보안 컨텍스트에서 실행되므로 메타데이터 액세스가 제한됩니다.SQL modules, such as stored procedures and triggers, run under the security context of the caller and, therefore, have limited metadata accessibility. 예를 들어 다음 코드에서 저장 프로시저가 호출자에게 권한이 없는 myTable 테이블에 액세스하려고 시도하면 빈 결과 집합이 반환됩니다.For example, in the following code, when the stored procedure tries to access metadata for the table myTable on which the caller has no rights, an empty result set is returned. 이전 버전의 SQL ServerSQL Server에서는 행이 반환됩니다.In earlier releases of SQL ServerSQL Server, a row is returned.

CREATE PROCEDURE assumes_caller_can_access_metadata  
BEGIN  
SELECT name, id   
FROM sysobjects   
WHERE name = 'myTable';  
END;  
GO  

호출자가 메타데이터를 볼 수 있도록 개체 수준, 데이터베이스 수준 또는 서버 수준의 적합한 범위에서 VIEW DEFINITION 권한을 호출자에게 부여할 수 있습니다.To allow callers to view metadata, you can grant the callers VIEW DEFINITION permission at an appropriate scope: object level, database level or server level. 따라서 이전 예에서 호출자에게 myTable에 대한 VIEW DEFINITION 권한이 있으면 저장 프로시저가 행을 반환합니다.Therefore, in the previous example, if the caller has VIEW DEFINITION permission on myTable, the stored procedure returns a row. 자세한 내용은 GRANT(Transact-SQL)GRANT 데이터베이스 사용 권한(Transact-SQL)을 참조하세요.For more information, see GRANT (Transact-SQL) and GRANT Database Permissions (Transact-SQL).

또한 소유자의 자격 증명에 따라 실행되도록 저장 프로시저를 수정할 수 있습니다.You can also modify the stored procedure so that it executes under the credentials of the owner. 프로시저 소유자와 테이블 소유자가 같은 경우 소유권 체인이 적용되며 프로시저 소유자의 보안 컨텍스트로 myTable에 대한 메타데이터에 액세스할 수 있습니다.When the procedure owner and the table owner are the same owner, ownership chaining applies, and the security context of the procedure owner enables access to the metadata for myTable. 이 경우 다음 코드는 호출자에게 메타데이터 행을 반환합니다.Under this scenario, the following code returns a row of metadata to the caller.

참고

다음 예제에서는 sys.sysobjects 호환성 뷰 대신 sys.objects 카탈로그 뷰가 사용됩니다.The following example uses the sys.objects catalog view instead of the sys.sysobjects compatibility view.

CREATE PROCEDURE does_not_assume_caller_can_access_metadata  
WITH EXECUTE AS OWNER  
AS  
BEGIN  
SELECT name, id  
FROM sys.objects   
WHERE name = 'myTable'   
END;  
GO  
참고

EXECUTE AS를 사용하여 호출자의 보안 컨텍스트로 임시 전환할 수 있습니다.You can use EXECUTE AS to temporarily switch to the security context of the caller. 자세한 내용은 EXECUTE AS(Transact-SQL)를 참조하세요.For more information, see EXECUTE AS (Transact-SQL).

메타데이터 표시 유형 구성의 이점과 한계Benefits and Limits of Metadata Visibility Configuration

메타데이터 표시 유형 구성은 전체적인 보안 계획에서 중요한 역할을 수행합니다.Metadata visibility configuration can play an important role in your overall security plan. 하지만 경우에 따라서는 결정권을 가진 사용자가 일부 메타데이터를 공개할 수도 있습니다.However, there are cases in which a skilled and determined user can force the disclosure of some metadata. 메타데이터 사용 권한은 여러 가지 방어적 관점을 고려하여 배포하는 것이 좋습니다.We recommend that you deploy metadata permissions as one of many defenses-in-depth.

이론상 쿼리의 조건자 평가 순서를 조작하여 강제로 오류 메시지에 메타데이터를 내보낼 수 있습니다.It is theoretically possible to force the emission of metadata in error messages by manipulating the order of predicate evaluation in queries. 이러한 trial-and-error 공격 가능성이 SQL ServerSQL Server와 반드시 관련된 것은 아니며The possibility of such trial-and-error attacks is not specific to SQL ServerSQL Server. 관계형 대수에서 허용되는 연관 및 누적 변환에 포함됩니다.It is implied by the associative and commutative transformations permitted in relational algebra. 오류 메시지에 반환되는 정보를 제한하여 이 위험을 줄일 수 있습니다.You can mitigate this risk by limiting the information returned in error messages. 이런 방식으로 메타데이터의 표시 유형을 더욱 제한하려면 추적 플래그 3625로 서버를 시작할 수 있습니다.To further restrict the visibility of metadata in this way, you can start the server with trace flag 3625. 이 추적 플래그는 오류 메시지에 표시되는 정보를 제한하므로This trace flag limits the amount of information shown in error messages. 정보 공개를 방지하는 데 도움이 됩니다.In turn, this helps to prevent forced disclosures. 이 경우 오류 메시지가 상세하지 않아 디버깅 용도로 사용하기 어려운 단점이 있습니다.The tradeoff is that error messages will be terse and might be difficult to use for debugging purposes. 자세한 내용은 데이터베이스 엔진 서비스 시작 옵션추적 플래그(Transact-SQL)를 참조하세요.For more information, see Database Engine Service Startup Options and Trace Flags (Transact-SQL).

다음과 같은 메타데이터는 공개되지 않습니다.The following metadata is not subject to forced disclosure:

  • sys.serversprovider_string열에 저장된 값.The value stored in the provider_string column of sys.servers. ALTER ANY LINKED SERVER 권한이 없는 사용자에게는 이 열에 NULL 값이 표시됩니다.A user that does not have ALTER ANY LINKED SERVER permission will see a NULL value in this column.

  • 저장 프로시저 또는 트리거와 같은 사용자 정의 개체에 대한 원본 정의.Source definition of a user-defined object such as a stored procedure or trigger. 원본 코드는 다음 조건 중 하나에 부합하는 경우에만 표시됩니다.The source code is visible only when one of the following is true:

    • 사용자에게 개체에 대한 VIEW DEFINITION 권한이 있습니다.The user has VIEW DEFINITION permission on the object.

    • 사용자에게 개체에 대한 VIEW DEFINITION 권한이 거부되지 않았고 개체에 대한 CONTROL, ALTER 또는 TAKE OWNERSHIP 권한이 있습니다.The user has not been denied VIEW DEFINITION permission on the object and has CONTROL, ALTER, or TAKE OWNERSHIP permission on the object. 다른 모든 사용자에게는 NULL이 표시됩니다.All other users will see NULL.

  • 다음 카탈로그 뷰에 있는 정의 열The definition columns found in the following catalog views:

    sys.all_sql_modulessys.all_sql_modules sys.sql_modulessys.sql_modules
    sys.server_sql_modulessys.server_sql_modules sys.check_constraintssys.check_constraints
    sys.default_constraintssys.default_constraints sys.computed_columnssys.computed_columns
    sys.numbered_proceduressys.numbered_procedures
  • syscomments 호환성 뷰에 있는 ctextThe ctext column in the syscomments compatibility view.

  • sp_helptext 프로시저의 출력The output of the sp_helptext procedure.

  • 정보 스키마 뷰에 있는 다음 열The following columns in the information schema views:

    INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSEINFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT
    INFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULTINFORMATION_SCHEMA.DOMAINS.DOMAIN_DEFAULT INFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULTINFORMATION_SCHEMA.ROUTINE_COLUMNS.COLUMN_DEFAULT
    INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITIONINFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITIONINFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION
  • OBJECT_DEFINITION() 함수OBJECT_DEFINITION() function

  • sys.sql_logins의 password_hash 열에 저장된 값.The value stored in the password_hash column of sys.sql_logins. CONTROL SERVER 권한이 없는 사용자에게는 이 열에 NULL 값이 표시됩니다.A user that does not have CONTROL SERVER permission will see a NULL value in this column.

참고

기본 제공 시스템 프로시저 및 함수에 대한 SQL 정의는 sys.system_sql_modules 카탈로그 뷰, sp_helptext 저장 프로시저 및 OBJECT_DEFINITION() 함수를 통해 공개적으로 표시됩니다.The SQL definitions of built-in system procedures and functions are publicly visible through the sys.system_sql_modules catalog view, the sp_helptext stored procedure, and the OBJECT_DEFINITION() function.

메타데이터 표시 유형에 대한 일반 원칙General Principles of Metadata Visibility

다음은 메타데이터 표시 유형과 관련하여 고려해야 할 일반적인 원칙들입니다.The following are some general principles to consider regarding metadata visibility:

  • 고정 역할의 암시적 사용 권한Fixed roles implicit permissions

  • 사용 권한 범위Scope of permissions

  • DENY 선행 조건Precedence of DENY

  • 하위 구성 요소의 메타데이터에 대한 표시 유형Visibility of subcomponent metadata

고정 역할과 암시적 사용 권한Fixed Roles and Implicit Permissions

고정 역할로 액세스할 수 있는 메타데이터는 해당 암시적 사용 권한에 따라 달라집니다.Metadata that can be accessed by fixed roles depends upon their corresponding implicit permissions.

사용 권한 범위Scope of Permissions

한 범위의 사용 권한에는 해당 범위와 포함된 모든 범위에서 메타데이터를 볼 수 있는 기능이 내재됩니다.Permissions at one scope imply the ability to see metadata at that scope and at all enclosed scopes. 예를 들어 특정 스키마에 대한 SELECT 권한은 해당 스키마에 포함된 모든 보안 개체에 대한 SELECT 권한을 암시합니다.For example, SELECT permission on a schema implies that the grantee has SELECT permission on all securables that are contained by that schema. 따라서 스키마에 대한 SELECT 권한을 사용자에게 부여하면 이 사용자가 해당 스키마에 대한 메타데이터뿐만 아니라 이 스키마에 포함된 모든 테이블, 뷰, 함수, 프로시저, 큐, 동의어, 유형 및 XML 스키마 컬렉션을 볼 수 있습니다.The granting of SELECT permission on a schema therefore enables a user to see the metadata of the schema and also all tables, views, functions, procedures, queues, synonyms, types, and XML schema collections within it. 범위에 대한 자세한 내용은 사용 권한 계층(데이터베이스 엔진)을 참조하세요.For more information about scopes, see Permissions Hierarchy (Database Engine).

DENY 선행 조건Precedence of DENY

DENY는 일반적으로 다른 사용 권한보다 우선적으로 적용됩니다.DENY typically takes precedence over other permissions. 예를 들어 데이터베이스 사용자에게 스키마에 대한 EXECUTE 권한이 부여되었지만 해당 스키마에 있는 저장 프로시저에 대한 EXECUTE 권한이 거부된 경우 이 사용자는 해당 저장 프로시저에 대한 메타데이터를 볼 수 없습니다.For example, if a database user is granted EXECUTE permission on a schema but has been denied EXECUTE permission on a stored procedure in that schema, the user cannot view the metadata for that stored procedure.

또한 사용자에게 스키마에 대한 EXECUTE 권한이 거부되었지만 해당 스키마에 있는 저장 프로시저에 대한 EXECUTE 권한이 부여된 경우에도 이 사용자는 해당 저장 프로시저에 대한 메타데이터를 볼 수 없습니다.Additionally, if a user is denied EXECUTE permission on a schema but has been granted EXECUTE permission on a stored procedure in that schema, the user cannot view the metadata for that stored procedure.

또 다른 예로 여러 역할 멤버 자격을 통해 사용자에게 저장 프로시저에 대한 EXECUTE 권한이 부여되고 거부된 경우 DENY가 우선적으로 적용되며, 이 사용자는 해당 저장 프로시저에 대한 메타데이터를 볼 수 없습니다.For another example, if a user has been granted and denied EXECUTE permission on a stored procedure, which is possible through your various role memberships, DENY takes precedence and the user cannot view the metadata of the stored procedure.

하위 구성 요소의 메타데이터에 대한 표시 유형Visibility of Subcomponent Metadata

인덱스, CHECK 제약 조건 및 트리거와 같은 하위 구성 요소의 표시 유형은 부모 구성 요소의 사용 권한에 따라 결정됩니다.The visibility of subcomponents, such as indexes, check constraints, and triggers is determined by permissions on the parent. 이러한 하위 구성 요소에는 부여 가능한 사용 권한이 없습니다.These subcomponents do not have grantable permissions. 예를 들어 사용자에게 테이블에 대한 일부 사용 권한이 부여된 경우 이 사용자는 해당 테이블, 열, 인덱스, CHECK 제약 조건, 트리거 및 기타 하위 구성 요소에 대한 메타데이터를 볼 수 있습니다.For example, if a user has been granted some permission on a table, the user can view the metadata for the tables, columns, indexes, check constraints, triggers, and other such subcomponents.

모든 데이터베이스 사용자가 액세스할 수 있는 메타데이터Metadata That Is Accessible to All Database Users

일부 메타데이터는 특정 데이터베이스에서 모든 사용자가 액세스할 수 있어야 합니다.Some metadata must be accessible to all users in a specific database. 예를 들어 파일 그룹에는 수여 가능한 사용 권한이 없기 때문에 사용자는 파일 그룹의 메타데이터를 볼 수 있는 사용 권한을 부여 받을 수 없습니다.For example, filegroups do not have conferrable permissions; therefore, a user cannot be granted permission to view the metadata of a filegroup. 하지만 테이블을 만들 수 있는 사용자는 CREATE TABLE 문에서 ON filegroup 또는 TEXTIMAGE_ON filegroup 절을 사용하기 위해 파일 그룹 메타데이터에 액세스할 수 있어야 합니다.However, any user that can create a table must be able to access filegroup metadata to use the ON filegroup or TEXTIMAGE_ON filegroup clauses of the CREATE TABLE statement.

DB_ID() 및 DB_NAME() 함수로 반환된 메타데이터는 모든 사용자에게 표시됩니다.The metadata that is returned by the DB_ID() and DB_NAME() functions is visible to all users.

다음 표에서는 public 역할에 표시할 수 있는 카탈로그 뷰 목록을 나열합니다.The following table lists the catalog views that are visible to the public role.

sys.partition_functionssys.partition_functions sys.partition_range_valuessys.partition_range_values
sys.partition_schemessys.partition_schemes sys.data_spacessys.data_spaces
sys.filegroupssys.filegroups sys.destination_data_spacessys.destination_data_spaces
sys.database_filessys.database_files sys.allocation_unitssys.allocation_units
sys.partitionssys.partitions sys.messagessys.messages
sys.schemassys.schemas sys.configurationssys.configurations
sys.sql_dependenciessys.sql_dependencies sys.type_assembly_usagessys.type_assembly_usages
sys.parameter_type_usagessys.parameter_type_usages sys.column_type_usagessys.column_type_usages

참고 항목See Also

GRANT(Transact-SQL) GRANT (Transact-SQL)
DENY(Transact-SQL) DENY (Transact-SQL)
REVOKE(Transact-SQL) REVOKE (Transact-SQL)
EXECUTE AS 절(Transact-SQL) EXECUTE AS Clause (Transact-SQL)
카탈로그 뷰(Transact-SQL) Catalog Views (Transact-SQL)
호환성 뷰(Transact-SQL) Compatibility Views (Transact-SQL)