2016-04-26 2 views
0

Мне нужно синхронизировать ресурсы с главного сервера на подчиненный сервер. Я использую rsync, потому что он может рекурсивно синхронизировать папку, используя инкрементный список файлов. Мне удалось упростить работу с помощью ssh-ключей. Все в порядке, но это не работает через php shell_exec функция. Вот что я сделал до сих пор и где я застреваю. Помощь будет оценена!Безопасный способ синхронизации ресурсов между серверами через php/linux

ведущего и ведомого серверов на Ubuntu 14.04.4

Создание папки SSH-ключ в домашнем каталоге пользователя.

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/ 

YAY, все работает отлично.

Я вхожу на подчиненный сервер, удаляю папку www/js рекурсивно.

Я вхожу на главном сервере

Я создаю простой PHP скрипт, чтобы проверить, если он работает в качестве «команды оболочки»

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 создает или обновляет ресурсы ressources, а затем синхронизирует их на подчиненных серверах, а php должен продолжать работать. Поэтому синхронизация должна быть запущена с php. – Simmoniz

ответ

0

** Изменить: этот ответ не является безопасным. Пожалуйста, смотрите мой другой ответ **


я, наконец, узнал, как заставить его работать

скопировать частный SSH-ключ к домашней папке WWW-данных. Тогда PHP будет иметь возможность Rsync через shell_exec функции

домашняя папка WWW-данных является/вар/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/'); 

Если это поможет кому-то ...

Но так как я много знаю в безопасности, но не могу сказать, что я специалист, интересно, безопасно ли это?

+0

Нет. Это не безопасно. Вы должны сводить к минимуму содержание, на которое может писать uid веб-сервера.Хотя это само по себе не является уязвимостью, оно обеспечивает возможность для кого-то захватить оба сервера, если они могут найти щель в другом месте. Самое простое решение (при условии, что у вас есть root-доступ) - это настроить SSH-доступ для другого пользователя и вызывать его через sudo (если требуется) из PHP. Но это также означает, что вам нужна модель разрешений, если у вас ее еще нет. – symcbean

+0

В моем случае, бэкэнд на самом деле все sercure, работает в течение длительного времени, и был хорошо протестирован. Правильная аутентификация и авторизация выполняются до того, как php создает/updates/rsync ressources. Но, как вы сказали, если php вызывает его через другого пользователя, цыпленок можно найти в любом случае .... – Simmoniz

+0

Это очень наивный взгляд на компьютерную безопасность. – symcbean

0

Как было предложено symcbean, мой предыдущий ответ был опасным для безопасности. Создание www-данных, способных обращаться к удаленным хостам без пароля, может быть действительно опасным. Лучший подход - настроить пользователя linux, скажем, «wwwsync», который будет обрабатывать rsync с удаленными узлами и позволить www-data выполнять rsync «под пользователем wwwsync». Таким образом, мы можем контролировать/защищать rsync, настраивая, что пользователь wwwsync может и не может сделать.

Создание пользователя 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 

Копия открытого ключа на подчиненный сервер (где я хочу синхронизировать Ressources)

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

Сделать пользователь WWW-данные (PHP) в состоянии выполнить Rsync под пользователем wwwsync

// 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-данные не будут синхронизировать нежелательные ресурсы с удаленными серверами.