Как автоматически защитить сервер передачи файлов с сервера на сервер с помощью scp-скрипта

#bash #file-transfer #scp #unattended-processing

#bash #передача файлов #scp #автоматическая обработка

Вопрос:

Если у вас есть простой ответ на этот вопрос, избавьте себя от необходимости читать следующее, я заинтересован в решении моего требования.

Целью является безопасное перенаправление (наконец, конкретных) загрузок с сервера на другой ServerB автоматически. На клиенте есть форма загрузки ( <form class="dropzone" enctype="multipart/form-data" action="upload.php" method="POST"> …), которая вызывается upload.php на сервере. Загрузка на сервер работает нормально. На сервере есть скрипт, который должен передавать загруженный файл на ServerB, запускаемый upload.php (без моего входа в систему как пользователя на сервере!).

Здесь я излагаю, что я сделал, если вы считаете, что это может быть практичным путем (где я не нашел конца)…

upload.php:

 <?php
$uploaddir = './uploads/';
$uploadfile = $uploaddir . basename($_FILES['file']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
        echo "File is valid, and was successfully uploaded to A.n";
        echo "Now: call of scp-up.sh $uploadfile :nn";
        echo (shell_exec("./scp-up.sh $uploadfile"));
} else {
        echo "Upload to server A failedn";
}
echo "Debug info of upload.php:n";
print_r($_FILES);
echo '</pre>';
?>
  

Это работает нормально, и файлы должным образом хранятся в директории загрузки сервера.
Теперь вызывается скрипт scp-up.sh для передачи на ServerB:

scp-up.sh:

 #!/bin/bash
echo "scp $1"
scp -v -B -i ./.ssh/id_rsa -o IdentitiesOnly=yes -o KexAlgorithms=ecdh-sha2-nistp256 $1 ssh-userb@serverb.kasserver.com:/www/htdocs/web/uploads/ 2>amp;1
  

Когда я вхожу в систему и использую этот скрипт с именем файла, он работает.
Но не тогда, когда это оставлено в покое.

Сначала я попробовал без параметров -o, что привело к «Сбою проверки ключа хоста» в раннем состоянии, и id_rsa-cert.pub отсутствовал. Итак, я сгенерировал новую пару ключей ssh-keygen -f ca_key и создал этот сертификат с помощью ssh-keygen -s ca_key -I server-b -h -n serverb.kasserver.com ./id_rsa.pub .

Теперь у меня есть эти файлы

 -rwx------ 1 ssh-usera usera 1679 Aug 16 18:23 ca_key
-rwx------ 1 ssh-usera usera  402 Aug 16 18:23 ca_key.pub
-rwx------ 1 ssh-usera usera 1679 Aug 16 17:45 id_rsa
-rwx------ 1 ssh-usera usera 1375 Aug 16 18:35 id_rsa-cert.pub
-rwx------ 1 ssh-usera usera  402 Aug 16 18:03 id_rsa.pub
-rwx------ 1 ssh-usera usera  444 Aug 16 17:45 known_hosts
  

как вы можете видеть: все chmodded как 700.

Результат: сертификат больше не отсутствует, «Ошибка проверки ключа хоста» теперь находится в состоянии задержки.

Вот результат:

 File is valid, and was successfully uploaded to A.
Now: call of scp-up.sh ./uploads/ACT_0180.jpg :

scp ./uploads/ACT_0180.jpg
Executing: program /usr/bin/ssh host serverb.kasserver.com, user ssh-userb, command scp -v -t /www/htdocs/userb/web/uploads/
OpenSSH_7.2p2 Ubuntu-4ubuntu2.10, OpenSSL 1.0.2g  1 Mar 2016
debug1: Connecting to serverb.kasserver.com [85.13.888.999] port 22.
debug1: Connection established.
debug1: identity file ./.ssh/id_rsa type 1
debug1: identity file ./.ssh/id_rsa-cert type 5
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
debug1: match: OpenSSH_7.2p2 Ubuntu-4ubuntu2.10 pat OpenSSH* compat 0x04000000
debug1: Authenticating to serverb.kasserver.com:22 as 'ssh-userb'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: ecdh-sha2-nistp256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC:  compression: none
debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC:  compression: none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:DXdT/AyN2 QYF2P7/ZFP9P4JsHlGrCCTBOx1zmDaSy8
Host key verification failed.
lost connection

Debug info of upload.php:
Array
(
    [file] => Array
        (
            [name] => ACT_0180.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpanRmnx
            [error] => 0
            [size] => 621562
        )

)
  

Для сравнения: вот результат успешно выполненного скрипта, когда я вошел в систему:
https://pastebin.com/raw/p5JAT9FC

(Я попытался использовать -o KexAlgorithms=ecdsa-sha2-nistp256 в scp-команде, но это сразу не удается.)

Ясно сказано, я не совсем понял концепцию сертификата, поэтому некоторые ее части могут отсутствовать. В этом отношении я прошу о помощи, только если этот путь (scp с ключами и сертификатом) является правильным. Если вы знаете более простой подход к достижению цели, мне скорее интересно узнать об этом!

Есть идеи?

Поскольку существует МНОЖЕСТВО возможностей для непрофессионалов, я был бы очень признателен ответчикам, которые полагаются на знания и / или опыт, а не на предположения…

Заранее большое вам спасибо!

Комментарии:

1. Похоже, вам нужен полный / абсолютный путь к файлу ключа вместо этого ./.ssh/id_rsa

2. Похоже, что в вашем успешном примере вы запустили команду от имени root. Как насчет неудачного случая? От имени какого пользователя выполняется команда?

3. @Ivan: Я впервые попробовал использовать абсолютные пути, но скрипт — при вызове веб-запроса — похоже, не имел доступа к этому файлу. sth. ответом вроде бы было «такого файла нет».

4. @Kenster: это на обычном веб-хостинге all-inkl, у меня там нет root-доступа. И кто пользователь скрипта? Я не знаю..