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

时间:2016-04-26 16:27:03

标签: php linux synchronization rsync

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

主服务器和从服务器在ubuntu 14.04.4上

在用户主目录中创建ssh-key文件夹。

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
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安全地使用它?

2 个答案:

答案 0 :(得分:0)

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

我终于找到了如何让它发挥作用

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

www-data的主文件夹是/ 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/');

如果有人帮助......

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

答案 1 :(得分:0)

正如symcbean所建议的,我之前的回答是安全风险。 使www-data能够访问没有密码的远程主机可能非常危险。更好的方法是设置一个linux用户,让我们说“wwwsync”,它将处理与远程主机的rsync,并让www-data在“wwwsync用户”下执行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]

让www-data用户(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不会将不需要的资源同步到您的远程服务器。