我目前在我的ubuntu盒子上有一个PHP文件,我希望用它来通过网络界面在机器上创建用户(安全性blablabla,它在内部网络上的一切都完全无法访问任何意外/故意造成伤害的人系统)我最初尝试使用它:
shell_exec("sudo mkdir -m 755 ".escapeshellarg($directory));
shell_exec("sudo useradd -s /bin/false -d ".escapeshellarg($directory)." -p ".crypt($pass,$salt)." ".escapeshellarg($servername));
但显然这暴露了mkdir和useradd无密码sudo'd,所以不是这样做,我决定通过在/ etc中创建一个名为'newserver.sh'的shell脚本来减少复杂性,现在我有了这个;
#!/bin/bash
#Var 1 = Directory, Var 2 = Username Var 3 = Password
mkdir "$1"
chmod 755 "$1"
useradd -s /bin/false -d "$1" -p "$3" "$2"
chown "$2" "$1"
这似乎工作得更好,当我从终端运行它时工作得很好,但当PHP使用
执行它时shell_exec("sudo sh /etc/newserver.sh /home/testuser testuser testpass");
它似乎没有做任何事情(甚至用与从终端运行它时相同的参数进行测试。
仅供参考我的sudoers文件中包含此行www-data ALL=(root) NOPASSWD: /etc/newserver.sh
答案 0 :(得分:0)
首先,密码必须加密,如下所示:
/etc/newserver.sh /home/testuser testuser "$6$VP9.GI9D$nVjpXIlgoTCLYICNW9ijPqg07opPrjTU2ilYULaT4rut8S9CAmWggMXuOhJ27C5ltwCRfzSxEVgSlReA2i/rH1"
我认为,您应该使用“-c”作为参数。
shell_exec("sudo sh -c \"/etc/newserver.sh /home/testuser testuser testpass\"");
答案 1 :(得分:0)
以root身份运行可以通过两种方式完成:
sudo
(使www-data
成为一个sudoer并不是一个好主意......)看看/bin/ping
:
-rwsr-xr-x 1 root root /bin/ping
它属于root,但's'替换'x'(执行)意味着该程序是setuid:它将始终以所有者的身份执行:root。 ping
是一个需要构建ICMP数据包的程序,只有root才能操作它们直到最后。
您可以创建类似的环境:将命令放在shell脚本中(假设为myscript.sh
)并且:
chown root:root myscript.sh # Give it to root.
chmod u+s myscript.sh # Use setuid on it.
现在,当您运行它时,即使是常规用户(或Web服务器的www-data
...),也会以root用户的身份创建进程。
危险将setuid(以root身份)提供给脚本非常危险。您应该小心权限:除了您感兴趣的人之外,不要允许任何人运行它。例如,为允许运行此脚本的人创建一个名为 myscriptexec 的组:
addgroup myscriptexec
chgrp myscriptexec myscript.sh
chmod g+x # Group can execute.
chmod o= myscript.sh # No one executes except root and group members.
然后,根据需要将用户添加到该组。
如果您需要检查脚本,我建议您使用临时日志文件,以便进行调试:
exec > /tmp/mylog.log
exec 2> /tmp/mylog.log