О настройке доступа к СУБД 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 БД) и готова к созданию в ней репозитария.
Здесь и далее домашний каталог пользователя oracle — /u/app/oracle
Распаковываем java и задаем переменную JAVA_HOME
Распаковываем OID
Получается файл ./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.
Создаем схемы для репозитария в БД, для этого запускаем rcu
На этом этапе создаются схемы ODSSM, ODS и DEV_STB (запоминаем пароль, он потребуется при настройке компонентов домена)
Домен создаем в отдельную от ПО папку. Например указываем так:
/u/app/oracle/config/domains/oid_domain
Для коннекта к БД указываем параметры ранее созданных схем (и паролей)
При установке задаем логин и пароль для NodeManager (будет в дальнейшем использоваться для коннекта к NodeManager и запуска/останова через него самого OID)
Для запуска NodeManager нужно сгенерировать файл с ключами: DemoIdentity.jks. (Если кроме установки OID вы поставите обновления, то возможно этот шаг не понадобится)
Генерировать будем «умолчательный», что бы пока не мучатся с параметрами загрузки хранилища ключей в конфиге домена. С такими параметрами работает – это пароль для хранилища по умолчанию:
выполняем
(обязательно с точкой, по-другому не работает)
Переходим в директорию, в которой должен храниться файл:
Ключевая фраза DemoIdentityPassPhrase именно такая, иначе придется править конфиг домена.
Нужно разобраться и с этим, но надо сначала запустить, чтобы работало.
Нужно, чтобы сконфигурировать сам OID, иначе домен не сможет подключиться к БД репозитария (см.Проблема1)
нужен для того, чтобы нашлись нужные библиотеки и подтянулись из нужного ORACLE_HOME
Если что, проверяем с помощью ldd куда смотрят:
Должно быть на ORACLE_HOME с ПО FMW:
Ошибки, если это не так, см. в разделе Проблема2
Убедимся, что NodeManager запущен.
Логи и конфигурация: /u/app/oracle/config/domains/oid_domain/nodemanager
Проблема1:
Решение1: Идем и генерируем DemoIdentity.jks, как описано выше
Проблема2:
Решение2: устанавливаем переменную TNS_ADMIN и проверяем корректность логина/пароля
К этому моменту должны быть выставлены переменные
TNS_ADMIN
LD_LIBRARY_PATH
Предполагается, что NodeManager уже запущен.
Запускаем утилиту WLST:
Довыставляем переменные, которые нужны для работы утилиты WLST
дальше с помощью утилиты WLST подключаемся к NodeManager. Нам потребуется логин и пароль, заданные при инсталляции (указанные для NodeManager, у нас это weblogic)
Пример вывода:
Запускаем инициализацию, во время которой создается инстанс с именем oid1.
В строке ниже:
odsPassword – пароль к схеме ODS на базе репозитория, который был задан при выполнении ./rcu
orcladminPassword – пароль который будет использован в качестве cn=orcladmin для доступа к LDAP
realmDN – LDAP –схема, которая будет сконфигурирована
После выполнения должен будет создан компонент (инстанс в терминах FMW) с именем oid1
Проблема3:
Лог /u/app/oracle/config/domains/oid_domain/servers/OID/logs/oid1/oidmon*.log
содержит
Решение3:
Задаем переменную окружения
LD_LIBRARY_PATH=/u/app/oracle/product/middleware/Oracle_IDM1/lib:$LD_LIBRARY_PATH
перезапускаем NodeManager,
запускаем компонент:
Если компонет по этой причине создался но не работает, то убиваем процесс oidmon, изменяем в СУБД параметры статуса процесса:
Проверка коннекта:
Возможно, придется еще раз выполнить инициализацию oid_setup
Проблема4. При попытке сохранения в NetManager:
Решение4:
Еще раз прогнать oid_setup
Проверить настройки ldap.ora на клиенте с которого запускается Net Manager
DEFAULT_ADMIN_CONTEXT = «dc=mycompany,dc=ru»
Изменение параметра OID (для разрешения запросов от анонимных пользователей)
Когда создается TNS-имя с помощью net manager, но не работает tnsping.
Создаем файл:
cat anonymousbind.ldif
и модифицируем параметры с помощью этого файла:
Диагностика:
tnsping mytest не работает, a ldapsearch работает
Проверяем доступность портов 3060 и 3131(для SSL)
так все работает (с указанием пароля)
mytest – созданный ранее псевдоним.
На стороне клиента в $ORACLE_HOME/network/admin ложатся файлы:
ldap.ora
sqlnet.ora
tnsnames.ora
Файл tnsnames.ora содержит «локальные» алиасы, как обычно, и используется, если не найдено имя в LDAP.
Файл sqlnet.ora содержит описание порядка резолва:
sqlnet.ora
Параметры доступа к файлу LDAP задаются в ldap.ora
ldap.ora
В описанной конфигруации используется следующий порядок.
Сначала просматривется файл tnsnames.ora, если запись там не нашлась, то спрашиваем у LDAP (если нужно сменить порядок, меняем порядок в параметре NAMES.DIRECTORY_PATH
Далее идет запрос к основному серверу LDAP, если он недоступен по каким-то причинам, идем ко второму серверу в списке DIRECTORY_SERVERS
Порядок опроса в данном случае не важен, первым лучше указывать территориально ближайший сервер.
Default admin context (LDAP) используется для контекста по умолчанию, чтобы не указывать каждый раз mycompany.ru
По этой же причине не рекомендуется в записи алиаса использовать точку, он ее воспринимает как домен.
Дальше расскажу, как настроить репликацию между серверами
Данные хранятся в файле 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.
Создаем репозитарий (необходимые схемы в БД)
Создаем схемы для репозитария в БД, для этого запускаем 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
Для коннекта к БД указываем параметры ранее созданных схем (и паролей)
При установке задаем логин и пароль для 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
> <createDbWallet domain: /u/app/oracle/config/domains/oid_domain, oidpasswd output: password:
confirm 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: <b>error while loading shared libraries</b>: 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
Решение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
По этой же причине не рекомендуется в записи алиаса использовать точку, он ее воспринимает как домен.
Дальше расскажу, как настроить репликацию между серверами