Аутентификация с открытыми ключами и cx_Oracle с использованием Python

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


person Nitzle    schedule 07.05.2012    source источник
comment
Обратите внимание, но это может помочь — с помощью Oracle Wallet: dbaportal.eu/?q=node/ 126   -  person Jeffrey Kemp    schedule 08.05.2012


Ответы (2)


Одним из возможных решений является внедрение Oracle Wallet. Для создания записи в Oracle Wallet необходимо иметь:

  • имя разрешения tnsname, установленное для указанного экземпляра
  • имя пользователя и пароль

Пример: Oracle sid, с которым я работаю, называется ORCL, пользователь, с которым мне нужно соединиться, называется my_user. В вашем файле tnsnames.ora у вас уже есть запись, которая разрешает имя/sid службы ORCL, создайте еще одну с точно такими же параметрами:

#initial local name entry:
ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = my_ip)(PORT = 1528))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL)))

#create an additional local name entry:
ORCL_MY_USER = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = my_ip)(PORT = 1528))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL)))

После успешного разрешения новой записи создайте запись кошелька оракула для локального имени ORCL_MY_USER. Это новое локальное имя, которое вы собираетесь использовать в своем скрипте Python для подключения без указания или жесткого кодирования пароля.

Пример:

импорт cx_Oracle

db = cx_Oracle.connect("/@ORCL_MY_USER")

курсор = db.курсор()

r = cursor.execute("ВЫБРАТЬ имя пользователя, пароль, статус_учетной_записи, табличное_пространство по умолчанию, временное_табличное пространство из dba_users в порядке имени пользователя")

для имени пользователя, пароля, account_status, default_tablespace, временного_tablespace в курсоре:

    print username, '\t', password, '\t', account_status, '\t', default_tablespace, '\t', temporary_tablespace
person Jijiduru    schedule 31.05.2012
comment
Спасибо. В итоге я реализовал очень похожее решение. Мне нравится ваша идея отделить SID пользователя кошелька от обычного. Однако один вопрос: не нужно ли вам указать местоположение Oracle Wallet в sqlnet.ora? - person Nitzle; 31.05.2012
comment
Но неужели никто не сможет подключиться к базе данных с помощью этого кода? Что делать, если вы хотите, чтобы только некоторые люди могли это сделать, как при использовании модели открытого ключа/закрытого ключа. - person RamPrasadBismil; 27.05.2015

Да, вам нужно указать местоположение кошелька Oracle в sqlnet.ora.

WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u01/app/oracle/product/11.2.0.2/dbhome_1/owm/wallets/oracle)))
SQLNET.WALLET_OVERRIDE = TRUE
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_VERSION = 0

Насколько я понимаю, расположение кошелька Oracle по умолчанию находится в $ORACLE_HOME/owm/wallets/.

person Jiji Duru    schedule 01.06.2012