2016-10-04 6 views
21

Я пытаюсь реализовать безопасность на уровне строк, чтобы наше приложение могло обеспечить более строгий контроль доступа.Безопасное обключение пула соединений

Одна из технологий, которую мы изучаем, представляет собой виртуальную частную базу данных Oracle, которая позволяет обеспечивать безопасность на уровне строк, в основном увеличивая все запросы к конкретным таблицам с помощью предиката предложения where. Поскольку мы находимся в веб-среде, нам нужно настроить специальный контекст в Oracle, внутри потока одного запроса. Мы используем пул соединений с учетной записью службы.

Я начал изучать Eclipse Link и Hibernate. Eclipse Link, похоже, имеет events, который идеально вписывается в эту модель.

Это привело бы нас к миграции из спящего режима, что не является проблемой, но мы были бы привязаны к EL для этих событий.

Oracle, похоже, подразумевает, что они реализуются на уровне источника данных в Web Logic product.

Контекст устанавливается и очищается исходным кодом WebLogic.

Вопрос: ли более целесообразным сделать это на уровне DataSource с некоторой серии событий. Каковы события или методы, на которые я должен обратить внимание?

Добавлено Вопрос: Как расширить пул соединений, чтобы безопасно инициализировать контекст оракула с помощью некоторых пользовательских данных? Я копаюсь в Apache, и кажется, что расширение BasicDataSource не дает мне доступ ко всему, что позволило бы мне очистить соединение, когда Spring будет с ним.

Мне нужно настроить соединение и очистить соединение как выход/введите пул соединений. Я надеюсь на реализацию, которая настолько проста, что никто не может испортить ее, нарушив тонкий баланс продуктов.

- Specifically we are currently using Apache Commons DBCP Basic Data Source 

Это позволит нам использовать различные способы подключения к базе данных и обеспечить безопасность. Но я не вижу отличного примера или набора событий для работы, и , переворачивающий мой собственный жизненный цикл безопасности - это не очень хорошая идея.

+0

Я бы не сделал этого на стороне пула соединений, так как пулы соединений обычно не имеют (и я думаю, они не должны иметь) информацию о пользователе, выполняющем запрос или запрос вообще. – jjmontes

+0

Не должно ли соединение JDBC оракула в конечном итоге поддерживать контекст соединения оракула? – TheNorthWes

+0

Думаю, что да. Следовательно, необходимо настроить параметры Oracle VPD для каждого запроса и очистить их при возврате соединения с пулом, как вы заявили. Для меня подход Eclipse Link является лучшим в этом сценарии, однако я не смог найти эквивалент для Hibernate/Hibernate + Spring, но я думаю, что это лучший уровень для решения этой проблемы. – jjmontes

ответ

-2

Вы получите лучший контроль, используя один из других источников данных базы данных Commons DBCP. Основной из них таков: basic :) Те, что находятся в пакете org.apache.commons.dbcp.datasources, дают вам более тонкий контроль.

+0

Что это значит? Я не вижу другого, который дает мне контроль во время возвращения в пул? – TheNorthWes

-1

Вы захотите сделать это на прикладном уровне. Вам понадобится крюк предварительной фиксации и крюк для чтения.

Крючок предварительной фиксации используется для обеспечения того, чтобы данные от клиента представлялись пользователем, уполномоченным изменять эти данные. Это предотвращает несанкционированный пользователь перезаписи данных, к которым они не могут получить доступ.

Это не интуитивно понятно, но крюк для проверки почты используется для того, чтобы клиент не получал доступ к данным, которые пользователь не должен просматривать. Это происходит после просмотра, потому что это выполняется на уровне приложения, а не на уровне данных. Приложение не имеет возможности узнать, разрешено ли вызывающему абоненту получать доступ к данным до тех пор, пока он не будет извлечен из уровня данных.В методе отслеживания отправления вы оцениваете учетные данные для каждой строки, возвращаемой с учетными данными зарегистрированного пользователя, чтобы определить, разрешен ли доступ. Если доступ запрещен в любой строке, тогда будет создано исключение, и данные не будут возвращены клиенту.

