[Из песочницы] Установка и настройка Oracle Internet Directory для разрешения имен баз данных

О настройке доступа к СУБД Oracle, который хранится в файле tnsnames.ora известно каждому, кто работал с этим типом СУБД.

Данные хранятся в файле tnsnames.ora в обычном текстовом виде и легко могут быть изменены с помощью любого текстового редактора. Хорошо если записей в нем не много, а что делать, если в организации сотни баз данных, доступы к которым нужно предоставлять с хостов пользователей различных уровней или с терминальных серверов. А если в один прекрасный момент база переезжает на другой хост, или происходят другие изменения, меняющие параметры доступа к БД, нужно изменить параметры доступа везде.

Решений предложить можно множество, включая редиректы, алиасы и т.п.

Я здесь опишу как установить и настроить единое хранилище для разрешения имен баз данных с помощью Oracle Internet Directory OID, и как обращаться за разрешением имен по LDAP-протоколу. Это гораздо удобнее, чем держать актуальным файл tnsnames.ora в сотни мест.
Установка и настройка СУБД для БД репозитория OID здесь не описывается, указываются ключевые моменты важные именно для этой конфигурации. С лицензионной политикой компании Oracle в части продуктов RDBMS Database, Oracle Fusion Middleware и Oracle Internet Directory вы можете ознакомится на сайте компании.

Установка ПО


Установка ПО производилась на ОС Linux (SUSE Linux Enterprise Server 11), для вашей ОС необходимо сверится с матрицей совместимости на сайте oracle.com.

Для установки Standalone сервера (под управлением NodeManager) были взяты следующие версии дистрибутивов, актуальные на момент настройки:

JAVA: jdk-8u171-linux-x64.tar.gz
OID: fmw_12.2.1.3.0_oid_linux64_Disk1_1of1.zip
RDBMS: 12.1.0.2 +PSU +Opatch актуальных версий

Устанавливаем ПО для репозитария, в котором будут храниться схемы OID

СУБД версии 12.1.0.2+PSU
БД. Созадем «пустую» БД:
Необходимо указать
кодировка AL32UTF8, включить ORACLE TEXT в установку ПО
параметры БД:
open_cursors=800
processes=500

Дополнительно потребовалось прогнать скрипт xaview.sql, что выяснилось на этапе проверки установки OID.
конфигурируем и поднимаем LISTENER для базы данных.

Итак, пустая БД создана uhost-oid1:1521/oid1 (в данном случае oid1- SID БД) и готова к созданию в ней репозитария.

Установка OID


Здесь и далее домашний каталог пользователя oracle — /u/app/oracle
Распаковываем java и задаем переменную JAVA_HOME

unzip jdk-8u171-linux-x64.tar.gz
export JAVA_HOME=/u/app/oracle/jdk1.8.0_171


Распаковываем OID

unzip  fmw_12.2.1.3.0_oid_linux64_Disk1_1of1.zip

Получается файл ./fmw_12.2.1.3.0_oid_linux64.bin

Проверяем, что он исполняемый, если это не так делаем

chmod +x 


Запускаем:

./fmw_12.2.1.3.0_oid_linux64.bin


(предварительно должны быть настроен проброс X-сервера), запустится java-based инсталлятор.

В качестве ORACLE_HOME было указано:

/u/app/oracle/product/middleware/Oracle_IDM1

По этому пути установится ПО для oracle fusion middleware (FMW) и Oracle Internet Directory.

На этапе «тип инсталляции» указываем STANDALONE.

rtdzedgsko18zmsercfms4xmq20.jpeg

Создаем репозитарий (необходимые схемы в БД)

Создаем схемы для репозитария в БД, для этого запускаем rcu

cd /u/app/oracle/product/middleware/Oracle_IDM1/oracle_common/bin/ 
./rcu.sh


На этом этапе создаются схемы ODSSM, ODS и DEV_STB (запоминаем пароль, он потребуется при настройке компонентов домена)

Создаем домен, в котором у нас будет работать OID (домен в терминах FMW)

cd /u/app/oracle/product/middleware/Oracle_IDM1/oracle_common/common/bin
./config.sh

Домен создаем в отдельную от ПО папку. Например указываем так:

/u/app/oracle/config/domains/oid_domain

p_vgopfkgcosbmmpo0e4r6cbz7q.jpeg

4jwmnxjeti-eo8ddm3n0tb0royo.jpeg

Для коннекта к БД указываем параметры ранее созданных схем (и паролей)
При установке задаем логин и пароль для NodeManager (будет в дальнейшем использоваться для коннекта к NodeManager и запуска/останова через него самого OID)

Запуск NodeManager


Для запуска NodeManager нужно сгенерировать файл с ключами: DemoIdentity.jks. (Если кроме установки OID вы поставите обновления, то возможно этот шаг не понадобится)
Генерировать будем «умолчательный», что бы пока не мучатся с параметрами загрузки хранилища ключей в конфиге домена. С такими параметрами работает — это пароль для хранилища по умолчанию:

