Как следует настроить ForceCommand, чтобы пользователь резервного копирования мог выполнять любую команду rsync? Когда ForceCommand установлен в / usr / bin / rsync, я получаю следующую ошибку: соединение неожиданно закрыто ...
/ etc / ssh / sshd_config на удаленном сервере, на котором размещены файлы для копирования:
Match User backup
PasswordAuthentication no
PubkeyAuthentication yes
AllowTCPForwarding no
X11Forwarding no
ForceCommand /usr/bin/rsync
Команда rsync, запущенная на локальном сервере, выполняет копирование с удаленного сервера:
rsync -avzh --progress backup@hostname.domain:/opt/backups/automatic/cron/mysql/ /tmp/.
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [Receiver=3.0.7]
Если я настрою ForceCommand на точную команду rsync, такую как приведенная ниже, я смогу успешно удаленно выполнить rsync в качестве пользователя резервного копирования, но для этого проекта я не хочу использовать полную точную команду, как показано ниже:
ForceCommand /usr/bin/rsync --server --sender -vlwkDonecf.iLew . /opt/backups/automatic/cron/mysql/
Если я настрою ForceCommand для использования сценария, такого как приведенный ниже, я смогу успешно удаленно выполнить rsync. Мне любопытно, почему это работает, а / usr / bin / rsync - нет?
Match User backup
PasswordAuthentication no
PubkeyAuthentication yes
AllowTCPForwarding no
X11Forwarding no
ForceCommand /home/backup/cron/validate-rsync
Скрипт validate-rsync:
#!/bin/sh
#script to validate rsync
#script source: http://troy.jdmz.net/rsync/#validate-rsync
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\(*)
echo "Rejected"
;;
*\{*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
*\<*)
echo "Rejected"
;;
*\`*)
echo "Rejected"
;;
*\|*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac
Мой главный вопрос: почему не работает ForceCommand / usr / bin / rsync?
Мне также интересно узнать, как лучше всего это сделать. Я не могу удалить пользователя резервной копии, потому что копирую из нескольких разных папок. Я действительно не хочу использовать полную команду rsync --server --client и т.д., потому что я копирую несколько разных папок, и это кажется чрезмерным. Мне любопытно найти самый простой / лучший способ (-а) ограничить пользователя резервного копирования rsync.
В ForceCommand
опция предназначена для использования с командой, которая специально понимает, что действует как Привратник SSH. Исходная команда помещается в SSH_ORIGINAL_COMMAND
переменная окружения.
В Зачем это легко... ForceCommand
делает именно то, что он говорит: вы подключаетесь, он заставляет вас запускать эту команду независимо от того, что вы на самом деле хотели сделать. В этом случае эта команда /usr/bin/rsync
без флагов.
rsync
работает, запустив другую копию rsync
на другой стороне соединения и разговаривает с ним по ssh. В этом случае, однако, он не может запустить другую сторону с необходимыми флагами, потому что команда заменена на /usr/bin/rsync
Ваш сценарий rsync-validate, вероятно, лучший способ решить эту проблему. Он проверяет запрос, чтобы убедиться, что это допустимая команда сервера rsync, и только после этого выполняет ее. rsync
наверное мог можно изменить, чтобы проверять $ SSH_ORIGINAL_COMMAND напрямую, когда он запускается без аргументов, но, вероятно, есть веская причина безопасности не делать этого.