2009-01-07 12 views
12

Tôi đã thấy một số hướng dẫn đề xuất rằng bạn bảo mật cơ sở dữ liệu bằng cách phân lớp tất cả truy cập dữ liệu thông qua các thủ tục đã lưu.Những lợi ích bảo mật nào được cung cấp bằng cách sử dụng các thủ tục được lưu trữ để truy cập dữ liệu?

Tôi biết rằng đối với SQL Server, bạn có thể bảo mật các bảng và thậm chí cả các cột chống lại các hoạt động CRUD.

Ví dụ:

--// Logged in as 'sa' 
USE AdventureWorks; 
GRANT SELECT ON Person.Address(AddressID, AddressLine1) to Matt; 
GRANT UPDATE ON Person.Address(AddressLine1) to Matt; 

--// Logged in as 'Matt' 
SELECT * from Person.Address;      --// Fail 
SELECT AddressID, AddressLine1 from Person.Address; --// Succeed 
UPDATE Person.Address SET AddressLine1 = '#____ 2700 Production Way' 
     WHERE AddressID = 497;      --// Succeed 

Cho rằng bạn có thể đảm bảo bảng và thậm chí là cột chống lại các hoạt động CRUD, làm thế nào để sử dụng một thủ tục lưu trữ cung cấp bảo mật bổ sung, hoặc quản lý an ninh?

+0

Có lẽ vì nó có hiệu quả trong loại bảo mật quan trọng nhất nếu bạn là dba - nó bảo vệ cơ sở dữ liệu khỏi các truy vấn được viết bởi các lập trình viên sử dụng mã thủ tục. (nửa đùa ...) – dkretz

Trả lời

4

Thủ tục được lưu trữ cung cấp bảo mật bổ sung bằng cách cho phép người dùng thực hiện các hoạt động CRUD (chèn, cập nhật, xóa) nhưng chỉ trong một thời trang giới hạn. Ví dụ: cho phép người dùng Matt cập nhật địa chỉ của một số hàng nhưng không cập nhật địa chỉ khác.

Nó cho phép bạn thêm kiểm tra dữ liệu để đảm bảo rằng dữ liệu được chèn vào là dữ liệu hợp lệ, không phải rác ngẫu nhiên. Đối với hầu hết mọi thứ, bạn có thể sử dụng các ràng buộc và hoặc trình kích hoạt để thực hiện một số công việc này, nhưng có những hạn chế. Các thủ tục được lưu trữ tăng cường bảo mật bằng cách đảm bảo rằng các hoạt động đang được thực hiện được cho phép bởi người dùng.

Dễ dàng hơn khi theo dõi các thay đổi đối với cơ sở dữ liệu mặc dù một điểm truy cập duy nhất, được kiểm soát bởi các ứng dụng của bạn, thay vì thông qua bất kỳ số lượng giao diện nào. Và quy trình có thể cập nhật nhật ký kiểm tra.

11

Bởi vì bằng cách giới hạn tất cả quyền truy cập vào các procs được lưu trữ, bạn đã thiết lập giao diện được xác định cho cơ sở dữ liệu, thông qua đó tất cả truy cập phải xảy ra ... Vì bạn sẽ DENY chọn trực tiếp, chèn, cập nhật và xóa hoạt động các bảng và khung nhìn, không ai có thể trực tiếp viết sql thiết kế riêng của họ mà làm bất cứ điều gì họ muốn ... Nếu bạn muốn giới hạn chèn vào bảng nhân viên nơi nhân viên được giao cho hơn ba dự án để chỉ những nhân viên có một điểm số lớn hơn 85 trên một bài kiểm tra trình độ, sau đó bạn có thể viết ràng buộc đó vào trong spaw SaveEmployee, và có ném một ngoại lệ cho bất kỳ mã khách hàng nào cố gắng làm điều đó ...

Chắc chắn bạn cũng làm điều tương tự sử dụng mã phía máy khách, nhưng sử dụng sProcs Quá trình thiết kế và quản lý dễ dàng hơn, tất cả các ứng dụng cố gắng truy cập hệ thống cơ sở dữ liệu này phải tuân thủ mọi ràng buộc và/hoặc các điều khoản bảo mật mà bạn xác định trong SProcs ... ứng dụng khách riêng biệt mới truy cập cơ sở dữ liệu có thể bỏ qua hoặc làm việc xung quanh một ràng buộc hoặc cung cấp bảo mật trong một SProc nếu SProc đó CHỈ CÁCH để chèn hoặc cập nhật bản ghi ...