cd /u/app/oracle/product/middleware/Oracle_IDM1/oracle_common/common/bin


выполняем

. setWlstEnv.sh 


(обязательно с точкой, по-другому не работает)
Переходим в директорию, в которой должен храниться файл:

cd /u/app/oracle/config/domains/oid_domain/security

java utils.CertGen -keyfilepass DemoIdentityPassPhrase -certfile democert -keyfile demokey -strength 1024 -noskid

java utils.ImportPrivateKey -keystore DemoIdentity.jks -storepass DemoIdentityKeyStorePassPhrase -keyfile demokey -keyfilepass DemoIdentityPassPhrase -certfile democert.pem -keyfile demokey.pem -alias demoidentity


Ключевая фраза DemoIdentityPassPhrase именно такая, иначе придется править конфиг домена.
Нужно разобраться и с этим, но надо сначала запустить, чтобы работало.

export TNS_ADMIN=/u/app/oracle/config/domains/oid_domain/config/fmwconfig/components/OID/config 


Нужно, чтобы сконфигурировать сам OID, иначе домен не сможет подключиться к БД репозитария (см.Проблема1)

export LD_LIBRARY_PATH=/u/app/oracle/product/middleware/Oracle_IDM1/lib:$LD_LIBRARY_PATH


нужен для того, чтобы нашлись нужные библиотеки и подтянулись из нужного ORACLE_HOME

Если что, проверяем с помощью ldd куда смотрят:

ldd /u/app/oracle/product/middleware/Oracle_IDM1/bin/oiddispd


Должно быть на ORACLE_HOME с ПО FMW:

libclntsh.so.12.1 => /u/app/oracle/product/middleware/Oracle_IDM1/lib/libclntsh.so.12.1


Ошибки, если это не так, см. в разделе Проблема2

cd  /u/app/oracle/config/domains/oid_domain/bin/
./setStartupEnv.sh – выставляет доп. переменные окружения
./startNodeManager.sh &


Убедимся, что NodeManager запущен.
Логи и конфигурация: /u/app/oracle/config/domains/oid_domain/nodemanager

Проблема1:

Jun 22, 2018 10:27:58 AM MSK  Fatal error in NodeManager server
weblogic.nodemanager.common.ConfigException: Identity key store file not found: /u/app/oracle/config/domains/oid_domain/security/DemoIdentity.jks


Решение1: Идем и генерируем DemoIdentity.jks, как описано выше

Проблема2:

Jun 28, 2018 12:20:08 PM MSK INFO /u/app/oracle/config/domains/oid_domain>><<        password:
confirm password:
Unable to Connect to Database: Incorrect location for tnsnames.ora (derived from DOMAIN_HOME) or Incorrect TNS Connect string or Invalid Password
> 


Решение2: устанавливаем переменную TNS_ADMIN и проверяем корректность логина/пароля

Первичная конфигурация OID


К этому моменту должны быть выставлены переменные
TNS_ADMIN
LD_LIBRARY_PATH
Предполагается, что NodeManager уже запущен.
Запускаем утилиту WLST:

cd /u/app/oracle/product/middleware/Oracle_IDM1/oracle_common/common/bin
export MW_HOME=$ORACLE_HOME 


Довыставляем переменные, которые нужны для работы утилиты WLST

./setHomeDirs.sh
./setWlstEnv.sh
./wlst.sh


дальше с помощью утилиты WLST подключаемся к NodeManager. Нам потребуется логин и пароль, заданные при инсталляции (указанные для NodeManager, у нас это weblogic)

nmConnect(username='weblogic',password='пароль от NodeManager ',domainName='oid_domain')


Пример вывода:

[13:45][uhost-oid1.oracle.:/u/app/oracle/product/middleware/Oracle_IDM1/oracle_common/common/bin]$ ./wlst.sh

Initializing WebLogic Scripting Tool (WLST) ...

Welcome to WebLogic Server Administration Scripting Shell

Type help() for help on available commands

wls:/offline> nmConnect(username='weblogic',password='*****',domainName='oid_domain')
Connecting to Node Manager ...
Successfully Connected to Node Manager.


Запускаем инициализацию, во время которой создается инстанс с именем oid1.
В строке ниже:

odsPassword — пароль к схеме ODS на базе репозитория, который был задан при выполнении ./rcu
orcladminPassword — пароль который будет использован в качестве cn=orcladmin для доступа к LDAP
realmDN — LDAP –схема, которая будет сконфигурирована

oid_setup(orcladminPassword='****',odsPassword='***',realmDN='dc=mycompany,dc=ru')


После выполнения должен будет создан компонент (инстанс в терминах FMW) с именем oid1

Проблема3:
Лог /u/app/oracle/config/domains/oid_domain/servers/OID/logs/oid1/oidmon*.log
содержит

