Apache CGI lp: अनुमति अस्वीकृत


1

मैंने एक पुराने RedHat Linux बॉक्स से एक पर्ल CGI स्क्रिप्ट को हाल ही में CentOS Linux बॉक्स में स्थानांतरित कर दिया और कुछ systemकमांड अब काम नहीं करता है।

उदाहरण के लिए system("ls -l filename");ठीक काम करता है, लेकिन system("lp -d printer filename");रिटर्न lp: Permission denied

मैंने निर्देशिकाओं और फ़ाइलों पर अनुमतियों की जाँच की है, मैं उसी सीजीआई स्क्रिप्ट का उपयोग करके चला सकता हूं sudo -u apache scriptnameऔर फिर परेशानी systemकमांड ठीक काम करता है।

अब तक मैं बता सकता हूं, अपाचे httpd को काट नहीं दिया गया है और इसमें कुछ भी स्पष्ट नहीं है httpd.conf(जो लगभग स्थापित है)।

तो मुझे क्यों मिलता है lp: Permission Denied?


यहाँ एक परीक्षण स्क्रिप्ट है

#!/usr/bin/perl
use strict;
use warnings;
#use CGI::Carp qw(fatalsToBrowser);

BEGIN {
  open (STDERR, '>&STDOUT') || die "cant merge STDERR $!\n";
  $|=1;
}

print "Content-Type: text/plain\n\n";
print "TEST\n\n";
psys('id');
psys('which lp');
psys('ls -l /tmp/po-list.19025.ps');
psys('ls -ld /usr /usr/bin /usr/bin/lp');
psys('ls -l /etc/alternatives/print-lp');
psys('ls -l /usr/bin/lp.cups');
psys('lp -d laser1 /tmp/po-list.19025.ps');
psys('ls /home | wc -l');
print "Finished\n";

sub psys {
  my $command = shift;
  print "# $command\n";
  system($command);
  print "\n";
}

यहाँ एक ब्राउज़र क्या मिलता है

TEST

# id
uid=48(apache) gid=48(apache) groups=48(apache) context=user_u:system_r:httpd_sys_script_t:s0

# which lp
/usr/bin/lp

# ls -l /tmp/po-list.19025.ps
-rw-r--r-- 1 apache apache 2309 Aug 30 15:59 /tmp/po-list.19025.ps

# ls -ld /usr /usr/bin /usr/bin/lp
drwxr-xr-x 15 root root  4096 Sep 22  2011 /usr
drwxr-xr-x  2 root root 36864 Aug 30 12:06 /usr/bin
lrwxrwxrwx  1 root root    26 Mar 18  2011 /usr/bin/lp -> /etc/alternatives/print-lp

# ls -l /etc/alternatives/print-lp
lrwxrwxrwx 1 root root 16 Sep 22  2011 /etc/alternatives/print-lp -> /usr/bin/lp.cups

# ls -l /usr/bin/lp.cups
-rwxr-xr-x 1 root root 18792 Mar 30  2011 /usr/bin/lp.cups

# lp -d laser1 /tmp/po-list.19025.ps
lp: Permission denied

# ls /home | wc -l
ls: /home: Permission denied
0

Finished

आपके द्वारा दी गई स्क्रिप्ट के साथ मैं अपने सिस्टम पर इसे पुन: पेश नहीं कर सकता। काम करने के लिए पूर्ण पथ का उपयोग करता है lp? lsमें है /bin/और lpमें है /usr/bin। शायद अपाचे उपयोगकर्ता के पास /usr/binइसके रास्ते में नहीं है?
टेराडॉन

@terdon: उसी की प्रतिक्रिया /usr/bin/lp ...!
RedGrittyBrick

जवाबों:


3

SELinux!

यह पता चला है कि मेरे पास सेलिनक्स स्थापित और सक्षम था। थोड़ा विन्यास के साथ समस्या दूर हो गई

सुराग थे

  • के context=user_u:system_r:httpd_sys_script_t:s0उत्पादन में स्ट्रिंगid
  • में एक selinuxफ़ोल्डर की उपस्थिति/

मुझे http://www.thedumbterminal.co.uk/php/knowledgebase/article/131 पर समाधान के लिए एक नुस्खा मिला, जिसके कारण मुझे ऑडिट की जाँच करनी पड़ी। - वहाँ मैंने देखा comm="lp"और denied(यानी lp कमांड ने इनकार किया)

मामले में वे किसी और की मदद करते हैं

# grep 'comm="lp' /var/log/audit/audit.log | tail -n 2
type=AVC msg=audit(1346348949.002:30060): avc:  denied  { name_connect } for  pid=20130 comm="lp" dest=631 scontext=user_u:system_r:httpd_sys_script_t:s0 tcontext=system_u:object_r:ipp_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1346348949.002:30060): arch=c000003e syscall=42 success=no exit=-13 a0=4 a1=2b0a50c0b108 a2=10 a3=7ffffa3aeba4 items=0 ppid=20123 pid=20130 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="lp" exe="/usr/bin/lp.cups" subj=user_u:system_r:httpd_sys_script_t:s0 key=(null)


# grep 'comm="lp' /var/log/audit/audit.log | tail -n 3 | audit2allow


#============= httpd_sys_script_t ==============
allow httpd_sys_script_t ipp_port_t:tcp_socket name_connect;


# grep 'comm="lp' /var/log/audit/audit.log | tail -n 3 | audit2allow -M secommands
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i secommands.pp


# ls secom*
secommands.pp  secommands.te


# /usr/sbin/semodule -i secommands.pp


# wget -O - http://localhost/cgi-bin/t4.pl
--2012-08-30 19:05:09--  http://localhost/cgi-bin/t4.pl
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/plain]
Saving to: `STDOUT'

    [<=>                                    ] 0           --.-K/s              TEST


# /usr/bin/lp -d laser1 /tmp/po-list.19025.ps
request id is laser1-23 (1 file(s))

# ls /home | wc -l
ls: /home: Permission denied
0

Finished
    [ <=>                                   ] 2,034       --.-K/s   in 0.03s

2012-08-30 19:05:09 (56.9 KB/s) - `-' saved [2034]

Lp कमांड काम करता है, मैं वास्तव में ls/ घर पर सक्षम नहीं होने के बारे में चिंतित नहीं हूं - यह एक सुरक्षा विशेषता है जो मुझे पसंद है।


अच्छी तरह से धब्बेदार :)
टेराडन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.