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

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

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

ssh-keygen
ssh-copy-id peter@192.168.1.6

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

Я попробовал описанную процедуру Вот. Я тогда сделал

su
su www-data

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

Я попытался

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
www-data@192.168.1.6's password: 

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

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

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

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

    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, что может быть безопаснее.

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

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

# /usr/sbin/sshd -ddep 2222

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

$ scp -o port=2222 ...

... и посмотрите, что говорит сервер.

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