我想知道linux上的非root用户(我使用的是openSUSE)是否可以在不使用sudo命令的情况下运行apache。考虑到用户与apache(wwwrun)在同一组中 提前谢谢。
答案 0 :(得分:11)
您可以像任何用户一样运行Apache。只需确保将其设置为仅使用允许的资源(目录,文件,最重要的是监听非特权端口)。
要让它出现在HTTP的标准端口80(具有特权)上,您必须设置,以root身份重定向到真正的Apache服务器。最简单的方法可能是使用iptables。例如,如果您的Apache服务器正在侦听端口8080:
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -j REDIRECT --to-port 8080
如果您无法像这样配置服务器(或让您的系统管理员为所有人执行此操作),则必须使用非特权端口(类似Listen 8080
)并使用看起来像的URL访问它http://www.example.com:8080/
答案 1 :(得分:6)
如果你安装了sudo,你可以使用以下内容创建一个文件:/etc/suduers.d/apache2reload:
username ALL=NOPASSWD:/usr/bin/service apache2 reload
答案 2 :(得分:5)
简答:否
原因是只有root可以绑定1024以下的端口。
答案很长:查看http://www.debian-administration.org/articles/386
一旦你克服了端口的问题,我认为不会有任何麻烦。请记住,运行apache的用户需要对日志文件以及其他一些文件进行写访问。
但是,如果你在没有sudo的情况下运行它,那么spawner可能无法更改用户,因此apache将在用户启动时运行,而不是apache用户。
但是你不想运行sudo的原因是什么?它只是以root身份运行的spawner进程,其余的都在apache用户下运行。
答案 3 :(得分:4)
如果您不想提供sudo访问权限,您还可以创建一个setuid包装器程序。例如:
httpdctrl.c
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <strings.h>
// allow start/stop/restart of apache by non-root users
int main(int argc, char **argv)
{
char *cmd, *cmd2, *usage;
// UPDATE THIS LINE:
cmd = "/your/path/to/httpd/sbin/apachectl";
cmd2 = "apachectl";
usage = "Usage: COMMAND [start|stop|restart]\n";
if ( argc != 2 ) {
printf(usage);
exit(1);
}
setegid(0);
seteuid(0);
setgid(0);
setuid(0);
if ( strncmp(argv[1], "start", 5) == 0 ) {
if (execl(cmd, cmd2, "start", (char*)0) < 0) {
perror("Error");
}
} else if ( strncmp(argv[1], "stop", 4) == 0 ) {
if (execl(cmd, cmd2, "stop", (char*)0) < 0) {
perror("Error");
}
} else if ( strncmp(argv[1], "restart", 7) == 0 ) {
if (execl(cmd, cmd2, "restart", (char*)0) < 0) {
perror("Error");
}
} else {
printf(usage);
exit(1);
}
exit(0);
}
更新路径:
// UPDATE THIS LINE:
cmd = "/your/path/to/httpd/sbin/apachectl";
然后使用
编译和更改permisionsgcc -o httpdctrl httpdctrl.c
sudo chown root:root httpdctrl
sudo chmod u+s httpdctrl
现在httpdctrl由root拥有,setuid将以root身份运行。
重要信息:确保启动/停止脚本和所有父目录也由root拥有。同时删除对其他&#39;的文件和目录的写访问权限。基本上,您不希望某人能够编辑或更改使用root执行的目录/文件。
答案 4 :(得分:3)
benlumley指出的问题,即日志文件和保留端口,可以通过在httpd.conf中配置日志目录和端口轻松克服。
答案 5 :(得分:1)
我能想到的两个你需要克服的问题是:
日志文件的权限 - 这些权限可能已经设置为允许wwwrun访问它们,但它通常是一个问题。
非root用户访问特权端口(80) - 不确定是否/如何更改此内容。
答案 6 :(得分:0)
我认为您应该能够通过授予对拥有Apache控制程序的组的执行访问权来执行此操作(例如,“chmod g + x apachectl”)。如果这不能单独工作,请尝试在程序上设置所有者SUID位(类似于“chmod u + s apachectl”)。
第一步允许wwwrun组中的用户执行apachectl程序。第二步使得当组运行程序时,它以程序所有者权限运行。
让我知道如果这有效,我对文件执行SUID有点生疏,但如果你还有问题,我可以帮助进一步调查。
请确保在执行此操作之前了解设置SUID位的后果。
答案 7 :(得分:0)
答案 8 :(得分:0)
您可以使用sudo -l查看您的权限,从这里您可能会发现您可以访问restart命令,但可能无法启动和停止。
答案 9 :(得分:0)
我找到的一些链接为此提供了最有益的答案。从技术上讲,它仍然以root身份运行,但你可以通过chmod u + s apache2和apache2ctl(如果你还使用第二个)加载文件。这允许您使用root访问权限运行它们,但仍然是拥有相同权限的用户,保持安全性不变(除非apache或apache2ctl做了更疯狂的事情,我怀疑它们是什么)。
答案 10 :(得分:-1)
你可以使用主管来运行apache