Назад | Перейти на главную страницу

SELinux предотвращает доступ сценария Perl CGI к библиотекам Oracle

Я пытаюсь настроить SELinux на веб-сервере Red Hat Enterprise Linux 6.2, который запускает Apache 2.2.15 и Perl 5.10.1 и подключается к удаленным базам данных Oracle. Клиент Oracle 11.2g установлен. Скрипты PHP, которые обращаются к Oracle, работают, а скрипты Perl - нет. Когда SELinux работает, и я пытаюсь получить доступ к сценариям Perl через свой веб-браузер, в журналах ошибок Apache отображается следующее сообщение:

Can't load '/usr/local/lib64/perl5/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: libclntsh.so.11.1: cannot open shared object file: No such file or directory at /usr/lib64/perl5/DynaLoader.pm line 200.

Как ни странно, журнал аудита не записывает никаких соответствующих сообщений. Однако, когда я запускаю SELinux в разрешающий режим, Perl-скрипт работает отлично.

Это результат ls -lZ на libclntsh.so.11.1:

-rwxr-xr-x. oracle oracle system_u:object_r:textrel_shlib_t:s0 /path/to/oracle/product/11.2.0/client/lib/libclntsh.so.11.1

Есть ли у кого-нибудь предложения по исправлению этого? Я хотел бы иметь возможность запускать веб-сервер с помощью SELinux.

ОБНОВИТЬ: После установки selinux на dontaudit я получил больше результатов в audit.log. Однако модуль, который я создал с помощью audit2allow, не устанавливается. Выход semodule -i является: semodule: Failed on cgi_oracle!

cgi_oracle.te содержит:

module cgi_oracle 1.0;

require {
    type httpd_log_t;
    type httpd_t;
    type httpd_sys_script_t;
    class process { siginh noatsecure rlimitinh };
    class file { read write };
}

#============= httpd_sys_script_t ==============
allow httpd_sys_script_t httpd_log_t:file { read write };

#============= httpd_t ==============
allow httpd_t httpd_sys_script_t:process { siginh rlimitinh noatsecure };

Отмечен ряд политик SELinux. dontaudit так, что они не оставлять сообщения в журнале аудита. Обычно это происходит потому, что это политики, которые просто спамят журнал бесполезными записями, но иногда разработчики dontaudit отрицание, а не устранение основной проблемы. Политика, которую вы используете, почти наверняка входит в их число, так как вы не видите никаких сообщений, когда вы авторизуетесь. audit.log.

Вы можете временно отключить dontaudit запустив:

semodule -DB

После того, как вы обнаружили причину проблемы, снова включите dontaudit с участием:

semodule -B

Чтобы создать свою политику после ее создания, запустите:

make -f /usr/share/selinux/devel/Makefile

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

yum install -y setroubleshoot

затем

grep setrouble /var/log/messages

Например:

Aug  6 12:36:11 cnt3 setroubleshoot: [avc.ERROR] Plugin Exception catchall_boolean #012Traceback (most recent call last):#012  File "/usr/lib/python2.6/site-packages/setroubleshoot/analyze.py", line 191, in analyze_avc#012    report = plugin.analyze(avc)#012  File "/usr/share/setroubleshoot/plugins/catchall_boolean.py", line 90, in analyze#012    man_page = self.check_for_man(b)#012  File "/usr/share/setroubleshoot/plugins/catchall_boolean.py", line 76, in check_for_man#012    man_page = name.split("_")[0] + "_selinux"#012AttributeError: 'tuple' object has no attribute 'split'
Aug  6 12:36:11 cnt3 setroubleshoot: SELinux is preventing /usr/libexec/gdm-session-worker from read access on the directory /root. For complete SELinux messages. run sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01

sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01

sealert -l 721b07e3-e0e2-4a0e-a676-8eb622f7ce01
SELinux is preventing /usr/libexec/gdm-session-worker from read access on the directory /root.

*****  Plugin catchall (100. confidence) suggests  ***************************

Если вы считаете, что gdm-session-worker должен иметь доступ для чтения в корневом каталоге по умолчанию. Тогда вы должны сообщить об этом как об ошибке. Вы можете создать модуль локальной политики, чтобы разрешить этот доступ. Разрешите этот доступ на данный момент, выполнив:

grep gdm-session-wor /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp

Следуйте тому, что вам говорит sealert -l, и я думаю, ваша проблема должна быть решена. Надеюсь, это поможет.

Чтобы правильно определить проблему - вы должны запустить тест в разрешающем режиме SELinux, иначе вам нужно будет запускать тесты один за другим, что может занять некоторое время. После этого остановите веб-службу, убедитесь, что ваши журналы аудита пусты или чередуются, запустите веб-службу, выполните сценарии / тесты, проверьте журналы аудита и напишите новую политику. Насколько я понимаю, ваши сценарии хотят получить доступ к библиотекам Oracle для чтения, поэтому вам нужно будет добавить разрешение на чтение для "system_u: object_r: textrel_shlib_t: s0" в вашем приложении. Я не знаю, какова структура маркировки для Oracle, но я уверен, что вы сможете узнать. Проверьте audit2allow.