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
permissions
apache-http-server
perl
cgi
RedGrittyBrick
sumber
sumber
lp
kerja?ls
ada di/bin/
danlp
ada di/usr/bin
. Mungkin pengguna apache tidak punya/usr/bin
di jalurnya?/usr/bin/lp ...
!Jawaban:
selinux!
Ternyata saya punya selinux diinstal dan diaktifkan. Dengan sedikit konfigurasi masalah hilang
Petunjuk adalah
context=user_u:system_r:httpd_sys_script_t:s0
dalam output dariid
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"
dandenied
(mis. perintah lp ditolak)Detail berdarah mengikuti jika mereka membantu orang lain
Perintah lp berfungsi, saya tidak benar-benar khawatir tidak bisa
ls
di / rumah - itu fitur keamanan yang saya suka.sumber