Нужен scp с www-data без необходимости ввода пароля

Нужен scp с www-data без необходимости ввода пароля

У меня есть DMZ с веб-сервером под управлением Ubuntu 11.04 и сервером приложений под управлением Ubuntu 11.10. Я настроил все так, что могу scp с веб-сервера на сервер приложений, запустив

ssh-keygen
ssh-copy-id [email protected]

где 192.168.1.6 — локальный IP-адрес сервера приложений, а peter — имя моей учетной записи. Однако я хотел бы скопировать файлы в ответ на вызов через веб-сайт на базе LAMP с помощью команды в файле PHP. Моя проблема в том, что «пользователь» моих веб-приложений — www-data, который не является реальным пользователем, поэтому я не могу создать для него ключи.

Я попробовал описанную процедуру.здесь. Затем я сделал

su
su www-data

на веб-сервере (я предполагаю, что "сервер" согласно обсуждению в Беркли). К сожалению, меня все еще просят ввести пароль, когда я пытаюсь выполнить scp для сервера/клиента приложений.

Я пытался

scp -vv /var/www/Src/*.txt 192.168.1.6:/var/www/Dest

Вывод был почти таким же, как когда я (успешно) scp из аккаунта peter. Однако эти последние несколько строк отличаются.

debug1: Authentications that can continue: publickey,password
debug1: Offering DSA public key: /var/www/.ssh/id_dsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug1: Offering ECDSA public key: /var/www/.ssh/id_ecdsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug2: we did not send a packet, disable method
debug1: Next authentication method: password
[email protected]'s password: 

Я был бы очень признателен, если бы кто-нибудь мог мне сказать или помочь найти, в чем проблема.

решение1

Прочитав ссылку, которую вы дали: убедитесь, что вы используете authorized_keys, а не authorized_keys2. Последний уже много лет не поддерживается и вообще не работает в некоторых версиях OpenSSH.

Самый простой способ диагностировать это — отладить экземпляр SSH-сервера. На сервере выполните:

# /usr/sbin/sshd -ddep 2222

... который запускает демон SSH в режиме отладки, прослушивая порт 2222. Повторите команду scp следующим образом:

$ scp -o port=2222 ...

... и посмотрим, что скажет сервер.

Что касается безопасности Джона: если вы решите продолжить использовать учетную запись www-data, вы можете ограничить ее ключ только определенными действиями (например, передачей определенных файлов), используя опцию «принудительной команды» в authorized_keys.

решение2

Вы сказали, что пробовали

    scp -vv /var/www/Src/*.txt 192.168.1.6:/var/www/Dest

Но ключ, который вы хотели бы использовать, нигде не появляется. Попробуйте:

    scp -vvv -i /path/to/private/key /var/www/Src/*.txt 192.168.1.6:/var/www/Dest

В любом случае, вам следует убедиться, что ваше соединение ограничено этой конкретной командой. Я не уверен, что SCP предоставляет способы ограничить команду (например, принудительную команду с SSH). Тогда я бы вместо этого использовал SSH через rsync, чтобы убедиться, что будет запущена только команда rsync. Это предоставляет в основном ту же услугу, что и scp, но ваш ключ затем может быть помечен командой force, что может быть безопаснее.

решение3

Я использовал inotify для реализации метода, предложенного Джоном Гарденьерсом. Это было просто, и теперь работает отлично. Я только что написал приложение C++, которое выполняет scp при изменении файла в каталоге, как это можно сделать из кода PHP. Работает отлично.

Спасибо,
Питер.

Связанный контент