需要 scp 和 www-data,无需密码

需要 scp 和 www-data,无需密码

我有一个 DMZ,其中有一个运行 Ubuntu 11.04 的 Web 服务器和一个运行 Ubuntu 11.10 的应用程序服务器。我已经进行了设置,以便可以通过运行以下命令从 Web 服务器 scp 到应用程序服务器

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

其中 192.168.1.6 是应用程序的本地 IP 地址。服务器和 peter 是我的登录帐户名。但是,我想使用 PHP 文件中的命令来复制文件以响应通过基于 LAMP 的网站发出的调用。我的问题是,我的 Web 应用程序的“用户”是 www-data,它不是真正的用户,因此我无法为其创建密钥。

我尝试了概述的程序这里.然后我就这么做了

su
su www-data

在 Web 服务器上(我猜是伯克利讨论中的“服务器”)。不幸的是,当我尝试 scp 到应用程序服务器/客户端时,仍然会要求输入密码。

我试过

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

输出与我(成功)从 peter 帐户 scp 时的输出非常相似。但是,最后几行有所不同。

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 ...

...看看服务器说什么。

对于 John 的安全担忧:如果您决定继续使用 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 相同的服务,但您的密钥可以用强制命令标记,这可能更安全。

答案3

我使用 inotify 来实现 John Gardeniers 建议的方法。这很简单,现在运行良好。我刚刚编写了一个 C++ 应用程序,当目录中的文件被修改时,它会执行 scp,就像 PHP 代码中所做的那样。运行良好。

谢谢,
彼得

相关内容