gpt4 book ai didi

php - (U)通过带有“sudo”的“exec”安装。用户是NOPASSWD的“sudo”

转载 作者:太空宇宙 更新时间:2023-11-04 09:01:56 25 4
gpt4 key购买 nike

我已经看了这两个:
PHP: mount USB device
Error on mount through php "exec"
但是,我的问题似乎不同。
我已经构建了一个用于调用Linux CLI工具的扩展库。它是围绕proc_open而建的,它是一个家庭。
我正在使用它成功地执行所有的CLI工具(直到我碰到这个POSIX/mountbug)。
现在,我正在构建一个RAID设置例程,它涉及umountpartprobe-rm,mklabel,mkpart,parted-stop,zero superblock,create,mdadmdd并最终mkfs/mount
实际上有两个优美的例程,一个用于组装RAID,另一个用于反汇编。
正如标题所说,问题在于umountmount。上面列出的其他工具及其命令执行成功。
环境
Arch Linux-Linux stone 3.11.6-1-Arch#1 SMP抢占10月18日星期五23:22:36 CEST 2013 x86_64GNU/Linux。
拱门运行时有umount-这可能在某种程度上影响了安装。
运行mod_php(最新)的Apache web服务器(最新)。Apache作为systemd运行。
http:http属于http组,而wheel则是sudoers-wheels
请不要开始对%wheel ALL=(ALL) NOPASSWD: ALL进行全面的根功能讨论-这个单元是一个NAS,它运行一个自定义的WebOS,它只用于intranet。即使有黑客企图-这些很可能会破坏整个系统,这对客户是不健康的。NAS是用于webserver的存储设备,它运行大量依赖服务,并且这些单元已经部署在30多个对象中,没有问题。简而言之,webserver不是为web服务,而是为OS服务。
在写之前,我添加了一个快速测试,显式地给sudoershttp没有工作。
问题
在RAID汇编过程中运行的最后一个命令是http ALL=(ALL) NOPASSWD: ALL,它以“cc>”的退出代码返回。
执行后续装载会导致:

mount: /dev/md127 is already mounted or /mnt/supershare busy
/dev/md127 is already mounted on /mnt/supershare

使用“cc>退出代码”。所以,阵列被安装在某处。
在上述 mount /dev/md/stone\:supershare /mnt/supershare之后执行 0,返回一个 32的退出代码。执行随后的 umount /dev/md/stone\:supershare操作会导致:
umount: /dev/md/stone:supershare: not mounted

上面的命令是用sudo自动运行的。
所以,它成功地安装和卸载,但是。。。我以 mount的身份登录TTY0,在执行 0操作后运行 umount,但是,我没有看到 root
NAME      MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda 8:0 0 55.9G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part [SWAP]
├─sda3 8:3 0 12G 0 part /
└─sda4 8:4 0 16.6G 0 part /home
sdb 8:16 0 931.5G 0 disk
└─sdb1 8:17 0 899M 0 part
└─md127 9:127 0 1.8G 0 raid0
sdc 8:32 0 931.5G 0 disk
└─sdc1 8:33 0 899M 0 part
└─md127 9:127 0 1.8G 0 raid0

从TTY0尝试相同的 lsblk命令将成功装载它(之后将显示lsblk)。
如果我使用CLI工具 mount它,然后同时使用CLI工具运行 mountpointmount,则挂载点是可见的。
从TTY0立即以根用户身份运行两个命令时,不会显示装入点。
重新启动以重置所有装载(不是自动装载),然后,从TTY0装载并从TTY0运行 mount将显示装载点。
然后,使用CLI工具运行 mount -l,显示挂载点。
然后,用CLI工具运行 lsblk,退出代码 lsblk未安装。
再次使用CLI工具运行 lsblk,不会显示挂载点。
从TTY0运行 umount,仍然显示安装点。
似乎在使用我的CLI工具运行 0/ lsblk时,它会私下执行 lsblk会话运行器的命令。
mount在TTY0已装入后,确实要卸载它,但还是-私下卸载。
从TTY0登录为 umount并在从CLI工具装入RAID后运行 sudo,则不会显示装入点。这种类型否定了“为 umount会话运行程序私下执行”。
我还在 Mobotix IP cameras中发现了一种材料:
mount命令使用真实的用户ID而不是有效的用户ID来确定用户是否具有适当的访问权限。系统组成员可以发出设备装载,前提是他们对装载点和/etc/文件系统文件中指定的装载具有写访问权限。具有根用户权限的用户可以发出任何mount命令。
我希望我的解释足够好,不要太混乱,我也希望你们能帮助我抓住这个问题。
更新(2013-10-28)
我尝试在web上下文之外使用CLI工具进行测试,这是一个简单的PHP文件,我可以用 http和一个自定义用户来执行。
在这两种情况下,装载和卸载都是成功的。所以,这肯定是Apache执行命令的原因,不过,我不明白为什么其他命令也能工作。
问题
是什么导致了这个问题,我该如何克服它?

最佳答案

简而言之,hassle has been resolved
它是Apache对应的systemd服务,具有PrivateTmp=true指令。显然,该指令使用新的文件系统名称空间执行进程。
这个问题,在试图调试和修复这个问题时,在互联网上产生了许多其他的帖子。
https://unix.stackexchange.com/questions/97897/sudo-mount-from-webserver-apache-by-mod-php-result-not-visible-by-root
https://bbs.archlinux.org/viewtopic.php?id=172072
https://unix.stackexchange.com/questions/98182/a-process-run-as-root-when-performing-mount-is-mounting-for-self-how-to-ma/98191#98191
每一个都来自我在这个过程中学到的东西。
我从获取有关mount处理EUID的更深入信息开始。很快,我发现我的简单的sudo调用实际上不是用EUID 0执行的。这导致我对如何这样做进行了多次查询,结果生成了命令语法,如sudo -i 'su' -c 'mount /dev/sdb1 /mnt/firstone'和其他派生语法。
由于解决方案没有成功,我看得更远。
我开始考虑尝试将条目添加到/etc/fstab,这导致了大量的权限问题。另外,sudo和我的CLI工具对于该任务也证明是不完整的。让我们带来大武器-让我们用-DBIG_SECURITY_HOLE编译Apache,也就是说,让Apache有可能作为root运行。
让我们将条目附加到tab,让我们尝试装载。。。还有。。。失败!
经过无数次的测试、询问和其他什么,我偶然发现了per process mount,它引导我here,并向我打开了namespaces的维度。
好吧,这解释了一切-检查/proc/<pid>/mounts验证它,现在,让我们更深入地了解如何克服它。
再一次,经过无数次的尝试,没有成功,我开始发布基于我对名称空间的新知识的问题。缩小问题范围并变得更加技术化(至少我认为我做到了),这最终导致用户hiciu进入systemd方向,特别是Apaches服务-pointed me
喂!…显然PrivateTmp可以强制使用新的名称空间。

关于php - (U)通过带有“sudo”的“exec”安装。用户是NOPASSWD的“sudo”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19598201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com