6

Tôi đang tìm mẫu tốt để triển khai các điều khiển bảo mật mức hàng (thông qua dịch vụ web, dịch vụ web trung gian hoặc thủ tục được lưu trữ) phù hợp để sử dụng trong môi trường cơ sở dữ liệu khách hàng->. Tôi kiểm soát cả khách hàng và cơ sở dữ liệu. Một số yêu cầu:Bảo mật mức hàng trong kịch bản cơ sở dữ liệu khách hàng

  • Cấm người dùng nhìn thấy hàng trong kết quả truy vấn mà họ không có quyền để xem
  • Cho phép người dùng để chèn và cập nhật hàng của mình vào bảng, mang đến cho phép nhìn thấy chúng
  • họ
  • (yêu cầu mềm) cho phép người dùng cấp cho người khác quyền truy cập để đọc hoặc viết hàng của họ
  • Giải pháp nguồn mở hoặc chi phí thấp chạy trên Linux. Như tôi đã hiểu, không có cơ sở dữ liệu miễn phí nào thực hiện bảo mật mức hàng như vậy. Oracle hỗ trợ điều này nhưng nó cũng là quá. Postgres might be implementing this in 9.4, nhưng nó ban đầu được nhắm mục tiêu cho 9.3 và trượt và có thảo luận về ML rằng nó có thể trượt một lần nữa. Tôi đang nghĩ về việc sử dụng postgres chỉ vì họ có vẻ xa nhất trên tính năng này.

Một số (không tốt lắm) ý tưởng tôi đã có:

  • xem hàng rào an ninh Sử dụng postgresql và từ chối người dùng truy cập vào bảng bên dưới. Thật không may là có no good way to insert a row into a security barrier view, vì vậy một số proxy/webservice đặc quyền sẽ phải xử lý các câu lệnh chèn. Điều này có vẻ khó khăn để có được quyền.
  • Sử dụng chế độ xem thông thường và từ chối quyền truy cập của người dùng vào bảng bên dưới. Điều này cho phép insert, nhưng tôi sẽ cần phải khóa các quyền khá chặt chẽ (ví dụ: không có chức năng tạo) và there seem to be a lot of gotchas (like divide by zero) that leak information.
  • Xác định một số tập con của SQL và tạo proxy là điểm giao tiếp duy nhất của bạn với cơ sở dữ liệu. Proxy phân tích truy vấn SQL của bạn và viết lại nó để thực thi các yêu cầu bảo mật. Điều này có vẻ khó làm nói chung, nhưng có lẽ tôi có thể lấy đi với một tập con SQL rất nhỏ cho đến khi postgres thực hiện bảo mật mức hàng cho thực.
  • Chỉ có các bảng khác nhau cho những người dùng khác nhau (hoặc thậm chí là các DB khác nhau). Tuy nhiên, tôi không chắc chắn điều này có quy mô như thế nào đối với nhiều người dùng. Ngoài ra, điều này dường như không đáp ứng yêu cầu mềm.
  • Tìm một số DB thương mại nhưng hợp lý chi phí mà thực sự hỗ trợ này
  • Sử dụng Veil nhưng nó dường như không được duy trì, và nó có hầu hết các hạn chế của các giải pháp khác

Tôi đã làm một rất nhiều googling về chủ đề này nhưng tôi vẫn chưa thấy một postmortem về cách một người nào đó giải quyết vấn đề này trong một kịch bản thế giới thực. Có some documentation for MS SQL nhưng dường như là discouraged in MySQL và ghi lại về cơ bản là không tồn tại cho postgres. Điều này có vẻ như là một vấn đề rất phổ biến, nhưng tôi đoán nhiều người đang viết các ứng dụng web và nội dung để còng tay người dùng của họ vào một số truy vấn đã được kiểm tra trước, nhưng tôi thực sự cần cung cấp cho người dùng nhiều sự linh hoạt nhất có thể truy vấn dữ liệu với khách hàng của tôi.

+2

Vâng, bảo mật hàng cho PostgreSQL đã trượt xuống còn 9.4. Bản vá hiện tại khá tốt, nhưng tôi vẫn phải sửa ít nhất một lỗi liên quan đến các khung nhìn bảo mật trong codebase hiện tại, sửa các bài kiểm tra hồi quy, và thực hiện một số dọn dẹp chung để làm cho nó có khả năng. Đã quá muộn với 9.4. –

+0

Sẽ rất hữu ích nếu bạn đặt một từ tốt cho việc bao gồm các chế độ xem bảo mật có thể cập nhật tự động trong 9.4. Người dùng nhấn vào tính năng đó có thể là sự khác biệt giữa việc đưa vào và thiếu thời hạn. –

+0

http://www.postgresql.org/docs/devel/static/ddl-rowsecurity.html – kzh

Trả lời

2

Chủ đề bảo mật cấp hàng toàn bộ khá gây tranh cãi. Cá nhân của tôi về điều này là bạn đang sủa cây sai cố gắng để thực hiện điều này ở lớp cơ sở dữ liệu ACL. Tôi biết rằng Oracle hỗ trợ điều này nhưng imo nó là một ý tưởng thực sự tồi từ đầu và đã gây ra nhiều thất vọng hơn là tốt.Tôi biết bạn cảm thấy bị cám dỗ để tái sử dụng chức năng kiểm soát truy cập hiện tại chỉ để tiết kiệm trên dòng mã nhưng bản thân tôi sẽ không dám đi xuống con đường này chỉ vì bạn có thể kết thúc trong một kết thúc chết do kỳ vọng so với thực tế của ACL như thế nào được triển khai so với cách bạn muốn nó hoạt động.

1

