使用root权限从Perl CGI程序运行脚本

时间:2014-07-24 19:11:56

标签: linux perl cgi sudo

我有一个Perl CGI应该允许用户从文件系统中选择一些文件,然后通过Rsync将它们发送到远程服务器。所有的HTML都是由Perl脚本生成的,我使用查询字符串和临时文件来表示有状态事务的错觉。 Rsync部分是一个单独的shell脚本,使用文件名作为参数调用(该脚本还会发送电子邮件和一些其他内容,这就是为什么我还没有把它移到Perl脚本中)。我想在没有密码的情况下使用sudo,并设置sudoers以允许apache用户在没有密码的情况下运行脚本并禁用requiretty,但是我仍然在日志中收到关于no tty的错误。我尝试使用su -c scriptname,但这也失败了。

TD; DR 使用Perl CGI脚本通过sudo调用Bash脚本是不是很糟糕,你如何处理Perl CGI脚本的权限提升? Linux 2.6内核上的Perl 5.10。

相关代码:( LFILE是一个包含文件系统中所有文件数组索引的文件)

elsif ( $ENV{QUERY_STRING} =~ 'yes' ) {
      my @CMDLINE = qw(/bin/su -c /bin/scriptname.sh);
      print $q->start_html;
      open('TFILE', '<', "/tmp/LFILE");
      print'<ul>';
      foreach(<TFILE>) {
         $FILES[$_] =~ s/\/.*\///g;
         print "Running command @CMDLINE $FILES[$_]";
         print $q->h1("Sending File: $FILES[$_]") ; `@CMDLINE $FILES[$_]` or print $q->h1("Problem: $?);

1 个答案:

答案 0 :(得分:1)

但是你最终这样做,你必须要小心。您希望最小化privilege escalation攻击的可能性。记住......

sudo不是用户(或进程)以更高权限执行代码的唯一方式。对于这种应用程序,我会使用setuid bit设置的程序。

  1. 编写一个程序,该程序可由具有适当权限的用户(在本例中为root,但请参阅下面的警告)运行,以执行 require 该权限的操作。 (这可能是您已经拥有的脚本,并在问题中引用。)使该程序尽可能简单,并花一些时间确保它写得很好并且相应安全。

  2. 通过以下操作设置程序中的“setuid位”:

    chmod a+x,u+s transfer_file
    

    这意味着任何人都可以执行该程序,但它使用程序的所有者的权限运行,而不仅仅是程序的用户

  3. 从现有(非特权)CGI脚本调用(特权)传输程序。

  4. 现在,为了尽可能降低所需的权限,我强烈避免以root身份执行传输。相反,创建一个具有执行文件传输所需权限的单独用户,但不能再创建,并使该用户成为setuid程序的所有者。这样,即使程序开放被利用,开发者也可以使用此用户的权限,而不是root权限。

    在设置这样的东西时有一些重要的“陷阱”。如果您遇到问题,请在本网站上再次询问。