SQL Server에서 정보 스키마에 대한 액세스 거부


13

SQL Server에서 사용자 / 그룹에 대한 sys.tables/ 액세스를 비활성화하는 가장 좋은 방법을 찾고 Information Schema있습니다.

2008 년부터이 실을 찾았습니다

다음 [sys].[something]과 같이 액세스를 거부하는 방법을 보여줍니다 .

 DENY SELECT ON [sys].[columns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[tables] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[syscolumns] TO DenySystemTableSelectRole
 GO
 DENY SELECT ON [sys].[sysobjects] TO DenySystemTableSelectRole
 GO

그러나에 대한 액세스를 비활성화하는 방법은 없습니다 Information Schema.

DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole

이것은 작동하지 않는 것 같습니다.

information_schema에 대한 액세스를 비활성화하려면 어떻게합니까?

그리고 모든 sys/에 대한 액세스를 비활성화하는 더 쉬운 방법이 information_schema있습니까?

업데이트 : 실제로 다음 진술을 모두 실행할 수는 없습니다.

DENY SELECT ON [sys] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA To reducedDBO
GO

사용자가 존재하는 특정 DB에서 실행하려고 시도했으며 "마스터"에서도 시도했습니다.

여전히 실행할 수 있습니다.

 SELECT * from
 INFORMATION_SCHEMA.TABLES 

-> 여전히 결과를 반환

 SELECT * from
 sys.TABLES 

-> 더 이상 결과가 없습니다

SCHEMA::쿼리를 포함 하여 보안 개체를 만들 수있게되었습니다.

DENY SELECT ON SCHEMA::[sys] TO reducedDBO
GO
DENY SELECT ON SCHEMA::INFORMATION_SCHEMA To reducedDBO
GO

그러나 지금도 여전히 DB에서 모든 정보를 선택할 수 있습니다.

Management Studio 2008의 사용자 속성 창에서 "Securables"-Tab을 살펴 보았습니다.

sys.tables의 선택을 차단하는 항목

스키마 : sys, 이름 : 테이블, 유형 :보기

sys.tables에 대한 권한 : Permission : Select, Grantor : dbo, Deny가 확인 됨

선택을 차단하지 않는 항목

스키마 :, 이름 : INFORMATION_SCHEMA, 유형 : 스키마

INFORMATION_SCHEMA에 대한 권한 : Permission : Select, Grantor : dbo, Deny는 확인되지 않았습니다 (확인하려고했지만 기회는 없습니다.)

권한 : 선택, 권한 부 여자 : INFORMATION_SCHEMA, 거부가 확인 됨


GUI를 통해 권한을 설정하려고 시도했지만 마스터 DB에서만 권한을 설정하는 것과 동일한 오류가 발생합니다. 그러나 마스터 DB 보안에 사용자 / 로그인을 추가하지 않았습니다.

해결책:

내가 할 수있는 유일한 방법 deny에 대한 작업을 information_schema했다 마스터-DB에 사용자를 추가 하고 실행 deny select마스터에 :

DENY SELECT ON [sys].[tables] TO reducedDBO
GO
DENY SELECT ON INFORMATION_SCHEMA.TABLES To reducedDBO
GO

이 코드에서와 같이 단일 테이블에 대해서만 실행할 수 있습니다.


1
또한 이 dba.se 질문과 Remus Rusanu의 답변을 확인하십시오 -같은 주제를 다루는
marc_s

네, 고마워요. 실제로 [information_schema] -views와 [sys] -views를 거부하는 것의 차이점은 [information_schema]를 마스터에서 비활성화해야하고 (모든 DB에 영향을 미침) [sys]보기는 비활성화해야한다는 것입니다 모든 db 자체, 그리고 마스터에서 비활성화되어 있어도 현재 db에서도 비활성화되지 않은 경우에도 사용자는 여전히보기에서 선택할 수 있습니다.
SwissCoder

답변:


10

전체 sysinformation_schema스키마 에 대한 권한을 전체적으로 거부 할 수 있어야합니다 .

DENY SELECT On SCHEMA::sys To [user_name]
DENY SELECT On SCHEMA::INFORMATION_SCHEMA To [user_name]

기본적으로 사용자가 두 스키마에서 선택을 수행하지 못하게해야합니다.


답변으로 표시되었지만 문제는 SCHEMA :: 도움이되지 않았으므로 다시 제거하는 것이 좋습니다. 해결책은 사용자를 마스터 데이터베이스에 추가 한 다음 마스터에서 거부 스크립트를 실행하는 것입니다. 도와 주셔서 감사합니다!
SwissCoder

그리고 실제로 전체 SCHEMA를 비활성화 할 수 없으며 단일 테이블에 대한 액세스 만 이와 같이 비활성화 할 수 있습니다.
SwissCoder

5

먼저 [sys] 및 [INFORMATION_SCHEMA] 스키마에 대한 액세스를 방지하는 (약간 반 직관적 인) 방법은 먼저 로그인 (잘, 서버 수준 주체)이 사용자 (erm, 마스터 데이터베이스의 데이터베이스 수준 보안 주체).

단순성을 위해 SQL 로그인이 있다고 가정하십시오.

CREATE LOGIN [testy] WITH PASSWORD=N'SCoBIqlJELGzrY9zYsKWC5z3kHtMsyCAP6yBHLUYQ0w='
go

이제 마스터 데이터베이스에서 해당 사용자를 작성하십시오.

use [master]
go
CREATE USER [testy] FOR LOGIN [testy]
go

이제이 로그인이 시스템 제공 스키마의 [sys] 및 [INFORMATION_SCHEMA] 테이블에 액세스하지 못하게하려고합니다.

SQL Server 2008 R2와 SQL Server 2012 사이에 동작이 변경된 것으로 보입니다.

SQL Server 2012 (및 아마도 이후 버전)에서 [master] 데이터베이스에서 다음을 실행하면 예상대로 수행됩니다.

DENY SELECT, VIEW DEFINITION ON SCHEMA::[sys] to [testy];
GO
DENY SELECT, VIEW DEFINITION ON SCHEMA::[INFORMATION_SCHEMA] to [testy];
GO

그러나 SQL Server 2008 R2 (및 아마도 이전 버전)에서는 이러한 스키마의 개체에 대한 [public] 멤버에게 액세스 권한을 부여하는 주식 부여 문이 위의 DENY 문을 재정의하는 것 같습니다. 결과적으로 2008 R2에서는 각 GRANT에 대해 [public]에 대해 명시 적으로 거부해야합니다. 이를 수행하는 스크립트는 다음과 같습니다.

declare
    @database_principal sysname,
    @cur cursor,
    @sql nvarchar( 4000 );

set @database_principal = 'testy';

set @cur = cursor local forward_only static for
    select 
        'DENY ' +
        permission_name + ' on ' +
        case class 
            when 1 then
                case minor_id
                    when 0 then 'OBJECT'
                    else 'COLUMN'
                end
            else
                class_desc
        end + '::' +
        case class
            when 0 then db_name()
            when 1 then quotename( OBJECT_SCHEMA_NAME(major_id) ) + '.' + quotename( object_name( major_id ) ) + case minor_id when 0 then '' else ( select '.' + quotename( name ) collate database_default from sys.columns where column_id=minor_id) end
            when 3 then schema_name( major_id )
        end + ' to ' +
        quotename( @database_principal )
    from
        sys.database_permissions
    where
        [grantee_principal_id] = 0 -- public
        and
        [state_desc] = 'GRANT'
        and
        [permission_name] = 'SELECT'
;

open @cur;

while
    1 = 1
begin
    fetch @cur into @sql;
    if @@fetch_status <> 0 break;

    print @sql;
    exec sys.sp_executesql @sql;
end;

close @cur;

deallocate @cur;

마스터 데이터베이스에서 위를 실행하면 해당 스키마의 컨텐츠에 대한 액세스가 제거되었습니다.

노트:

  1. 이들은 명시 적 DENY 문이므로 스크립트가 실행될 때 정확합니다. 누군가 공개적으로 부여 된 권한을 변경하면 (예 : 서비스 팩이 새로운 시스템 테이블을 생성) 거부 된 사용자에게 노출됩니다
  2. 데이터베이스 역할을 DENY 문의 대상으로 사용하고 거부 된 사용자를 해당 역할에 배치하는 것이 좋습니다.
  3. 거부를 거부로 변경하여 취소 할 수 있습니다
  4. 위 스크립트에서 다음 두 줄을 주석 처리 한 경우 :

        and
        [permission_name] = 'SELECT'

    공개를 위해 모든 기본 GRANT를 실행 취소하는 효과가 있습니다 . 예를 들어 sys.sp_tables에 대한 액세스를 막을 수 있으므로 Microsoft Access의 테이블을 열거하는 능력을 완전히 상실 할 수 있지만 보안 수준이 높은 시나리오에서는이를 수행하는 것이 유용합니다. 그것.


3

이 트릭을 언제 사용할 수 있었는지 잘 모르겠습니다. 아무도 언급하지 않았기 때문에 적어도 SQL Server 2008 이후에는 작동하는 것 같습니다.

DENY VIEW DEFINITION to [database-role / database-user];

위의 답변은 다른 답변 중 일부에서 언급했듯이 데이터베이스에 사용자를 추가 할 필요없습니다master .


훌륭한 답변! " technet.microsoft.com/en-us/library/ms175808(v=sql.105).aspx에 따르면 "지정된 데이터베이스에서 권한을 부여받은 사람에 대한 권한 기반 메타 데이터 액세스가 필요하지 않습니다 "
Chris Anton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.