Có cách nào để DENY CRUD hoạt động trên các kết nối từ máy chủ được liên kết không?


7

Tôi có một phiên bản SQL Server, RPT1(2008 R2), được thiết lập cho "người dùng quyền lực" để chạy các truy vấn của riêng họ. Máy chủ này được liên kết với máy chủ báo cáo sản xuất của chúng tôi, PRD1(ví dụ SQL Server 2008), với các khung nhìn (bật RPT1) truy vấn PRD1trực tiếp máy chủ được liên kết ( ).

Máy chủ được liên kết đã được tạo bằng một tài khoản yêu cầu khả năng CRUD trên máy chủ (để kiểm tra báo cáo, v.v.).

Khi người dùng đạt được sự tinh tế, họ cũng yêu cầu các quyền lớn hơn (ví dụ: để tạo quan điểm riêng của họ). Tôi muốn đảm bảo rằng họ sẽ không thực hiện bất kỳ thao tác CRUD nào trên máy chủ được liên kết, nhưng tài khoản được liên kết có các quyền đó.

Đường dẫn giải quyết đầu tiên mà tôi thấy là tạo một người dùng khác, với quyền thấp hơn và liên kết lại máy chủ.

Con đường thứ hai của tôi là để xem liệu có cách nào để DENYCRUD rõ ràng trên PRD1máy chủ cho các kết nối đến từ một máy chủ được liên kết hay không.

Có thể từ chối rõ ràng CRUD chỉ từ liên kết? Hoặc tôi chỉ nên thiết lập về việc liên kết lại máy chủ với một tài khoản khác? Có một giải pháp rõ ràng khác mà tôi đang xem xét?


1
Xu hướng đầu tiên của tôi là thêm một máy chủ được liên kết thứ hai với một tên khác và sử dụng các từ đồng nghĩa để chỉ hiển thị các đối tượng mà người dùng có thể truy cập và từ chối họ truy cập vào máy chủ được liên kết ban đầu.
Aaron Bertrand

Tôi nghĩ rằng đề nghị của Aaron là thiết thực. Nếu những người dùng đó có quyền trên máy chủ PROD và bạn muốn nâng cao kỹ năng của mình một chút, tôi sẽ xem xét việc bảo mật tích hợp hoạt động (có thể dễ dàng như tạo SPN theo cách thủ công hoặc cho phép đăng nhập tên miền để tạo SPN). Bằng cách đó, người dùng không thể làm bất cứ điều gì thông qua liên kết mà họ không thể làm nếu họ đăng nhập trực tiếp vào máy chủ. Nếu họ không có quyền đăng nhập trên hộp prod, điều này không thể thực hiện được. OT: Tôi sẽ chú ý đến bất kỳ quan điểm mới nào mà họ thiết lập, đôi khi hiệu suất thông qua một máy chủ được liên kết là rất tệ.
eo biển darin

Câu trả lời:


4

Bạn đã xem qua việc thiết lập trình kích hoạt DDL trên toàn máy chủ chưa? Tôi đã sử dụng thành công trên một số máy chủ sản xuất để chặn các thay đổi trái phép được thực hiện bởi các nhà phát triển. Tôi đã tham gia một công ty nơi TẤT CẢ các nhà phát triển có quyền truy cập SA đầy đủ.

Khi chúng tôi cố gắng thay đổi quyền của họ, chúng tôi đã có một cuộc cách mạng toàn diện vì các nhà phát triển đột nhiên 'không thể làm việc của họ'. Vì vậy, tôi đã sử dụng một trình kích hoạt DDL trên toàn máy chủ để hạn chế những gì họ có thể làm. Nó rất đơn giản.

