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

标签 php linux synchronization rsync

我需要将资源从主服务器同步到从服务器。我使用 rsync 是因为它可以使用增量文件列表递归同步文件夹。我已经能够使用 ssh-keys 以最简单的方式使其工作。一切正常,但它无法通过 php shell_exec 函数运行。这是我到目前为止所做的,以及我被困的地方。帮助将不胜感激!

主从服务器都在ubuntu 14.04.4

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

mkdir ~/.ssh
chmod 0700 ~/.ssh

创建一个没有密码的私有(private)/公共(public) ssh key

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

不确定从服务器是否可以接收主公钥

// 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 命令”运行

测试.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 所建议的,我之前的回答是存在安全风险。 让 www-data 能够在没有密码的情况下访问远程主机可能真的很危险。更好的方法是设置一个 linux 用户,比如说“wwwsync”,它将处理与远程主机的 rsync,并让 www-data 在“wwwsync 用户”下执行 rsync。这样,我们可以通过设置 wwwsync 用户可以做什么和不能做什么来控制/保护 rsync。

创建一个将处理同步(比如 wwwsync)的 linux 用户,并在用户的主目录中创建 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

创建没有密码的私有(private)/公共(public) ssh key

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

不确定从属服务器是否可以接收主公用 ssh key

// 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 就不会将不需要的资源同步到您的远程服务器。

关于php - 通过 php/linux 在服务器之间同步资源的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36870627/

相关文章:

php - 嵌套 PHP 函数 : to what purpose?

linux - 如何在 Linux 终端中每 2 小时删除一次日志

java - 我可以用纯 Java 实现 park/unpark 方法吗?

javascript - Highcharts 同步图表与其他图表结合

java - 同步块(synchronized block)和 while 循环优化排序

php - 我对使用 PHP 代码创建的 HTML 有疑问

php - MySQL 分页(如果按喜欢排序)

php - 如果相同 id 项目超过 1 个,如何从 mysql 获取 1 个项目

android - 在 Linux Android 中获取一个文件的文件能力

linux - 我的内核模块如何在不使用 pci_get_device() 的情况下访问 PCI 设备?