Обеспечение безопасности на уровне приложений, выполненное таким образом, требует, чтобы у вас был способ подключить каждую строку таблицы к разрешению/роли, необходимой для доступа к ней, и способу оценки разрешений пользователя на сервере во время выполнения.

Надеюсь, что это поможет.

+0

На самом деле это не значит, как создать экземпляр контекста для Oracle VPD или очистить его. Однако это еще один подход к безопасности на уровне строк. – TheNorthWes

+0

@AdmiralAdama полный вопрос начинается с «Я пытаюсь реализовать безопасность на уровне строк, чтобы наше приложение могло обеспечить более строгий контроль доступа». Установленный вопрос: «Уместнее ли это делать на уровне DataSource с некоторыми сериями событий». Мой ответ предназначен для того, чтобы предположить, что этот тип безопасности, который чаще всего ассоциируется с сеансом пользователя, управляемым на уровне приложения, а не на уровне данных, может управляться на уровне приложения с помощью моего предлагаемого подхода. – Adam

+0

Правда. Я собирался сосредоточиться на том, как использовать VPD. Извините, если это не ясно в моем вопросе. Моя проблема с вашим подходом заключается в том, что никакие другие клиенты не могут безопасно подключиться к данным. Каждый должен реализовывать политики ACL. Мы пытались сделать это безумным доказательством, чтобы никто не мог сломать его, не зная, что они сделали. – TheNorthWes

0

Вы можете попробовать любой механизм безопасности уровня объекта для простоты, например, Spring Security ACL.

+0

Спасибо, Spring ACL запускает почтовый запрос, который слишком поздно для моих нужд. Мне нужно обеспечить ACL, где хранятся данные. Но я не был ясен в своем вопросе, и это вполне приемлемое решение для многих людей. – TheNorthWes

+0

Вы хотите получить только те записи из базы данных, на которой пользователь имеет права? Если да, то могу ли я спросить вас, что вы говорите о разрешениях для пользователя dbUser или приложения? –

+0

Идея заключалась в том, чтобы работать с пользователем 1 db, но применять ACL конечным пользователем клиента (многие неизвестные разновидности) – TheNorthWes

2

В конце концов решил мою проблему, расширив некоторые из компонентов Apache.

Первый я продлил org.apache.commons.pool.impl.GenericObjectPool и перегрузил как borrowObject(), так и returnObject(). Я знал тип объектов в пуле (java.sql.Connection), поэтому я мог безопасно использовать и работать с ними.

Поскольку для моего случая я использовал Oracle VPD, мне удалось установить информацию в контексте приложения. Я рекомендую вам прочитать об этом более подробно. Это немного сложно, и существует множество различных опций для скрытия или совместного использования данных на разных уровнях контекста и через узлы RAC. Start

В сущности, я сделал сгенерировал nonce и использовал его для создания экземпляра сессии в oracle, а затем установил уровень доступа пользователя к переменной в этом сеансе, что тогда политика Oracle VPD будет читать и использовать для фильтрации строк.

Я экземпляр и уничтожил эту информацию в своей перегруженной borrowObject() и returnObject() The SQL Я пытался что-то вроде этого:

CallableStatement callStat = 
        conn.prepareCall("{call namespace.cust_ctx_pkg.set_session_id(" + Math.random() + ")}"); 
        callStat.execute(); 

Примечание math.random() isn't a good nonce.

Следующая была просто расширить org.apache.commons.dbcp.BasicDataSource и установить свой пул объектов по переопределение createConnectionPool(). Обратите внимание, что способ, которым я это сделал, отключил некоторые функции, которые мне не нужны, поэтому вам может потребоваться переписать больше или меньше, чем я.