Apache [PTY Errors] в файле cgi-perl при создании нового объекта Expect - PullRequest
0 голосов
/ 05 августа 2011

У меня есть Perl-скрипт:

#!/usr/bin/perl -w
use DateTime;
use Expect; 
use IO::Pty;
use CGI::Fast;


while($q = new CGI::Fast){
    my $ip = $q->param('ip');
    my $folder = $q->param('folder');
    my $username = $q->param('username');
    my $password = $q->param('password');
    print "Content-type: text/html\r\n\r\n";
    print "<head>\n<title>FastCGI</title>\n\</head>";
    print "<h3> $ip - $folder - $username - $password </h3>";

my $ssh = new Expect;

if($ssh->spawn("ssh -q -l $username $ip")){
    print "<h4>Connexion OK</h4>";
    } else {
        print "Error\n";
        die "Connexion failed, $!";
    }
}

При выполнении этого скрипта в моем журнале ошибок Apache'а возникают ошибки:

[error] [client x.x.x.x] pty_allocate(nonfatal): posix_openpt(): Permission denied at /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/IO/Pty.pm line 24., referer: http://y.y.y.y/login
[error] [client x.x.x.x] pty_allocate(nonfatal): getpt(): No such file or directory at /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/IO/Pty.pm line 24., referer: http://y.y.y.y/login
[error] [client x.x.x.x] pty_allocate(nonfatal): openpty(): No such file or directory at /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/IO/Pty.pm line 24., referer: http://y.y.y.y/login
[error] [client x.x.x.x] pty_allocate(nonfatal): open(/dev/ptmx): Permission denied at /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi/IO/Pty.pm line 24., referer: http://y.y.y.y/login
[error] [client x.x.x.x] Cannot open a pty at /var/www/cgi-bin/cgi2.pl line 18, referer: http://y.y.y.y/login

Я понимаю ошибку, как она говоритон не может открыть PTY (с помощью команды new Expect ).

Действительно ли это проблема разрешения (и как это исправить) или невозможно использовать Ожидаете команды в CGI-файле?

Спасибо за советы ....

Ответы [ 3 ]

1 голос
/ 16 июля 2012

Это потому, что httpd_sys_script_t не имеет прав selinux на чтение / запись pty, но следующая политика selinux разрешит это:

policy_module(httpd_pty,1.0)
require {
    type httpd_sys_cript_t;
    type ptmx_t;
    class chr_file { read write };
}
allow httpd_sys_script_t ptmx_t:chr_file { read write };

Возможно, вы сможете изменить на class chr_file rw_chr_file_perms;, иallow httpd_sys_script_t ptmx_t:chr_file rw_chr_file_perms;, в зависимости от того, насколько свежа ваша политика selinux.Вышеприведенное будет работать с rhel5, макрос в этой строке будет работать с rhel6.

Или, по совету #selinux по freenode:

mkdir ~/myhttpd
cd ~/myhttpd
echo "policy_module(myhttpd,1.0.0) optional_policy(\` apache_content_template(myscript)')" > myhttpd.te
echo "/home/httpd/foo/cgi-bin/test.pl -- gen_context(system_u:object_r:httpd_myscript_script_exec_t,s0)" > myhttpd.fc
make -f /usr/share/selinux/devel/Makefile myhttpd.pp
sudo semodule -i myhttpd.pp

По сути, политика apache имеет способсоздать свой собственный тип контента.Создайте тип контента для вашего скрипта во фрагменте кода выше.Затем используйте новые отклонения AVC и добавьте в файл политики myhttpd.te выше.Это позволит вам не разрешать всем процессам httpd доступ к pty, только указанному вами.После этого вы, вероятно, сделаете следующее:

allow httpd_myscript_script_t ptmx_t:chr_file rw_chr_file_perms;

добавьте в конец myhttpd.te (или как хотите, чтобы вызывать модуль), перекомпилируйте и загрузите (см. Выше make и semodule).

1 голос
/ 05 августа 2011

Я считаю, что это проблема SELinux, проверьте ваш журнал на наличие ошибок selinux и измените свою политику соответствующим образом.

0 голосов
/ 21 января 2016

Это решит вашу проблему:

cat > mypol.te<<EOF
module mypol 1.0;
require {
        type httpd_sys_script_t;
        type ptmx_t;
        type httpd_t;
        class chr_file { read write ioctl open };
}

#============= httpd_t ==============
allow httpd_t ptmx_t:chr_file open;
allow httpd_sys_script_t ptmx_t:chr_file { read write };
#!!!! This avc is allowed in the current policy
allow httpd_t ptmx_t:chr_file { read write ioctl };
EOF
checkmodule -M -m -o mypol.mod mypol.te
semodule_package -o mypol.pp -m mypol.mod
semodule -i mypol.pp

setsebool -P daemons_use_tty 1

grep httpd /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp
...