/u/app/oracle/product/middleware/Oracle_IDM1/wlserver/../bin/oiddispd: error while loading shared libraries: libclntshcore.so.12.1: cannot open shared object file: No such file or directory


Решение3:
Задаем переменную окружения
LD_LIBRARY_PATH=/u/app/oracle/product/middleware/Oracle_IDM1/lib:$LD_LIBRARY_PATH
перезапускаем NodeManager,
запускаем компонент:

cd  /u/app/oracle/config/domains/oid_domain/bin/
nohup ./startNodeManager.sh &
./startComponent.sh oid1


Если компонет по этой причине создался, но не работает, то убиваем процесс oidmon, изменяем в СУБД параметры статуса процесса:

ps –ef|grep oidmon
kill oidmon

sqlplus / as sysdba
update ods.ods_process_status set pid=0 where compname='oid1';
update ods.ods_process_status set state=4 where compname='oid1';


Проверка коннекта:

./ldapbind -h localhost -p 3060
./ldapbind  -h localhost -p 3131 -U 1 -D 'cn=orcladmin' -w ****


Возможно, придется еще раз выполнить инициализацию oid_setup
Проблема4. При попытке сохранения в NetManager:

oracle.net.common.dataStore.DataStoreException: error writing ServiceAlias to: LDAPDataStore [svr: uhost-oid1.mycompany.ru:3060:3131, type: OID, ctxt: cn=OracleContext,dc=mycompany,dc=ru, home: C:\oracle\product\12.1.0\client_1]
original exception message: TNS-04409: Ошибка службы каталогов
  caused by: oracle.net.config.DirectoryServiceException: TNS-04405: Общая ошибка
  caused by: oracle.net.ldap.NNFLException
original stack trace: oracle.net.config.ServiceAliasException: TNS-04409: Ошибка службы каталогов
  caused by: oracle.net.config.DirectoryServiceException: TNS-04405: Общая ошибка
  caused by: oracle.net.ldap.NNFLException
oracle.net.config.DirectoryServiceException: TNS-04405: Общая ошибка
  caused by: oracle.net.ldap.NNFLException
oracle.net.ldap.NNFLException


p8pm1bts4oilkqr56yfupfyhfpq.jpeg

Решение4:
Еще раз прогнать oid_setup
Проверить настройки ldap.ora на клиенте с которого запускается Net Manager
DEFAULT_ADMIN_CONTEXT = «dc=mycompany, dc=ru»

Изменение параметра OID (для разрешения запросов от анонимных пользователей)
Когда создается TNS-имя с помощью net manager, но не работает tnsping.
Создаем файл:
cat anonymousbind.ldif

dn: cn=oid1,cn=osdldapd,cn=subconfigsubentry
changetype: modify
replace: orclAnonymousBindsFlag
orclAnonymousBindsFlag: 1


и модифицируем параметры с помощью этого файла:

ldapmodify -D cn=orcladmin -W -p 3131 -h localhost -f anonymousbind.ldif


Диагностика:
tnsping mytest не работает, a ldapsearch работает
Проверяем доступность портов 3060 и 3131(для SSL)

так все работает (с указанием пароля)

ldapsearch -h uhost-oid1.mycompany.ru -p 3060 -D "cn=orcladmin" -w password_hear -b "cn=mytest,cn=OracleContext,dc=mycompany,dc=ru" -s base "objectclass=*"


mytest — созданный ранее псевдоним.

Настройки клиента


На стороне клиента в $ORACLE_HOME/network/admin ложатся файлы:
ldap.ora
sqlnet.ora
tnsnames.ora

Файл tnsnames.ora содержит «локальные» алиасы, как обычно, и используется, если не найдено имя в LDAP.
Файл sqlnet.ora содержит описание порядка резолва:

sqlnet.ora

SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES,LDAP)

Параметры доступа к файлу LDAP задаются в ldap.ora

ldap.ora

DIRECTORY_SERVERS = (uhost-oid1.mycompany.ru:3060:3131,rephost-oid1.mycompany.ru:3060:3131) 
DIRECTORY_SERVER_TYPE = OID
DEFAULT_ADMIN_CONTEXT = "dc=mycompany,dc=ru"


В описанной конфигруации используется следующий порядок.

Сначала просматривется файл tnsnames.ora, если запись там не нашлась, то спрашиваем у LDAP (если нужно сменить порядок, меняем порядок в параметре NAMES.DIRECTORY_PATH

Далее идет запрос к основному серверу LDAP, если он недоступен по каким-то причинам, идем ко второму серверу в списке DIRECTORY_SERVERS

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

Default admin context (LDAP) используется для контекста по умолчанию, чтобы не указывать каждый раз mycompany.ru

По этой же причине не рекомендуется в записи алиаса использовать точку, он ее воспринимает как домен.

Дальше расскажу, как настроить репликацию между серверами

© Habrahabr.ru