通过php / linux同步服务器之间的资源的安全方式

我需要同步从主服务器到从服务器的资源。 我使用rsync,因为它可以使用增量文件列表recursion地同步文件夹。 我已经能够使用ssh-keys以最简单的方式工作。 一切都很好,但它不能通过PHP shell_exec函数工作。 这是我迄今为止所做的,以及我陷入困境的地方。 帮助将不胜感激!

主从服务器在Ubuntu 14.04.4上

在用户主目录内创buildssh-key文件夹。

mkdir ~/.ssh chmod 0700 ~/.ssh 

创build一个没有密码的私人/公共ssh密钥

 ssh-keygen -f ~/.ssh/id_rsa -q -P "" 

不确定的从服务器可以接收主公共ssh密钥

 // log in slave server mkdir ~/.ssh chmod 0700 ~/.ssh touch ~/.ssh/authorized_keys chmod 0644 ~/.ssh/authorized_keys 

将公钥复制到从属服务器(我要同步资源的位置)

 // log in master server su ssh-copy-id -i ~/.ssh/id_rsa.pub [slave user]@[slave host] 

testing现有文件夹的同步…让我们说www / js /

 rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/ 

耶,一切正常。

我login从服务器,recursion地删除www / js文件夹。

我login主服务器

我创build一个简单的PHP脚本来testing它是否作为一个“shell命令”

test.php的

 var_dump(shell_exec('rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/')); 

同步不能从PHP工作。 可能是因为php运行宽度www-data用户? 我怎样才能使它从pĥp安全地工作?

正如symcbean所建议的,我之前的回答是安全风险。 使万维网数据能够访问远程主机没有密码可能是非常危险的 。 更好的方法是建立一个linux用户,让“wwwsync”来处理远程主机的rsync,让www-data在“wwwsync user”下执行rsync。 这样,我们可以通过设置wwwsync用户可以和不可以做的事来控制/保护rsync。

创建一个处理同步的Linux用户(让我们说wwwsync),并在用户的主目录下创建ssh-key文件夹。

 // log as root user adduser wwwsync // log as wwwsync su wwwsync // create ssh folder for ssh key creation mkdir ~/.ssh chmod 0700 ~/.ssh 

创建一个没有密码的私人/公共ssh密钥

 ssh-keygen -f ~/.ssh/id_rsa -q -P "" 

不确定的从服务器可以接收主公共ssh密钥

 // log in slave server mkdir ~/.ssh chmod 0700 ~/.ssh touch ~/.ssh/authorized_keys chmod 0644 ~/.ssh/authorized_keys 

将公钥复制到从属服务器(我要同步资源的位置)

 // log in master server as wwwsync su ssh-copy-id -i ~/.ssh/id_rsa.pub [slave user]@[slave host] 

使万维网数据用户(PHP)能够在wwwsync用户下执行rsync

 // log in as root su root // edit sudo configuration sudo visudo // add this line at the bottom of the file www-data ALL=(wwwsync) NOPASSWD: /usr/bin/rsync 

这一行然后将正常工作从PHP

 shell_exec('rsync -H -u wwwsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/') 

下一个重要步骤 :确保wwwsync根据您的需要正确设置权限和权限,因此www-data不会将不需要的资源同步到您的远程服务器。

**编辑:这个答案是不安全的。 请看我的其他答案**


我终于找到了如何使它工作

将私人ssh-key复制到www-data的home文件夹。 然后php将能够通过shell_exec函数rsync

www-data的home文件夹是/ var / www /(在我的情况下是Ubuntu 14)

如果不存在,创建.ssh文件夹

 mkdir /var/www/.ssh chown www-data /var/www/.ssh chmod 0700 /var/www/.ssh 

复制ssh密钥并设置适当的权限

 cp ~/.ssh/id_rsa /var/www/.ssh chown www-data /var/www/.ssh/id_rsa chmod 0600 /var/www/.ssh/id_rsa 

这条线现在适用于我:

 shell_exec('rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress [absolute_path]/www/js/ [slave user]@[slave host]:~/www/js/'); 

如果它帮助某人

但是既然我对安全有了很多的了解,但是不能说我是专家,我不知道这是否安全?