6

사용하기 적합한 행 수준 보안 컨트롤 (예 : 프록시, man-in-the-middle 웹 서비스 또는 저장 프로 시저 사용)을 구현하기위한 좋은 패턴을 찾고 있습니다 클라이언트 -> 데이터베이스 환경에서. 클라이언트와 데이터베이스를 모두 제어합니다. 일부 요구 사항 :클라이언트 - 데이터베이스 시나리오의 행 수준 보안

  • 쿼리의 행을 보는 사용자 금지는 삽입하고 그들에게 그들에게
  • 를 볼 수있는 권한을주는 테이블에 자신의 행을 업데이트하려면
  • 허용 사용자를 볼 수있는 권한이 없다는 결과
  • (소프트 요구 사항) 사용자가 다른 사용자에게 행을 읽거나 쓸 수있는 액세스 권한을 부여 할 수 있습니다.
  • Linux에서 실행되는 오픈 소스 또는 저렴한 솔루션입니다. 내가 알고 있듯이, 무료 데이터베이스는 행 수준 보안을 구현하지 않습니다. 오라클은이 문제를 지원하지만 역시 $$$$입니다. Postgres might be implementing this in 9.4하지만 원래는 9.3을 타겟으로 미끄러졌으며 ML에 대한 토론이 다시 시작될 수 있습니다. 나는 postgres를 사용하는 것에 대해 잠정적으로 생각하고있다.

    • 사용의 PostgreSQL의 보안 장벽 뷰와 기본 테이블에 대한 사용자의 액세스를 거부 :

    일부 (몹시 좋지 않다) 생각 나는 했어. 아쉽게도 no good way to insert a row into a security barrier view이 있으므로 일부 권한이있는 proxy/webservice는 insert 문을 처리해야합니다. 이것은 옳은 것처럼 보이지 않습니다.

  • 일반보기를 사용하고 기본 테이블에 대한 사용자 액세스를 거부합니다. 이것은 insert을 허용하지만, 권한을 꽤 단단히 고정해야합니다 (예 : 생성 기능 없음). there seem to be a lot of gotchas (like divide by zero) that leak information.
  • SQL의 일부 서브 세트를 정의하고 데이터베이스와의 유일한 통신 지점 인 프록시를 작성하십시오. 프록시는 SQL 쿼리를 구문 분석하고 다시 작성하여 보안 요구 사항을 적용합니다. 이것은 일반적으로 어려운 것처럼 보이지만 postgres가 실제 행 수준의 보안을 구현할 때까지 아주 작은 SQL 하위 집합으로 벗어날 수 있습니다.
  • 다른 사용자 (또는 다른 DB)에 대해서만 다른 테이블을 사용하십시오. 그러나 나는 이것이 얼마나 많은 사용자에게 잘 맞는지 잘 모르겠습니다. 또한, 이것은 부드러운 요구 사항을 충족시키지 못하는 것 같습니다.
  • 사실이
  • 사용 Veil 지원하는 일부 상업 합리적인 비용 DB를 찾기하지만 유지하지 않는 것, 그리고 내가이 짓을

다른 솔루션의 한계의 대부분을 가지고 이 주제에 대해 인터넷 검색을 많이하고 있지만 실제 시나리오에서이 문제를 어떻게 해결했는지에 대한 사후 검토는 아직 없습니다. some documentation for MS SQL이 있지만 discouraged in MySQL 인 것처럼 보입니다. 기본적으로 포스트그레스에는 쓰기가 존재하지 않습니다.

이것은 매우 일반적인 문제인 것처럼 보입니다.하지만 많은 사람들이 웹 응용 프로그램을 작성하고 있으며 사전 심사를 거친 특정 쿼리에 사용자를 수갑을 채우는 데 만족하고 있습니다.하지만 최대한 많은 유연성을 사용자에게 제공해야합니다. 내 클라이언트와 데이터를 쿼리하십시오.

+2

예, PostgreSQL의 행 보안이 9.4로 미끄러졌습니다. 현재 패치는 꽤 좋지만, 기존 코드베이스의 보안 장벽 뷰와 관련된 버그를 수정하고 회귀 테스트를 수정해야하며 커밋 할 수 있도록 일반적인 정리 작업을해야합니다. 9.4에는 너무 늦었습니다. –

+0

9.4에 자동으로 업데이트 할 수있는 보안 장벽보기가 포함되어 있다는 점을 잘 알고 있다면 도움이 될 것입니다. 사용자가 해당 기능을 클릭하면 포함과 마감 기한이 달라질 수 있습니다. –

+0

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

답변

2

전체 행 수준의 보안 주제가 상당히 논란의 여지가 있습니다. 이것에 대한 나의 개인적인 생각은 데이터베이스 ACL 레이어에서 이것을 구현하려고하는 잘못된 트리에서 짖고 있다는 것입니다. 나는 오라클이 이것을 지원하지만 오라클은 처음부터 정말로 나쁜 생각이었고 좋은 것보다 훨씬 더 많은 좌절감을 안겨주었습니다.나는 당신이 기존의 액세스 제어 기능을 코드 라인을 저장하기 위해 재사용하고 싶다는 생각이 들지만, ACL에 대한 기대와 기대로 인해 막 다른 골목에 처지기 때문에 나 자신도이 길로 내려갈 수는 없을 것입니다. 그것이 어떻게 작동하길 원하는지에 따라 구현됩니다.

1

데이터베이스 수준의 Oracle 및 SQL Server뿐만 아니라 사전 정의 된 권한 제어 (비 자유형 쿼리)가있는 웹 서버 및 자유 형식을 가능하게하는 SQL 구문 분석기를 통해이 작업을 수행했습니다 질문. 필자는 :

 
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, 

전반적으로, 내 추천은 매우 작은 규모의 프로젝트를 가지고 있고 그것은 당신에게 예를 들어, 내가 파일럿/테스트를 위해 이런 짓을 (ODBC를 사용하는 시간을 절약 할 수있는 경우 접근법 1로 이동하는 것입니다 2 주 안에 Microsoft Access에서 응용 프로그램을 빌드 한 프로젝트), 그렇지 않은 경우 응용 프로그램에서 액세스를 제어 할 수있는 구조화 된 인터페이스를 사용하는 접근 방식 2와 함께 유연성이 진정으로 1 위 우선 순위이고 성능이 중요하지 않으면 성능을보다 강력하게 제어 할 수 있습니다.

0

나는 여기에서 그런 프록시 작업을하고있다 https://github.com/jbaliuka/sql-analytic 처음에는보고/분석 목적으로 개발되었지만 게이트웨이 애플리케이션을 구현하여 브라우저에서 JavaScript를 통해 DML로 SQL을 실행하고 DB를 탐색 할 계획이다. Olingo 플러그인으로 OData 서비스로 데이터베이스를 게시 할 수도 있습니다.