代码之家  ›  专栏  ›  技术社区  ›  Adriana

有没有一种方法可以作为非root用户启动/重新启动/停止linux上的apache服务器?[闭门]

  •  17
  • Adriana  · 技术社区  · 16 年前

    我想知道linux上的非root用户(我使用的是openSUSE)是否可以在不使用sudo命令的情况下运行apache。考虑到用户与apache(wwwrun)属于同一组。
    提前谢谢。

    11 回复  |  直到 16 年前
        1
  •  11
  •   kmkaplan    16 年前

    要使其显示在HTTPs标准端口80(这是专用端口)上,您必须进行设置, 作为根 重定向到真正的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/

        2
  •  6
  •   Jimmy Stenke    16 年前

    简短回答:没有

    原因是只有root用户可以绑定1024以下的端口。

    详细回答:退房 http://www.debian-administration.org/articles/386

    一旦你解决了港口的问题,我想就不会再有麻烦了。请记住,运行apache的用户需要对日志文件以及其他一些文件具有写访问权限。

    但是,如果您在没有sudo的情况下运行它,那么spawner可能无法更改用户,因此apache将作为启动它的用户而不是apache用户来运行。

    但你不想经营sudo的原因是什么?只有产卵器进程以root用户身份运行,其余进程在apache用户下运行。

        3
  •  6
  •   Emanuel Greisen    13 年前

    如果已安装sudo,则可以创建一个文件:/etc/suduers.d/apache2reload,其中包含以下内容:

    username    ALL=NOPASSWD:/usr/bin/service apache2 reload
    
        4
  •  4
  •   Kevin Seifert    10 年前

    如果不想授予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";
    

    gcc -o httpdctrl httpdctrl.c
    sudo chown root:root httpdctrl
    sudo chmod u+s httpdctrl
    

    现在httpdctrl归root所有,setuid将以root身份运行它。

    重要提示:确保启动/停止脚本和所有父目录也归root所有。同时删除“其他”对文件和目录的写访问权。基本上,您不希望有人能够编辑或更改使用root执行的dir/文件。

        5
  •  3
  •   Dave Sherohman    16 年前

    benlumley在上面指出的问题,即日志文件和保留端口,可以通过在httpd.conf中配置日志目录和端口轻松克服。

        6
  •  1
  •   benlumley    16 年前

    我认为你需要克服的两个问题是:

    1. 日志文件的权限-这些权限可能已经设置为允许wwwrun访问它们,但这通常是一个问题。

    2. 非root用户访问特权端口(80)-不确定是否可以/如何更改此端口。

        7
  •  0
  •   Jack Leow    16 年前

    我认为您应该能够通过向拥有Apache控制程序的组(例如,“chmod g+x apachectl”)授予execute访问权限来实现这一点。如果这本身不起作用,还可以尝试在程序上设置owner SUID位(类似于“chmod u+s apachectl”)。

    第一步允许wwwrun组中的用户执行apachectl程序。第二步是,当组运行程序时,它以程序所有者的权限运行。

    但在执行此操作之前,请确保您了解设置SUID位的后果。

        8
  •  0
  •   Nick    16 年前

    您可以使用“setuid”来允许非root用户以root身份运行apachectl(无需以root身份进行身份验证)。

    Example

    编辑:首先应该提到您需要根访问权限来设置它:-)

        9
  •  0
  •   Opentuned    12 年前

    您可以使用sudo-l查看您的权限,从这里您可能会发现您可以访问restart命令,但可能无法启动和停止。

        10
  •  0
  •   dtc    12 年前

    我发现的一些链接对此给出了最有益的答案。从技术上讲,它仍然充当root用户,但您可以chmod u+s apache2和apache2ctl(如果您也使用第二个)加载文件。这允许您使用root访问权限运行它们,但仍然是拥有相同权限的用户,保持安全完整(除非apache或apache2ctl做了更疯狂的事情,我对此表示怀疑)。

        11
  •  -1
  •   Tuong Le    11 年前

    您可以使用supervisor运行apache