Apache 使用 SELinux 在 CentOS 7 上执行 MATLAB 二进制文件

Apache executes MATLAB binary on CentOS 7 with SELinux

我试图在 Apache 上下文中触发 CentOS 7 服务器表单上的预编译 MATLAB 程序的 运行。系统允许用户上传一些文件。然后执行一些完整性检查。然后调用 MATLAB 程序并执行一些 MATLAB 魔术。

我安装了 MATLAB 环境:

    unzip -d mcr_unzipped MCR_R2015b_glnxa64_installer.zip
    sudo mcr_unzipped/install -glnx86 -tmpdir ~/tmp -mode silent -agreeToLicense yes    

我将 LD_LIBRARY_PATH 添加到 http.conf 文件:

    SetEnv LD_LIBRARY_PATH /usr/local/MATLAB/MATLAB_Runtime/v90/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v90/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v90/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v90/sys/opengl/lib/glnxa64

我尝试将我的 Web 应用程序的文件夹设置为 httpd_sys_rw_content_t 类型,而 MATLAB 环境的类型为 httpd_fastcgi_script_exec_t:

    chcon -R -t httpd_sys_rw_content_t /var/www/webapp
    #allow exec:
    setsebool -P httpd_ssi_exec 1
    #context:
    chcon -Rv --type=httpd_fastcgi_script_exec_t /usr/local/MATLAB/

当我用 "setenforce 0" 禁用 SELinux 时,设置就可以工作了。 Apache 运行 是 MATLAB 二进制文件,我所有的绘图和资料都可用。

我通过添加来自 audit.log 的策略解决了一些问题:

    audit2allow -a -M mypolicy
    semodule -i mypolicy.pp

并将路径添加到 /etc/ld.so.conf.d/,如下所示:

    echo "/usr/local/MATLAB/MATLAB_Runtime/v90/runtime/glnxa64" > /etc/ld.so.conf.d/matlab.runtime.conf

然后调用 ldconfig。

我的问题:

SELinux 执行时,无法加载MATLAB 运行时间环境。具体时间如下/var/log/httpd/error_log:

[Thu Jul 13 15:54:28.676588 2017] [:error] [pid 1382] [client 10.0.2.2:50377] PHP Notice: ... some warning or notice
Error:Could not find version 9.0 of the MATLAB Runtime.
Attempting to load libmwmclmcrrt.so.9.0.
Please install the correct version of the MATLAB Runtime.
Contact your vendor if you do not have an installer for the MATLAB Runtime.
[Thu Jul 13 15:54:29.056179 2017] [:error] [pid 1382] [client 10.0.2.2:50377] PHP Warning: ... some warning or notice

如您所见,执行失败,好像未设置 MATLAB 环境的路径。

除了禁用 SELinux,有人知道我能做些什么吗?

解决方案是结合更多的东西:

#since MATLAB is JAVA based:
sudo setsebool -P httpd_execmem 1

#allow exec tempfiles for httpd service
sudo setsebool -P httpd_tmp_exec 1

#flag MATLAB runtime lib as such an executable:
semanage fcontext -a -t systemd_tmpfiles_exec_t '/usr/local/MATLAB/MATLAB_Runtime/v90/sys/os/glnxa64/libgcc_s.so.1'
restorecon -v /usr/local/MATLAB/MATLAB_Runtime/v90/sys/os/glnxa64/libgcc_s.so.1

#flag my own binary as shell executable:
semanage fcontext -a -t shell_exec_t '/var/www/html/myMatlabCompiledBinary'
restorecon -v /var/www/html/myMatlabCompiledBinary