Назад | Перейти на главную страницу

Невозможно запустить удаленный сценарий из сценария Perl CGI

Я создал программу с использованием Perl CGI, в которой я вызываю свой серверный скрипт, находящийся в удаленном месте. Для этого я использовал OpenSSH. Но когда я запускаю этот скрипт со своего терминала, он работает нормально, мой скрипт на удаленной машине также работает правильно. Но когда я делаю это из браузера, это не работает. Я использовал нижеприведенный сценарий.

#!/usr/bin/perl
use warnings;
use strict;
use CGI;
use Net::OpenSSH;
use warnings;
our $cgi = new CGI;

use Net::OpenSSH;
my %opts = (
    user        => "UNAME",
    #password    => "MYPASSWORD", 
    strict_mode => 0,         
);
my $ssh = Net::OpenSSH->new("MY SERVER_IP",%opts,master_opts => [-i => "MY KEY FILE"], async => 1);
$ssh->system("/root/test.sh") or    
    die "remote command failed: " . $ssh->error;

Ниже приведены журналы журналов ошибок apache.

[Пт 27 июня, 12:11:57 2014] [ошибка] [client localhost] В разрешении отказано (publickey, gssapi-keyex, gssapi-with-mic). \ R, referer: http: //X.X.X.X/cgi-bin1/test.cgi

CGI-скрипты обычно запускаются от имени того же пользователя, под которым запущен веб-сервер - часто от имени пользователя. wwwdata, или www. Поскольку ваш ключевой файл ограничен вашим собственным именем пользователя, huzefa, веб-сервер не может получить к нему доступ.

Если бы вы разрешили пользователю веб-сервера использовать ваш собственный ключ ssh, то кто-то, обнаруживший дыру в безопасности на вашем веб-сервере, мог бы использовать ваш ключ, а затем войти на любой сервер, к которому у вас есть доступ с этим ключом. Вы, наверное, этого не хотите.

Есть несколько способов обойти это, не открывая огромной дыры в безопасности. Самый простой - просто настроить отдельный ключ ssh для этого конкретного использования:

  1. Создайте новый ключ ssh и поместите его в каталог, доступный пользователю веб-сервера.
  2. Скопируйте публичную часть ключа в authorized_keys файл на сервере.
  3. Отредактируйте файл authorized_keys так, чтобы открытый ключ, используемый веб-сервером, можно было использовать только для запуска этого сценария. Для дополнительной безопасности ограничьте его, разрешив соединения только с IP-адреса вашего сервера. Это должно выглядеть примерно так:
from="10.1.2.3",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/root/test.sh" ssh-dss AA.....

Процесс веб-сервера принадлежит apache пользователь не как root.

  1. Удостоверься что apache у пользователя есть пароль меньше доступа к другому серверу

  2. SELinux должен быть отключен

Обратитесь: http://wccandlinux.blogspot.in/2016/07/how-to-run-ssh-command-from-apache.html