Từ chối truy cập vào lược đồ thông tin trong SQL Server


13

Tôi đang tìm cách tốt nhất để vô hiệu hóa quyền truy cập vào sys.tables/ Information Schemacho người dùng / nhóm trong SQL Server.

Tôi tìm thấy chủ đề này từ năm 2008

Nó cho thấy một cách để từ chối truy cập [sys].[something]như vậy:

 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

Nhưng không có cách nào để vô hiệu hóa quyền truy cập vào Information Schema:

DENY SELECT ON INFORMATION_SCHEMA.TABLES To DenySystemTableSelectRole

Điều này dường như không hoạt động.

Làm cách nào tôi có thể vô hiệu hóa quyền truy cập vào information_schema?

Và có cách nào dễ dàng hơn để vô hiệu hóa quyền truy cập vào tất cả sys/ information_schema?

Cập nhật: Trên thực tế tôi không thể chạy cả hai câu lệnh sau:

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

Tôi đã cố chạy chúng trên DB cụ thể nơi Người dùng tồn tại và tôi cũng đã thử trên "bản gốc".

Tôi vẫn có thể chạy:

 SELECT * from
 INFORMATION_SCHEMA.TABLES 

-> vẫn trả về kết quả

 SELECT * from
 sys.TABLES 

-> không có kết quả nữa

Bao gồm SCHEMA::trong truy vấn, có thể tạo các bảo mật

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

Nhưng bây giờ tôi vẫn có thể chọn tất cả thông tin từ DB.

Tôi đã xem "Bảo mật" -Tab trong cửa sổ Thuộc tính người dùng trong Management Studio 2008, nó trông như thế này:

Mục nhập chặn khối chọn của sys.tables

Lược đồ: sys, Tên: bảng, Loại: Xem

Quyền cho sys.tables: Quyền: Chọn, Nhà tài trợ: dbo, Từ chối được chọn

Mục nhập không chặn bất kỳ lựa chọn nào

Lược đồ:, Tên: THÔNG TIN_SCHema, Loại: Lược đồ

Quyền cho Information_SCHema: Quyền: Chọn, Nhà tài trợ: dbo, Từ chối KHÔNG được kiểm tra (Tôi đã cố kiểm tra nhưng không có cơ hội ..)

Quyền: Chọn, Nhà tài trợ: THÔNG TIN_SCHema, Từ chối được chọn


Tôi đã cố gắng thiết lập các quyền trên GUI, nhưng sau đó tôi gặp cùng một lỗi rằng việc thiết lập quyền chỉ có thể có trên DB chính. Nhưng tôi không có người dùng / đăng nhập được thêm vào bảo mật DB chính.

Giải pháp:

Cách duy nhất tôi có thể thực hiện denycông việc cho information_schemathêm người dùng vào master-db và chạy deny selecttrên master:

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

Và như trong mã này, nó chỉ có thể được thực thi cho các bảng đơn lẻ.


1
Ngoài ra hãy xem câu hỏi dba.se này và câu trả lời của Remus Rusanu - loại bìa có cùng chủ đề
marc_s

vâng, cảm ơn Trên thực tế, sự khác biệt giữa việc từ chối các lượt xem [information_schema] và [sys] là [information_schema] phải bị vô hiệu hóa trên bản gốc (và nó sẽ ảnh hưởng đến tất cả các DB) trong khi chế độ xem [sys] phải bị vô hiệu hóa mỗi db chính nó và ngay cả khi bị vô hiệu hóa trên bản gốc, người dùng vẫn có thể chọn từ chế độ xem, nếu nó cũng không bị tắt trên db hiện tại.
SwissCoder

Câu trả lời:


10

Bạn có thể chỉ cần từ chối toàn bộ quyền sysvà toàn bộ information_schemalược đồ:

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

Điều đó về cơ bản chỉ ngăn người dùng thực hiện bất kỳ lựa chọn nào trong hai lược đồ đó.


