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

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

TD; DR使用Perl CGI脚本通过sudo调用Bash脚本是一种非常糟糕的做法,您如何处理Perl CGI脚本的权限升级? Linux 2.6 Kernel上的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: $?); 

然而,你最终这样做,你必须小心。 你想尽量减少特权升级攻击的机会。 考虑到…。

sudo不是用户(或进程)可以使用增加的特权执行代码的唯一方法。 对于这种应用程序,我将使用setuid位设置的程序。

  1. 编写一个可以由相应权限的用户运行的程序(root,在这种情况下,虽然看到下面的警告)来执行需要该权限的操作。 (这可能是您已有的脚本,请参阅问题中的内容。)尽可能简化此程序,并花一些时间确保其编写得当,并确保安全。

  2. 通过执行如下操作来设置程序中的“setuid位”:

     chmod a+x,u+s transfer_file 

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

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

现在,为了尽可能降低所需的特权,我强烈避免以此为根本进行转移。 相反,创建一个单独的用户,拥有进行文件传输所需的权限,但不能使用户成为setuid程序的所有者。 这样一来,即使程序开放被利用,开发者也可以使用这个用户的权限,而不是root的权限。

建立这样的事情有一些重要的“陷阱”。 如果遇到麻烦,请在本网站再次提问。