Làm thế nào để chặn truy cập người dùng để thực hiện cập nhật ứng dụng cơ sở dữ liệu?


7

Nơi tôi làm việc, chúng tôi có cơ sở dữ liệu SQL Server (Microsoft SQL Server 2008 R2) đóng vai trò là back-end với hai giao diện người dùng khác nhau, giao diện web .NET và giao diện FoxPro.

Hàng tháng chúng tôi cần áp dụng các bản cập nhật cho cả máy khách Web và FoxPro. Trước khi làm điều này, chúng tôi khuyên bạn nên đảm bảo rằng không ai truy cập cơ sở dữ liệu trong quá trình cập nhật.

Cách dễ nhất để ngăn truy cập vào cơ sở dữ liệu trong khi chúng tôi cập nhật nó là gì? Câu hỏi tiếp theo: cách tốt nhất để ngăn chặn truy cập trong khi chúng tôi cập nhật nó là gì?

Câu trả lời:


9

Có một số cách mà bạn có thể hạn chế quyền truy cập vào cơ sở dữ liệu:

  1. Sử dụng Trình kích hoạt LOGON - nhưng chỉ tạm thời (bật trước khi nâng cấp và sau đó tắt nó). Tham khảo câu trả lời của tôi ở đây để biết thêm chi tiết bao gồm cả một kịch bản.
  2. Bạn có thể tắt IIS trên máy chủ web để không có kết nối nào được thực hiện bằng ứng dụng. Điều này được gọi là "thời gian chết của Applicaiton"
  3. Giữ cơ sở dữ liệu ở chế độ người dùng duy nhất bằng cách sử dụng (Lưu ý điều này sẽ có rủi ro vì nếu có bất kỳ kết nối nào khác với cơ sở dữ liệu thì bạn có thể sẽ chờ kết nối hoặc từ chối kết nối.)

    alter database databasename
    set single_user with rollback immediately
    

Bạn nên sử dụng Tùy chọn 2 như một bản nâng cấp an toàn và có kế hoạch trong cửa sổ bảo trì của bạn.

BIÊN TẬP:

Người dùng bị hạn chế - chỉ những người dùng có quyền dbo trên cơ sở dữ liệu được phép (ví dụ: db_owner, dbcreator, sysadmin). Điều này có nghĩa là nhiều người dùng vẫn có thể đăng nhập vào cơ sở dữ liệu, miễn là họ là DBO.

Một người dùng - chỉ một kết nối được phép, tức là đến trước, được phục vụ trước.

Do thực tế là Người dùng đơn sẽ đến trước, được phục vụ trước - sẽ có nhiều rủi ro hơn trong trường hợp có lỗi hoặc bằng cách nào đó các kết nối của bạn bị chấm dứt.

Khi giao dịch với Trình kích hoạt đăng nhập, như @AaronBertrand đã chỉ ra rằng nó sẽ không hoạt động cho các phiên hiện có, nhưng bạn có thể vượt qua điều đó bằng cách giết tất cả các phiên và sau đó kích hoạt để tất cả các kết nối đến mới phải đi qua Kích hoạt.

Tôi không thể nghĩ ra bất kỳ cách nào khác để hạn chế các kết nối đến cơ sở dữ liệu.


Chúng tôi chắc chắn sẽ tắt IIS trong khi thực hiện cập nhật, nhưng tôi không rõ liệu điều này có ngăn chặn đăng nhập từ máy khách FoxPro hay không. Đăng nhập kích hoạt có thể là giải pháp tốt nhất. Bạn nghĩ gì về chế độ RESTRICTED_USER thay vì chế độ SINGLE_USER?
Baodad

2
Tôi nghĩ rằng trình kích hoạt đăng nhập không nhất thiết phải là một cách tốt để thực hiện - các phiên hiện tại sẽ không phải thông qua trình kích hoạt, vì vậy chúng có thể kích hoạt nhiều công việc hơn ngay cả khi bạn thay đổi trình kích hoạt để tránh mọi người.
Aaron Bertrand

@Baodad Tôi đã cập nhật câu trả lời của tôi với các chi tiết.
Kin Shah

9

Nếu bạn đặt cơ sở dữ liệu vào chế độ Người dùng bị hạn chế, thì chỉ thành viên của vai trò máy chủ cố định sysadminhoặc dbcreatorhoặc thành viên của vai trò cơ sở dữ liệu cố định mới db_ownercó thể truy cập cơ sở dữ liệu:

ALTER DATABASE my_app_db SET RESTRICTED_USER

Nếu bạn muốn buộc các kết nối hiện có bị đóng:

ALTER DATABASE my_app_db SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE

Và khi bạn đã sẵn sàng để đưa mọi thứ trở lại bình thường:

ALTER DATABASE my_app_db SET MULTI_USER

Nguồn: http://www.blackwasp.co.uk/QueryRestrictedUser.aspx

Tôi không khuyến nghị chế độ Người dùng Đơn trong những trường hợp này, vì quá trình cập nhật ứng dụng có thể cần phải mở nhiều kết nối cùng một lúc.


Có vẻ như là một giải pháp tao nhã, đơn giản hơn kích hoạt Logon. Tôi sẽ cần phải xem liệu nó có phù hợp với môi trường của chúng tôi không, hoặc nếu có những công việc đang diễn ra sẽ ngăn chúng tôi vào chế độ RESTRICTED_USER.
Baodad

3

Nếu bạn có một nhóm người dùng sẽ truy cập cơ sở dữ liệu hoặc chỉ một hoặc hai tài khoản ứng dụng tạo kết nối cơ sở dữ liệu, bạn có thể chỉ cần vô hiệu hóa (các) thông tin đăng nhập và hủy tất cả các kết nối, sau đó chỉ cần bật lại (các) thông tin đăng nhập khi nào bạn làm xong vậy.


Giống như, nhấp chuột phải vào đăng nhập trong SSMS và 'vô hiệu hóa?' Tôi sẽ thử điều đó ...
Baodad

1
@Baodad - Nhấp chuột phải, thuộc tính, trạng thái, Đăng nhập bị vô hiệu hóa
Cougar9000

1
Trời ơi, đó có thể là thứ tôi cần. Đây thực sự chỉ là tài khoản webuser chính mà tôi cần chặn truy cập để ngăn truy cập ứng dụng chính từ người dùng. Cảm ơn!
Baodad

@ Cougar9000 bằng cách vô hiệu hóa đăng nhập, điều đó sẽ giết tất cả các kết nối hiện có? Cách bạn diễn đạt có vẻ như có thể có thêm một bước sau khi vô hiệu hóa đăng nhập để hủy tất cả các kết nối. Bạn có thể xác nhận?
Chris

@Chris bạn sẽ phải hủy phiên sau khi vô hiệu hóa đăng nhập. Vô hiệu hóa nó ngăn không cho nó kết nối lại trong khi bạn đang cố gắng làm việc, đặc biệt hữu ích với các ứng dụng tự động đăng nhập lại và như vậy
Cougar9000

1

Tôi không chắc chắn tôi hiểu nếu SQL Server của bạn nằm trên cùng một máy với các ứng dụng đang truy cập nó.

Nếu không, bạn chỉ có thể vô hiệu hóa cổng tường lửa cho SQL Server cho tất cả lưu lượng truy cập đến và bạn đều ổn. Một tùy chọn khác là vô hiệu hóa địa chỉ IP trong trình quản lý cấu hình SQL Server được sử dụng để truy cập máy chủ (và chỉ để lại IP cục bộ 127.0.0.1)

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.