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