Безопасный способ синхронизации ресурсов между серверами через php / linux

Мне нужно синхронизировать ресурсы с главного сервера на подчиненный сервер. Я использую rsync, потому что он может рекурсивно синхронизировать папку, используя добавочный список файлов. Я смог заставить его работать самым простым способом, используя ssh-ключи. Все хорошо, но это не работает через функцию 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, чтобы проверить, работает ли он как "команда оболочки"

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-данных пользователя? Как я могу заставить его работать безопасно из pĥp?

2 ответа

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


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

скопируйте личный ssh-ключ в домашнюю папку www-data. Тогда php сможет rsync через функцию shell_exec

Домашняя папка 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/');

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

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

Как предположил 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

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

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

Сделать пользователя www-data (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 правильно настроил права и разрешения в соответствии с вашими потребностями, чтобы www-данные не синхронизировали нежелательные ресурсы с вашими удаленными серверами.

Другие вопросы по тегам