Bạn có một số câu hỏi khác nhau ở đây, vì vậy tôi sẽ loại chúng ra:
"Tôi đã đọc rằng đó là cách tốt nhất để không cho phép người dùng sử dụng đăng nhập sa trực tiếp, thay vào đó sử dụng Windows xác thực"
Bạn đang trộn lẫn hai thứ ở đây: khái niệm SA và khái niệm xác thực SQL và xác thực Windows.
Xác thực SQL là danh sách tên người dùng và mật khẩu được lưu trữ trong mỗi và mọi Máy chủ SQL. Thực tế là nó được lưu trữ trong SQL là vấn đề đầu tiên. Nếu bạn cần thay đổi mật khẩu đăng nhập, bạn phải thay đổi mật khẩu trên mọi máy chủ (hoặc duy trì các mật khẩu khác nhau trên các máy chủ khác nhau). Với xác thực Windows, bạn có thể vô hiệu hóa tập trung đăng nhập, thay đổi mật khẩu, đặt chính sách, v.v.
Nếu bạn chọn sử dụng xác thực SQL, thì SA chỉ là một lần đăng nhập xác thực SQL. Đó là tên người dùng quản trị viên mặc định, giống như Quản trị viên đang xác thực Windows. Nó có siêu năng lực cục bộ trong một trường hợp đó, nhưng không phải siêu năng lực toàn cầu trên tất cả các trường hợp.
"... và cho phép các tài khoản (hoặc nhóm tài khoản) đặc quyền sysadmin."
Dù bạn chọn phương thức xác thực nào, lý tưởng nhất là bạn muốn tuân theo nguyên tắc đặc quyền tối thiểu: cấp cho mọi người các quyền tối thiểu mà họ cần để hoàn thành công việc, và không còn nữa.
Đừng nghĩ họ chỉ là thông tin đăng nhập - họ là những người có thể khiến bạn bị sa thải. Nếu họ vô tình làm rơi cơ sở dữ liệu hoặc vô hiệu hóa các công việc sao lưu của bạn, họ sẽ không bị sa thải, vì theo mặc định, SQL không theo dõi ai đã làm gì. Bạn là người sẽ bị sa thải bởi vì điều đó sẽ xảy ra, và bạn sẽ không thể nói ai đã làm điều đó.
"Làm thế nào để thực hành tốt nhất tăng tính bảo mật cho các phiên bản SQL Server của tôi?"
Bạn muốn làm hai điều:
- Ngăn chặn mọi người phá vỡ máy chủ
- Khi họ phá vỡ máy chủ, có thể xác định chính xác ai đã làm điều đó
Điều đầu tiên được thực hiện với nguyên tắc đặc quyền tối thiểu: chỉ cung cấp cho mọi người những quyền mà họ cần, và không có gì nữa.
Việc thứ hai được thực hiện bằng cách cung cấp cho mỗi người thông tin đăng nhập của riêng họ, không cho phép đăng nhập chung (như cho phép mọi người sử dụng cùng tên người dùng / mật khẩu) và lý tưởng nhất là kiểm tra thông tin đăng nhập. Bạn có thể sẽ không làm phần cuối đó ngay lập tức, vì điều đó thật đau đớn, nhưng hãy đặt các phần đó vào vị trí trước để bạn có thể thêm kiểm toán sau khi ai đó bỏ cơ sở dữ liệu và sếp của bạn muốn biết tại sao.
Tôi biết bạn đang nghĩ gì: "Nhưng chúng tôi đang mã hóa ứng dụng và ứng dụng cần đăng nhập." Có, cung cấp cho ứng dụng thông tin đăng nhập của riêng mình và các nhà phát triển cần biết mật khẩu đó, nhưng thông tin đăng nhập đó phải bị tước quyền mà không ai có thể muốn sử dụng nó. Ví dụ, có thể chỉ cần ở vai trò db_datareader và db_datawriter, không có gì khác. Bằng cách đó, nó có thể chèn, cập nhật, xóa và chọn dữ liệu, nhưng không nhất thiết phải thay đổi lược đồ, thêm chỉ mục, thay đổi thủ tục được lưu trữ, v.v.
"Điều này chỉ áp dụng cho các trường hợp sản xuất, hay cho các trường hợp phát triển nội bộ của chúng tôi nữa?"
Tôi nghĩ rằng nó chỉ áp dụng cho các trường hợp phát triển vì tôi thường lo lắng về việc mọi người phá vỡ mọi thứ. Mọi người chỉ thích phá vỡ các máy chủ trong phát triển. Và tất nhiên, khi đến lúc đưa ra danh sách các thay đổi để chuyển sang sản xuất, tôi cần biết liệu một chỉ mục cụ thể có thực sự quan trọng đối với ứng dụng hay không, liệu một số kẻ đầu não chỉ chạy Trình điều chỉnh cơ sở dữ liệu và bảo nó áp dụng tất cả các thay đổi . Quyền thích hợp giúp giảm bớt nỗi đau đó.