+0

Đó là "rogue", không phải "rouge" ... trừ khi họ đang phát triển một dòng trang điểm mới;) –

+0

hah! Cảm ơn ... Tôi đã chỉnh sửa lỗi chính tả ... (Tôi từ một độ tuổi mà họ không dạy chúng tôi gõ .. và tôi chưa bao giờ học được .. Vì vậy, tôi sử dụng ba ngón tay. Và thực hiện rất nhiều lỗi chính tả!) –

10

Bạn có thể không muốn cung cấp cho Matt -blanc để cập nhật trực tiếp các bảng hoặc cột nhất định. Nếu Matt quyết định làm điều này:

UPDATE Person.Address SET AddressLine1 = NULL 

Rất tiếc. Matt quên mệnh đề WHERE và chỉ cần đặt cơ sở dữ liệu của bạn. Hoặc có lẽ Matt đã tức giận với ông chủ của mình và đã quyết định bỏ thuốc vào cuối ngày. Hoặc có thể mật khẩu của Matt không an toàn như nó đáng lẽ phải có và bây giờ một hacker có nó.

Đây chỉ là một ví dụ đơn giản. Việc kiểm soát các bảng và các cột có thể trở nên phức tạp hơn và có thể không thể truy cập được thông qua bất kỳ thứ gì ngoài các thủ tục được lưu trữ.

+0

Hmm ... không chắc chắn nếu đó thực sự là một lợi ích an ninh ... Bảo vệ cơ sở dữ liệu của bạn chống lại các nhà phát triển để làm cho những sai lầm ... Sao lưu? –

+1

Các trường hợp tương tự ở trên có thể được sử dụng để nói, nhận tất cả số SSN hoặc số thẻ tín dụng ra khỏi cơ sở dữ liệu. Không phải đề cập đến thực tế là khôi phục các bản sao lưu mất thời gian và chi phí tiền ngoài khả năng gây ra thời gian xuống cho ứng dụng của bạn. –

0

Quy trình được lưu trữ tốt hơn vì bảo mật trên thủ tục lưu sẵn (IIRC) sẽ bảo mật hơn trên bảng/cột.

Để truy cập một bảng, đó không phải là vấn đề lớn.Tuy nhiên, nếu bạn có một hoạt động liên quan đến nhiều cột trên nhiều bảng, có một cờ truy cập/từ chối cho một bảng/cột có thể không hoạt động cho tất cả các tình huống.

Tuy nhiên, quy trình được lưu trữ có thể thực hiện thao tác tổng hợp và bạn có thể đặt bảo mật phù hợp trên đó.

1

Trong hầu hết (tất cả?) RDBMS bạn có thể truy cập 'GRANT' trên các bảng cụ thể cho người dùng cụ thể. Một thủ tục được lưu trữ có thể chạy như một người dùng khác, một người có quyền truy cập lớn hơn. Tuy nhiên, thủ tục được lưu trữ không giống như cấp quyền truy cập cho toàn bộ bảng, thay vào đó, trước tiên nó có thể kiểm tra một số thứ và chỉ trả lại các hàng phù hợp với mối quan tâm bảo mật cụ thể của bạn. Bạn có thể thực hiện các kiểm tra tương tự với chế độ xem nhưng các thủ tục được lưu trữ thường linh hoạt hơn nhiều vì chúng có thể chạy hầu như bất kỳ SQL nào - so sánh kết quả và quyết định các hàng cần trả về.

2

Trong SQL Server, bạn không phải cấp quyền truy cập trực tiếp vào bảng nếu bạn sử dụng đúng procs được lưu trữ (có nghĩa là không có SQl động). Điều này có nghĩa là người dùng của bạn chỉ có thể làm những điều được định nghĩa bởi các procs. Nếu bạn có bất kỳ dữ liệu tài chính nào trong cơ sở dữ liệu của bạn hoặc dữ liệu có tính chất nhạy cảm, chỉ có số lượng người có thể ít nhất (thường là chỉ có dbas) mới có quyền truy cập trực tiếp vào các bảng. Điều này nghiêm trọng làm giảm nguy cơ gian lận hoặc bất mãn nhân viên trashing dữ liệu kinh doanh quan trọng của bạn hoặc nhân viên ăn cắp cá nhân inmformation để hành vi trộm cắp danh tính. Trong điều khoản kế toán, đây là một điều khiển nội bộ cần thiết và sự thuận tiện của nhà phát triển hoặc mong muốn cá nhân để làm tất cả mọi thứ động từ giao diện người dùng nên bị ảnh hưởng bởi sự mất an toàn của dữ liệu. Thật không may trong tất cả các công ty quá ít, nó không phải là. Hầu hết các nhà phát triển dường như chỉ lo lắng về các mối đe dọa bên ngoài đối với dữ liệu của họ, nhưng các nhà phát triển nội bộ thường quan trọng hơn nhiều.

