Przeniosłem skrypt CGI Perla ze starego systemu Linux RedHat na nowszy system Linux CentOS i jestem pewien system
komendy już nie działają.
na przykład system("ls -l filename");
działa OK, ale system("lp -d printer filename");
zwraca lp: Permission denied
.
Sprawdziłem uprawnienia do katalogów i plików, mogę używać tego samego skryptu CGI sudo -u apache scriptname
a potem kłopotliwe system
polecenia działają dobrze.
O ile wiem, httpd Apache nie jest chrootowany i nie ma w nim nic oczywistego httpd.conf
(który jest prawie tak zainstalowany).
Więc dlaczego mam lp: Permission Denied
?
Oto skrypt testowy
#!/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";
}
Oto, co otrzymuje przeglądarka
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
źródło
źródło
lp
praca?ls
jest w/bin/
ilp
jest w/usr/bin
. Być może użytkownik apache nie ma/usr/bin
na swojej drodze?/usr/bin/lp ...
!Odpowiedzi:
selinux!
Okazuje się, że miałem selinux zainstalowany i włączony. Przy odrobinie konfiguracji problem zniknął
Wskazówki były
context=user_u:system_r:httpd_sys_script_t:s0
na wyjściuid
selinux
folder w/
Znalazłem przepis na rozwiązanie w http://www.thedumbterminal.co.uk/php/knowledgebase/article/131 co spowodowało, że sprawdziłem plik audit.log - zauważyłem tam
comm="lp"
idenied
(tj. odmowa komendy lp)Krwawe szczegóły następują na wypadek, gdyby pomagały komukolwiek innemu
Polecenie lp działa, nie martwię się, że nie będę w stanie
ls
on / home - to funkcja bezpieczeństwa, którą lubię.źródło