2016-04-26 91 views
0

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

主从服务器上的Ubuntu用户的主目录中14.04.4

创作中的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 

复制公钥到从服务器的私人/公共SSH密钥的

mkdir ~/.ssh 
chmod 0700 ~/.ssh 

创建(其中我想同步资源)

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

现有文件夹的测试同步...让我们说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/ 

耶,一切工作正常。

我登录从服务器,递归地删除www/js文件夹。

我登录主服务器上

我创建了一个简单的PHP脚本来测试它是否内为“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安全地工作?

+0

您可以使用rsync,也可以将主目录存储在通用文件夹中,并将它们安装到每台服务器上。 – mkaatman

+1

您的主变量'〜'可能无法正确扩展。尝试完整路径 –

+0

在我的情况下,从服务器就像内容交付。安装一个通用文件夹可以,但在我的情况下,php创建或更新资源,然后必须在从属服务器上同步它们,并且php必须继续运行。因此,必须从php中启动同步。 – Simmoniz

回答

0

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


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

复制私有SSH密钥到www数据的主文件夹。那么PHP将可以通过了shell_exec功能

www数据的主文件夹是/ var/WWW /(在我的情况的Ubuntu 14)

创建与rsync。如果不存在

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

复制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/'); 

如果帮助别人......

但是由于我在安全方面知道很多,但不能说我是专家,我不知道这是否安全?

+0

不,这不安全。您应该尽量减少web服务器uid可以写入的内容。尽管这本身并不是一个漏洞,但它为其他人提供了一种手段让别人接管你的两台服务器。最简单的解决方案(假设您拥有root用户访问权限)是为其他用户设置SSH访问权限,并通过PHP从sudo(如果需要)调用它。但是这也意味着如果你还没有权限模型,你需要一个权限模型。 – symcbean

+0

在我的情况下,后端实际上都是sercure,运行很长时间,并且已经过很好的测试。在php创建/更新/ rsync资源之前执行正确的认证和授权。但正如你所说,如果PHP通过其他用户调用它,小鸡可以找到无论如何...... – Simmoniz

+0

这是一个非常天真的计算机安全观点。 – symcbean

0

正如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-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 

复制公钥的私有/公共SSH密钥的到从属服务器(我想要同步的地方) ressources)

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

制作www数据用户(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拥有正确的权限t,根据您的需要,所以www-data不会将不需要的资源同步到您的远程服务器。

相关问题