Tôi đã tạo một bảng có tên AuthorizedDDLUser có cấu trúc rất đơn giản giống như thế này:

 CREATE TABLE [dbo].[AuthorizedDDLUser](
    [Username] [nvarchar](256) NOT NULL,
    CONSTRAINT [PK_AuthorizedDDLUser] PRIMARY KEY CLUSTERED 
    (
      [Username] ASC
     )
    WITH (
           PAD_INDEX  = OFF
           , STATISTICS_NORECOMPUTE  = OFF
           , IGNORE_DUP_KEY = OFF
           , ALLOW_ROW_LOCKS  = ON
           , ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

  GO

Sau đó tôi đã chèn tên Đăng nhập của các nhà phát triển mà tôi sẽ cho phép thực hiện thay đổi (ví dụ: nhóm DBA và nhà phát triển SQL cao cấp).

Sau đó tôi đã tạo một trình kích hoạt DDL trên máy chủ tương tự như sau:

CREATE TRIGGER [block_ddl]
ON SERVER
FOR CREATE_PROCEDURE,ALTER_PROCEDURE, DROP_PROCEDURE, 
    CREATE_TABLE,ALTER_TABLE, DROP_TABLE, 
    CREATE_FUNCTION,ALTER_FUNCTION, DROP_FUNCTION, 
    CREATE_INDEX,ALTER_INDEX, DROP_INDEX, 
    CREATE_VIEW,ALTER_VIEW, DROP_VIEW,
    CREATE_TRIGGER,ALTER_TRIGGER, DROP_TRIGGER
AS
    IF NOT EXISTS(SELECT UserName FROM AuthorizedDDLUser WHERE UserName=CURRENT_USER)
    BEGIN
            //RAISE CUSTOM ERROR MESSAGE HERE AND ROLLBACK THE TRANSACTION 
            // ROLLING BACK EFFECTIVELY CANCELS THE DDL STATEMENT
            ROLLBACK TRANSACTION --
    END

Việc thực hiện của tôi có liên quan nhiều hơn một chút vì nó cũng đã kiểm toán. Tuy nhiên tôi đang cố gắng để giữ cho nó đơn giản ở đây.

Vì vậy, tóm lại, bạn có thể chọn lọc giới hạn những gì người dùng được liên kết có thể làm trên hệ thống. Để thực sự bắt đầu với điều này, tôi khuyên bạn nên đọc các bài viết sau.

  1. Sử dụng Trình kích hoạt DDL để chặn thay đổi lược đồ trong SQL Server: http://www.mssqltips.com/sqlservertip/2646/USE-a-ddl-trigger-to-block-schema-changes-in-sql-server/
  2. Kiểm tra các lệnh DDL (Tạo, thay đổi, thả) trong SQL Server 2005: http://www.mssqltips.com/sqlservertip/1006/auditing-ddl-create-alter-drop-commands-in-sql-server-2005/
  3. Danh sách sự kiện DDL: http://msdn.microsoft.com/en-us/ms189540.aspx
  4. Kích hoạt DDL: http://msdn.microsoft.com/en-us/l Library / ms175941.aspx
  5. Sử dụng Hàm EventData () với trình kích hoạt DDL trong SQL Server 2005: http://www.mssqltips.com/sqlservertip/1571/USE-the-eventdata-feft-with-ddl-triggers-in-sql-server-2005/

Vì vậy, trong trường hợp của tôi, các nhà phát triển vẫn có thể làm được khá nhiều thứ trừ việc làm rối hệ thống của tôi. Cuối cùng, chúng tôi đã loại bỏ được quyền truy cập SA và cuộc sống của tôi trở lại bình thường nhờ các trình kích hoạt DDL.

Mong rằng sẽ giúp!

CẬP NHẬT:

Cảm ơn Martin Smith đã chỉ ra rằng đây là sau khi kích hoạt. Một cái gì đó tôi đã không nhận ra cho đến bây giờ (bạn học hàng ngày). Bài báo MSDN rất khó hiểu ở chỗ nó chỉ ra rằng nó là cả trước và sau khi kích hoạt. Vì vậy, điều này có thể mở ra một số tiềm năng cho các vấn đề về hiệu suất nếu như Martin nói rằng bạn khôi phục lại việc xây dựng chỉ mục trên một bảng khá lớn. Tuy nhiên nếu bạn chỉ chặn chế độ xem và bảng được tạo thì sẽ ổn thôi.

Vì vậy, sử dụng một cách khôn ngoan.

Họ thực sự cần phải sửa lỗi này vì nó giới hạn khả năng sử dụng của tính năng này.


2
Đáng giá chỉ ra rằng đây là sau khi kích hoạt mặc dù vậy sẽ chỉ quay trở lại sau khi thực tế. Một cái CREATE_INDEXtrên một cái bàn lớn theo sau là một rollback vẫn có thể gây ra khá nhiều thiệt hại chẳng hạn.
Martin Smith

Nếu chỉ số đã được tạo ra thực sự. Vì vậy, cho đến nay tôi nhớ họ là trước khi kích hoạt. Theo bài viết MSDN, họ chắc chắn là trước khi kích hoạt.
Namphibian

Đó là không đúng. Họ là sau khi kích hoạt. Một ROLLBACKkích hoạt DDL xảy ra sau khi sự kiện đã xảy ra. DDL kích hoạt chỉ bắn sau khi các câu lệnh DDL kích hoạt chúng được chạy. Kích hoạt DDL không thể được sử dụng như kích hoạt INSTEAD OF.
Martin Smith

Theo MSDN: Bạn có thể sử dụng trình kích hoạt DDL để kiểm tra hoạt động của cơ sở dữ liệu hoặc máy chủ tạo, sửa đổi hoặc xóa các đối tượng cơ sở dữ liệu hoặc đảm bảo rằng các câu lệnh DDL thực thi các quy tắc kinh doanh của bạn trước khi chúng được chạy. Liên kết được tìm thấy ở đây: msdn.microsoft.com/en-us/l
Library / ms175941.aspx

Cùng một trang trích dẫn của tôi là từ!
Martin Smith
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.