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

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

Главный и подчиненный серверы на Ubuntu 14.04.4

mkdir ~/.ssh
chmod 0700 ~/.ssh
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]
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?

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

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

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

0

Другие решения

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


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

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

Домашняя папка www-data — это / var / www / (в моем случае Ubuntu 14)

mkdir /var/www/.ssh
chown www-data /var/www/.ssh
chmod 0700 /var/www/.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

По вопросам рекламы [email protected]