Ошибка открытия сеанса su при запуске базы данных Oracle XE

Вопрос или проблема

У меня есть сервер RHEL 7.2 с установленной Oracle 11g Express Edition (11.2.0). Установка Oracle создала файл с именем “oracle-xe” в /etc/init.d. Это скрипт bash, который можно использовать для ручного запуска и остановки listener и базы данных. Когда я вошел на сервер, я могу выполнить следующую команду:

dzdo /etc/init.d/oracle-xe start

и listener Oracle и база данных запускаются без проблем. Я могу войти, используя sqlplus, и выполнять команды. Я пытаюсь использовать chkconfig, чтобы oracle-xe выполнялся автоматически при запуске системы, чтобы мне не приходилось вручную запускать listener и базу данных каждый раз, когда сервер перезагружается. Сам скрипт oracle-xe достаточно длинный, но основная его часть содержит следующее:

#!/bin/bash
# chkconfig: 2345 80 05

# Подключение библиотеки функций
if [ -f /lib/lsb/init-functions ]
then
    . /lib/lsb/init-functions
elif [ -f /etc/init.d/functions ]
then
    . /etc/init.d/functions
fi

SU=/bin/su
ORACLE_OWNER=oracle
$ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
LSNR=$ORACLE_HOME/bin/lsnrctl
SQLPLUS=$ORACLE_HOME/bin/sqlplus
$STARTUP_LOG=/home/tsm/log/oracle-xe.log

echo $(date) >> $STARTUP_LOG    
$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" >> $STARTUP_LOG 2>&1
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" >> $STARTUP_LOG 2>&1

Я добавил код $STARTUP_LOG и перенаправление вывода >>, чтобы выяснить, что происходит. Я добавил скрипт в chkconfig с помощью следующей команды:

cd /etc/init.d
dzdo chmod 750 oracle-xe
dzdo chkconfig --add oracle-xe
dzdo chkconfig oracle-xe on

Следующая команда выдает следующее (сокращенное) сообщение:

dzdo chkconfig --list

oracle-xe       0:off    1:off   2:on   3:on   4:on   5:on  6:off

Я перезагружаю сервер, и он создает файл журнала в /home/tsm/log/oracle-xe.log со следующим выводом:

Пт 13 янв 15:03:58 CST 2017
su: не удалось открыть сессию: Отказано в доступе
su: не удалось открыть сессию: Отказано в доступе

и как вы могли предположить, в результате этой неудачи su ни listener, ни движок базы данных не запускаются. Поскольку я вижу дату/время перезагрузки в файле журнала, я точно уверен, что скрипт выполняется при загрузке. Мне кажется, что это проблема разрешений, и что какая бы учетная запись ни использовалась для выполнения init-скриптов при старте системы, по какой-то причине не может выполнить su для $ORACLE_OWNER, однако я, как простой администратор, могу делать это без проблем с командной строки. Я думал, что код init выполняется от имени root, и, следовательно, эта команда su должна выполняться без проблемы. Я целый день искал и пробовал различные вещи, чтобы разобраться в этом, и извел все оставшиеся у меня волосы.

Сам сервер использует DirectAuthorize для предоставления прав доступа, поэтому я использую dzdo вместо sudo. Может ли это быть связано с данным вопросом?

Итак, я разобрался, в чем дело. Когда система использует DirectAuthorize, любая учетная запись, которая хочет выполнить su от имени другого пользователя, обязательно должна использовать dzdo вместо этого. Это касается даже root-аккаунта, используемого для запуска любой службы через chkconfig во время загрузки системы. Поэтому я изменил следующие строки в моем скриптовом файле oracle-xe:

$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start" >> $STARTUP_LOG 2>&1
$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql" >> $STARTUP_LOG 2>&1

на это:

dzdo -s -u $ORACLE_OWNER $LSNR start >> $STARTUP_LOG 2>&1
dzdo -s -u $ORACLE_OWNER $SQLPLUS -s /nolog @ORACLE_HOME/config/scripts/startdb.sql >> @STARTUP_LOG 2>&1

dzdo не является прямой заменой для su, так как у них разные опции и его нельзя просто вставить на место. В частности, нет опции -c для выполнения конкретной команды с dzdo. Вместо этого, команда для выполнения — это все, что появляется в конце выражения. Переключатель -s указывает на выполнение оболочки от имени целевого пользователя. После внесения этих изменений и перезагрузки, listener и экземпляр базы данных запустились от имени пользователя “oracle” без каких-либо проблем.

Ответ или решение

ошибка "su cannot open session" при запуске базы данных Oracle XE – это распространенная проблема, возникающая в системах, использующих инструменты управления доступом, такие как DirectAuthorize. Обычно такая ошибка связана с использованием команды su для смены пользователя и выполнения команд от имени пользователя Oracle при старте системы. Однако, когда DirectAuthorize или аналогичные системы управления доступом установлены, следует заменить su на специализированные команды, такие как dzdo, которые эти системы предоставляют.

Теория

Для начала важно понять, как происходит управление доступом в Linux-системах в контексте выполнения команд от имени другого пользователя. Команда su (от англ. switch user) используется для смены текущего пользователя. Это требует соответствующих разрешений, которые настраиваются при помощи PAM (Pluggable Authentication Modules). Когда используется инструмент управления доступом, такой как DirectAuthorize, он может переопределять стандартное поведение PAM, например, требуя использования dzdo вместо su даже для root-пользователя.

Пример

На сервере RHEL 7.2 был установлен Oracle 11g Express Edition. Во время установки в каталоге /etc/init.d был создан скрипт oracle-xe, который может быть использован для ручного запуска и остановки слушателя и базы данных. Однако проблема возникает, когда вы пытаетесь настроить запуск Oracle при старте системы с использованием chkconfig.

Первоначально в скрипте использовалась стандартная команда:

$SU -s /bin/bash $ORACLE_OWNER -c "$LSNR start"

и

$SU -s /bin/bash $ORACLE_OWNER -c "$SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql"

Эти строки предусматривали выполнение команды от имени пользователя Oracle. Однако при перезагрузке системы они выдавали su: cannot open session: Permission denied.

Применение

Проблему можно решить, заменив su на dzdo, предоставляемый DirectAuthorize. Из-за разницы в параметрах команд, вызовы команд должны быть изменены:

dzdo -s -u $ORACLE_OWNER $LSNR start >> $STARTUP_LOG 2>&1
dzdo -s -u $ORACLE_OWNER $SQLPLUS -s /nolog @$ORACLE_HOME/config/scripts/startdb.sql >> $STARTUP_LOG 2>&1

Здесь dzdo используется вместо su. Параметр -s указывает на выполнение оболочки от имени указанного пользователя, а -u задаёт пользователя, от имени которого должна выполняться команда. Важно помнить, что dzdo исполняет команды таким образом, что они начинаются сразу после указания пользователя.

После внесения этих изменений проблема с правами доступа была полностью решена. Теперь при загрузке системы скрипт запускается корректно, и база данных Oracle начинает работу без ручного вмешательства.

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...