Tôi đã thực hiện việc này trong Oracle và SQL Server ở cấp cơ sở dữ liệu, cũng như thông qua máy chủ web với các điều khiển ủy quyền được đặt trước (truy vấn dạng tự do), cũng như thông qua trình phân tích cú pháp SQL. truy vấn. mất của tôi:

 
1. Approach 1: Use database-level mechanisms, where user A is the database user 
    that creates/owns/fully controls all tables, views, and other 
    objects, and user B, C, D... are the end user accounts that utilize 
    the objects that A grants access to. 
    a. Pros 
    i. Might be easier to maintain; you may need fewer test cases to confirm that it 
     works properly 
    ii. Allows you to distribute an application that uses direct ODBC connections 
     (such as a Microsoft Access file) to multiple users, who can each have separate 
     row-level security 
    iii. Allows real-time updates to access control (either to individual permissions, 
     or to entire sets of permissions), via back-end database changes 
    iv. You don't have to worry about application security, because you are relying on 
     the database for all security (including the security of your admin account) 
    b. Cons: 
    i. Requires a separate database user account for each end user. This is generally 
     not desirable for, for example, tens of thousands of users 
    ii. By using ODBC, users are directly connecting to the database server, which could 
     be a security weakness under some circumstances (which depends on more factors than 
     are in scope for this question) 
    iii. Performance takes a significant hit. Another barrier to scalability 
    iv. For these and other reasons, this approach is generally not considered best 
     practice for production use 
    c. Implementation: 
    i. For Oracle, as you noted, there is built-in support 
    ii. For SQL Server, this can be implemented using views and instead-of triggers, 
     where the view or stored proc does SELECTs and triggers perform writes 
     in a controlled manner. This can get the job done, 
     but it is cumbersome, and requires a fair amount of code, much of which needs to 
     be changed whenever your authorization approach changes (such as changing what 
     fields in what ACL tables will authorize what actions based on what values in the 
     tables you want to secure). Furthermore, each set of code needs to be added to each 
     table you want to secure. Oracle, on the other hand, does something akin to 
     parsing the SQL statement and interjecting a where clause whenever the table you 
     are securing is involved. This is a far more flexible approach, but would be very 
     difficult to implement in SQL server unless you can write a SQL parser in T-SQL 
    iii. For postgreql and mysql, I believe you can implement the same approach as described 
     above for SQL Server, if this is the way you want to go. I suppose, in postgresql 
     you could write a SQL parser in C which performs the transformation to add the 
     necessary where clauses, make it available as a database function, pass your free- 
     form SQL to this function in your trigger or stored proc, and use the resulting 
     modified SQL as the query that gets run (or just have the C function run the query 
     and pass that back to the view). But that might be a lot of work for some added 
     flexibility for queries that you could not anticipate. 

2. Approach 2: Use an application in the middle. So either your application uses User A to log 
    in and do its stuff (not recommended, but technically, works fine), or you can set up a 
    more restricted User B just for your application, which can do everything that any end user 
    can do (e.g. view/change data), but nothing more (e.g. drop table). You rely on the 
    application to control access. 
    a. Pros: this is how most web and similar client-server applications work, and you'll find 
    lots of resources available for doing this 
    b. Cons: 
    i. you can't use this approach if you want to provide end users with an ODBC connection 
     (or an application that uses ODBC) 
    ii. As you point out, usually this is implemented in a manner that does not allow for 
     free-form SQL. There are two ways to address this latter concern: 
    A. Create your own SQL parser (this is your "proxy" solution), which your application 
     will use to parse any free-form SQL request (this will end up being similar to 
     Oracle's implementation, except that your SQL monkeying occurs in your application, 
     whereas Oracles occurs in the database). For all elements of the request that your 
     parser identifies as a table, you will perform a lookup in your ACL table to determine 
     what the "WHERE" predicate is (if any) related to that table, that will be added to 
     the SQL request before it is sent to the server. If you are familiar with creating 
     your own programming language parsers, this approach shouldn't be too hard, but if not, 
     you might not want to try-- you may find that trying to solve even simple use cases 
     ends up being just as complicated as solving any use case, so you either build a proper 
     parser that is completely flexible, or you get mired in bug fixing forever. In 
     addition, this approach will hit your performance hard just as Approach 1 does. 
    B. Create a user-interface that provides the type of query functionality you want without 
     truly being free-form. You would have to ensure the interface can support every 
     conceivable query you want to accept. While this is not ideal based on what you asked, 
     you may find it to be a more cost-effective approach given the amount of work to get 
     your SQL parser correct, if you haven't done it before, 

Nhìn chung, đề nghị của tôi là để đi với cách tiếp cận 1 nếu bạn có một dự án rất quy mô nhỏ và nó sẽ giúp bạn tiết kiệm thời gian để sử dụng ODBC (ví dụ, tôi đã làm điều này cho một phi công/kiểm tra dự án mà chúng tôi đã xây dựng ứng dụng trong Microsoft Access trong 2 tuần), và ngược lại, trừ khi tính linh hoạt thực sự là ưu tiên số 1 và hiệu suất không quan trọng, hãy đi với Phương pháp 2 bằng giao diện có cấu trúc cho phép ứng dụng kiểm soát quyền truy cập và để cung cấp cho bạn quyền kiểm soát hiệu suất tốt hơn.

0

tôi đang làm việc trên những dấu hiệu đó đây https://github.com/jbaliuka/sql-analytic Nó được phát triển cho báo cáo/mục đích phân tích ban đầu nhưng tôi có kế hoạch để thực hiện ứng dụng cổng vì vậy mà tôi có thể điều hướng DB và thực hiện SQL với DML qua JavaScript từ browser.It có thể có ích như plugin Olingo để xuất bản cơ sở dữ liệu dưới dạng Dịch vụ OData.

Các vấn đề liên quan