Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从Apache中的CGI脚本创建绑定装载时不可见_Linux_Apache_Centos7 - Fatal编程技术网

Linux 从Apache中的CGI脚本创建绑定装载时不可见

Linux 从Apache中的CGI脚本创建绑定装载时不可见,linux,apache,centos7,Linux,Apache,Centos7,我的应用程序允许用户将装载源目录绑定到目标装载点。这是所有工作正常,除了安装不存在的进程外,纠正它 我把这个问题归结为一个非常简单的脚本 #!/bin/bash echo "Content-type: text/html" echo "" echo "" echo "<p>Hello</p>" echo "<p>Results from pid #{$$}:</p>" echo "<ul>" c="sudo mkdir /sha

我的应用程序允许用户将装载源目录绑定到目标装载点。这是所有工作正常,除了安装不存在的进程外,纠正它

我把这个问题归结为一个非常简单的脚本

#!/bin/bash
echo "Content-type: text/html"
echo ""
echo ""

echo "<p>Hello</p>"

echo "<p>Results from pid #{$$}:</p>"
echo "<ul>"
  c="sudo mkdir /shares/target"
  echo "<li>Executed '$c', Results: " $(eval $c) "</li>"

  c="sudo mount --bind /root/source /shares/target"
  echo "<li>Executed '$c', Results: " $(eval $c) "</li>"

  c="sudo mount | grep shares"
  echo "<li>Executed '$c', Results: " $(eval $c) "</li>"

  c="sudo cat /proc/mounts | grep shares"
  echo "<li>Executed '$c', Results: " $(eval $c) "</li>"
echo "</ul>"
#/bin/bash
echo“内容类型:文本/html”
回声“”
回声“”
回声“你好

” echo“来自pid的结果:

” 回声“
    ” c=“sudo mkdir/shares/target” echo“
  • 执行了“$c”,结果:$(eval$c)”
  • “ c=“sudo mount--bind/root/source/shares/target” echo“
  • 执行了“$c”,结果:$(eval$c)”
  • “ c=“sudo mount | grep shares” echo“
  • 执行了“$c”,结果:$(eval$c)”
  • “ c=“sudo cat/proc/mounts | grep共享” echo“
  • 执行了“$c”,结果:$(eval$c)”
  • “ 回声“
前两个命令创建装载点并执行装载。最后两个命令验证结果。脚本执行时没有问题。但是,挂载在单独的shell进程中不可见或不可用。在单独的shell中执行最后两个命令不会显示挂载可用。如果我尝试执行“rm-rf/shares/target”,我会得到“rm:cannotremove'/shares/target/”:设备或资源繁忙”。执行“losf | grep/shares/target”“没有产出。在一个单独的shell中,我已经切换到apache用户,但是挂载仍然不可用。我通过记录“ls/proc/$$/root”的输出,验证了apache进程不在chroot中。它指向“/”

我正在跑步:

  • Apache 2.4.6
  • CentOS 7
  • httpd-2.4.6-31.el7.centos.1.x86_64
  • httpd-tools-2.4.6-31.el7.centos.1.x86_64
我将日志设置为debug,但错误日志没有显示任何内容


提前感谢。

此行为是由于
httpd.service
systemd单元中的以下行引起的:

PrivateTmp=true
systemd.exec(5)
手册页:

   PrivateTmp=
       Takes a boolean argument. If true, sets up a new file
       system namespace for the executed processes and mounts
       private /tmp and /var/tmp directories inside it that is not
       shared by processes outside of the namespace.
       [...]
       Note that using this setting will disconnect propagation of
       mounts from the service to the host (propagation in the
       opposite direction continues to work). This means that this
       setting may not be used for services which shall be able to
       install mount points in the main mount namespace.
换句话说,由
httpd
和子进程进行的装载将不受限制 对主机上的其他进程可见

从安全角度来看,
PrivateTmp
指令很有用,如下所述:

/tmp传统上是所有本地服务和服务的共享空间 用户。多年来,它一直是安全问题的主要来源 提供多种服务。符号链接攻击和DoS漏洞 由于可猜测/tmp,临时文件很常见。通过隔离 从主机的其余部分删除服务的/tmp,这样的漏洞就会 模拟

您可以安全地从单元文件中删除
PrivateTmp
指令(实际上不要修改单元文件——在
/etc/systemd/system/httpd.service
创建一个新的单元文件,然后
systemctl守护进程重新加载
,然后
systemctl重新启动httpd