Nếu bạn hạn chế người dùng ở cấp bảng và sau đó người dùng kích hoạt truy vấn để thực hiện chèn hợp pháp, điều đó sẽ không xảy ra. Nếu bạn cung cấp cho họ quyền để làm chèn, sau đó họ có thể làm bất kỳ chèn adhoc họ muốn và không chỉ giới hạn cho những người đến từ giao diện người dùng. Với procs được lưu trữ, chúng chỉ có thể thực hiện những điều được xác định cụ thể bởi proc.

+1

** Trong điều khoản kế toán, điều khiển nội bộ và sự thuận tiện của nhà phát triển hoặc mong muốn cá nhân để làm mọi thứ động từ giao diện người dùng sẽ bị ảnh hưởng bởi sự mất an toàn của dữ liệu. Thật không may trong tất cả các công ty quá ít, nó không phải là. Hầu hết các nhà phát triển dường như chỉ lo lắng về các mối đe dọa bên ngoài cho dữ liệu của họ, nhưng những người nội bộ thường quan trọng hơn nhiều. ** Yup! –

0

Nói một cách đơn giản, nó cho phép bạn xác định tính năng bảo mật thay vì cấu trúc. Nói cách khác, nó hạn chế những gì người dùng được phép làm (với mức độ chi tiết hơn) hơn là những gì các đối tượng cơ sở dữ liệu có thể truy cập (ở mức chi tiết rất thô.)

Lưu ý rằng chúng ta đang nói về "bảo mật được kiểm soát bởi DBA ", chứ không phải bởi trang web hoặc quản trị viên hệ thống hoặc mô-đun phần mềm, tất cả đều hữu ích và là một phần của cơ sở hạ tầng bảo mật tổng thể.

0

Lợi ích đầu tiên, được thảo luận ở đây, kiểm soát tốt hơn quyền - người dùng có thể bị giới hạn ở các hàng cụ thể, không chỉ cho mỗi cột (btw là quản lý trong hệ thống lớn); SP có thể thực thi logic nghiệp vụ và logic giao dịch; dữ liệu có thể chỉ được truy xuất phụ thuộc vào dữ liệu khác (ví dụ: tham gia); cập nhật có thể bị giới hạn ở các hàng đơn lẻ tại một thời điểm; vv ..

Thứ hai, điều này có thể cung cấp thêm một lớp bảo vệ chống lại SQL Injection (mặc dù không hoàn chỉnh và tự động). Trong khi điều này có thể bị hỏng là SQL động bên trong SP, hoặc bởi các cuộc gọi ghép nối xấu, SP thực thi các kiểu tham số và không có điều gì, tách mã khỏi dữ liệu.

Thứ ba, nó đi xuống đến kiểm soát, ở giai đoạn phát triển - DBA thường bạn muốn đã được đào tạo bằng văn bản cho SPs, như trái ngược với các lập trình viên (người được đào tạo trong mã ...)

Đây là, không đề cập đến, các lợi ích không bảo mật, chẳng hạn như hiệu suất tốt hơn.

0

Trong các thủ tục được lưu trữ, bạn có thể thêm điều khiển logic.Bạn có thể trả lại mã lỗi nếu có gì đó không đúng thay vì trực tiếp cập nhật dữ liệu bảng.

Ví dụ: bạn có hệ thống phản hồi. Phản hồi chỉ có thể được gửi sau khi chính quyền bắt đầu chiến dịch phản hồi. Nó chỉ đơn giản là cập nhật một lá cờ trong một số bảng. Sau đó, khi người dùng gửi phản hồi, SP có thể kiểm tra xem cờ có được đặt hay không.

Select @IsFeedbackDefined = IsFeedbackDefined From sometable where ID = @ID 

IF @IsFeedbackDefined is Null or @IsFeedbackDefined = false 
Begin 
    Return -2 --can not submit feedback 
End 
Các vấn đề liên quan