Apache CGI lp: Izin Ditolak

1

Saya memindahkan skrip Perl CGI dari kotak RedHat Linux lama ke kotak CentOS Linux yang lebih baru dan tertentu system perintah tidak lagi berfungsi.

sebagai contoh system("ls -l filename"); berfungsi dengan baik, tapi system("lp -d printer filename"); kembali lp: Permission denied.

Saya telah memeriksa izin pada direktori dan file, saya dapat menjalankan skrip CGI yang sama menggunakan sudo -u apache scriptname dan kemudian merepotkan system perintah bekerja dengan baik.

Sejauh yang saya tahu, Apache httpd tidak chroot dan tidak ada yang jelas httpd.conf (yang hampir sama terpasang).

Jadi mengapa saya mengerti lp: Permission Denied?


Inilah skrip uji

#!/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";
}

Inilah yang diterima browser

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
RedGrittyBrick
sumber
Saya tidak dapat mereproduksi ini di sistem saya dengan skrip yang Anda berikan. Apakah menggunakan path lengkap ke lp kerja? ls ada di /bin/ dan lp ada di /usr/bin. Mungkin pengguna apache tidak punya /usr/bin di jalurnya?
terdon
@terdon: Respons yang sama terhadap /usr/bin/lp ... !
RedGrittyBrick

Jawaban:

3

selinux!

Ternyata saya punya selinux diinstal dan diaktifkan. Dengan sedikit konfigurasi masalah hilang

Petunjuk adalah

  • string context=user_u:system_r:httpd_sys_script_t:s0 dalam output dari id
  • kehadiran seorang selinux folder dalam /

Saya menemukan resep untuk solusi di http://www.thedumbterminal.co.uk/php/knowledgebase/article/131 yang menyebabkan saya memeriksa audit.log - Di sana saya perhatikan comm="lp" dan denied (mis. perintah lp ditolak)

Detail berdarah mengikuti jika mereka membantu orang lain

# 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]

Perintah lp berfungsi, saya tidak benar-benar khawatir tidak bisa ls di / rumah - itu fitur keamanan yang saya suka.

RedGrittyBrick
sumber
Terlihat dengan baik :)
terdon