пятница, 19 июля 2013 г.

Tomcat и Oracle JDBC без паролей

В мануале Tomcat по поводу Oracle JDBC указывается, что логин и пароль указываются в элементе ресурса. Это вызывает ряд вопросов у DevOps/эксплуатации/ИБ - пароли в чистом виде хранятся в конфигурационном файле. Одним из промежуточных решений этой проблемы было указание переменных в catalina.properties и последующее использование их в атрибутах элемента подсоединения

# tail catalina.properties |grep passwd
scott.passwd=tiger
# cat Catalina/localhost/ROOT.xml
<context reloadable="false" unpackwar="false">
  <resource auth="Container" 
   driverclassname="oracle.jdbc.OracleDriver" 
   name="jdbc/Database" 
   password="${scott.passwd}" 
   type="javax.sql.DataSource" 
   url="jdbc:oracle:oci:@oradb" 
   username="scott">
</resource></context>
 
 


Но такое изменение конфигурации подразумевало слабую обновляемость конфигурационного кода Tomcat. catalina.properties затирается и все заново.

У Oracle есть возможность использовать wallet-ы (кошельки) для хранения паролей к подключению к базам и люди пользуются такой возможностью. Причем во многих местах, коллеги явно создают TNSNAMES.ORA и TNSALIAS в нем для того, чтобы указывать его как параметр создания записи в wallet-e. И в запущенных случаях это оправданно - лишний слой абстракции никому еще не мешал, но если речь идет о корпоративных системах, то есть OID, то в этом случае использование совместно с тонким клиентом (jdbc:oracle:thin:@...) становится затруднительным. Ведь тонкий клиент требует указания всех необходимых данных в строке подключения либо забирает их из LDAP сервера.

В этом случае, возможно использовать wallet-ы, рассматривая их просто как таблицу (url, user, pass). То есть при создании записи в ней, например, для ldap URL
mkstore -wrl #path_to_wallet# -createCredential "ldap://myldap.server/cn=OracleContext,dc=example,dc=com/oradb" username password
и в дальнейшем
# cat Catalina/localhost/ROOT.xml

<context reloadable="false" unpackwar="false">
  <resource 
    auth="Container" 
    driverclassname="oracle.jdbc.OracleDriver" 
    name="jdbc/Database" 
    type="javax.sql.DataSource" 
    connectionProperties="oracle.net.wallet_location=#path_to_wallet#" 
    url="jdbc:oracle:thin:/@ldap://myldap.server/cn=OracleContext,dc=example,dc=com/oradb">
</resource></context>

Указание connectionProperties возможно не только через конфигурацию, но и через системную переменную -Doracle.net.wallet_location=#path_to_wallet# Важно: чтобы в процессе работы Oracle JDBC мог работать с такими wallet-ами без полной инсталляции клиента Oracle, требуется использовать два jar файла, размещенные в classpath Tomcat - обычно в каталоге lib.
ojpse.jar
oraclepki.jar
Для работы соединения нужен только один файл oraclepki.jar. Второй нужен при работе с wallet из командной строки. Эти же два файла нужны для работы утилиты mkstore из поставки Oracle. Имея их в classpath и используя информацию из этого файла, можно собрать свою собственную утилиту.