được đánh dấu là câu trả lời, nhưng vấn đề là SCHema :: đã không giúp đỡ, tốt hơn là xóa nó một lần nữa. Giải pháp là thêm người dùng vào cơ sở dữ liệu chủ và sau đó chạy tập lệnh từ chối trên bản gốc. Cảm ơn sự giúp đỡ của bạn!
SwissCoder

Ồ và thực sự tôi cũng không thể vô hiệu hóa toàn bộ SCHema, chỉ có thể truy cập vào các bảng duy nhất như thế này.
SwissCoder

5

Thứ nhất, bạn chính xác theo cách (hơi phản trực giác) để ngăn truy cập vào các lược đồ [sys] và [THÔNG TIN_SCHema] trước tiên là đảm bảo rằng thông tin đăng nhập (tốt, chính ở cấp độ máy chủ) tồn tại dưới dạng người dùng (erm, cơ sở dữ liệu cấp cơ sở) trong cơ sở dữ liệu chủ.

Giả sử bạn có thông tin đăng nhập SQL để đơn giản:

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

Bây giờ tạo một người dùng tương ứng trong cơ sở dữ liệu chủ:

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

Bây giờ bạn muốn ngăn đăng nhập này truy cập vào bất kỳ bảng nào trong các lược đồ do hệ thống cung cấp - [sys] và [THÔNG TIN_SCHema].

Dường như có sự thay đổi hành vi giữa SQL Server 2008 R2 và SQL Server 2012:

Trong SQL Server 2012 (và có lẽ là các phiên bản mới hơn), việc chạy các phần sau trong cơ sở dữ liệu [chính] sẽ làm như bạn mong đợi:

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

Tuy nhiên, trong SQL Server 2008 R2 (và có lẽ là các phiên bản trước đó), các câu lệnh cấp chứng khoán cho phép truy cập vào các đối tượng trong các lược đồ này cho các thành viên của [công khai] dường như ghi đè lên các câu lệnh DENY ở trên, có vẻ như là một thất bại lớn đối với tôi. Do đó, vào năm 2008 R2, bạn cần phải TỪNG rõ ràng cho từng GRANT thành [công khai]. Đây là một kịch bản để làm điều đó:

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;

Chạy phần trên trong cơ sở dữ liệu chủ và bạn đã xóa quyền truy cập vào nội dung của các lược đồ đó.

Ghi chú:

  1. Bởi vì đây là các câu lệnh DENY rõ ràng, chúng đúng ở điểm mà tập lệnh được chạy. Nếu ai đó sau đó thay đổi các quyền được cấp cho công chúng (ví dụ: gói dịch vụ tạo bảng hệ thống mới) thì điều đó sẽ được hiển thị cho người dùng bị từ chối
  2. Nên sử dụng vai trò cơ sở dữ liệu làm mục tiêu của các câu lệnh DENY và đặt người dùng bị từ chối vào vai trò đó.
  3. Bạn có thể hoàn tác điều này bằng cách thay đổi DENY thành REVOKE
  4. Nếu bạn nhận xét hai dòng sau trong đoạn script trên:

        and
        [permission_name] = 'SELECT'

    Nó sẽ có tác dụng hoàn tác TẤT CẢ các GRANT mặc định cho công chúng. Điều này sẽ ngăn truy cập vào ví dụ: sys.sp_tables và vì vậy phá vỡ, ví dụ như khả năng của Microsoft Access liệt kê các bảng, nhưng nó rất hữu ích trong các tình huống bảo mật cao để làm điều này để người dùng chỉ có quyền truy cập khi bạn được cấp quyền rõ ràng nó


3

Tôi không chắc chắn khi nào thủ thuật này trở nên có sẵn - vì không ai đề cập đến nó - nhưng có vẻ như nó hoạt động ít nhất kể từ SQL Server 2008.

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

Các công việc trên mà không cần phải thêm người dùng vào mastercơ sở dữ liệu như được đề cập trong một số câu trả lời khác.


Câu trả lời tuyệt vời! Per technet.microsoft.com/en-us/l Library / ms175808 (v = sql.105) .aspx "phủ nhận quyền truy cập siêu dữ liệu dựa trên quyền cho người được cấp trong cơ sở dữ liệu được chỉ định"
Chris Anton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.