Rsync + защита аутентификации с открытым ключом

Я прочитал несколько статей как в автоматически файлы резервных копий с Rsync и аутентификацией с открытым ключом. Все они очень похожи. Я только что закончил настраивать все, и все хорошо работает, но... Я просто нашел статью, в которой говорится, что это не безопасно. Я сделал следующее:

  1. На сервере резервного копирования я генерировал открытые и закрытые ключи.
  2. Я скопировал открытый ключ в удаленный (исходный) каталог серверов: /var/sites/.ssh (файл authorized_keys). Каталог принадлежит "user12"
  3. Я добавил следующее к authorized_keys файлу: from="BACKUP.SERVERS.IP.ADDRESS",command="/root/validate_rsync"
  4. Я создал файл/root/validate_rsync со следующим содержанием:

    #!/bin/sh
    echo $SSH_ORIGINAL_COMMAND >> /var/log/synchronize-log.log
    case "$SSH_ORIGINAL_COMMAND" in
    *\&*)
    echo "Rejected"
    ;;
    *\;*)
    echo "Rejected"
    ;;
    *\(*)
    echo "Rejected"
    ;;
    *\{*)
    echo "Rejected"
    ;;
    *\<*)
    echo "Rejected"
    ;;
    *\>*)
    echo "Rejected"
    ;;
    *\`*)
    echo "Rejected"
    ;;
    *\|*)
    echo "Rejected"
    ;;
    rsync\ --server*) 
    $SSH_ORIGINAL_COMMAND
    ;;
    *)
    echo "Rejected"
    ;;
    esac
    

Я выполняю команду rsync:

rsync -avzp --del -e "ssh -p 2211" user12@ORIGINAL.SERVERS.IP:/var/sites/photos/ /var/sites/sync/photos

Я получил сообщение об ошибке: проблемы разрешения с файлом /root/validate_rsync. Я переместил файл /root/validate_rsync кому: /var/sites/validate_rsync и chowned это к user12:user12

Теперь работы синхронизации. Но я нашел статью, в которой говорится, что это небезопасно:

1-сама команда validate_rsync не должна принадлежать, ни не записываемая идентификатором пользователя, который выполняет команду rsync. Иначе rsync может использоваться для перезаписи сценария проверки с другим сценарием, который не проверяет или даже выполняет произвольные команды.

2-точно так же файл авторизованных ключей не должен принадлежать или не записываемый rsync пользователем, иначе rsync может использоваться для перезаписи того файла с тем, который удаляет требование для выполнения, проверяют-rsync, или с тем, который выполняет некоторую другую команду вместо этого.

Источник

Что я могу сделать? Если validate_rsync принадлежит корню, синхронизация не запускается потому что user12 не может получить доступ rootфайлы. Если authorized-keys файл будет принадлежать другому пользователю, в которого я не смогу войти с именем пользователя user12.

Мои вопросы:

  1. Куда я должен поместить validate_rsync и файлы авторизованных ключей, в который каталог? Какие полномочия и владения они должны иметь?

  2. Есть ли некоторый путь, как сказать validate_rsync файл, чтобы позволить синхронизировать только 2 папки: /var/sites/photos/, /var/sites/photos2/

6
задан 17 September 2014 в 11:41
2 ответа

Эти соображения безопасности верны. Итак, чтобы ответить на ваш первый вопрос: чтобы он работал так, как вам нравится,вы должны поместить validate_rsync в каталог, где user12 имеет разрешение на выполнение, но не на запись. Тот же самый файл validate_rsync должен иметь права на чтение и выполнение для пользователя, но, конечно, не на запись. Проблема здесь в том, что / root по умолчанию доступен только пользователю root , вам нужен путь, по которому каждый каталог имеет разрешение на выполнение для user12 . Например, вы можете скопировать validate_rsync в / usr / local / bin и сделать его владельцем root . Пока user12 может выполнять и читать, все в порядке.

Вам не нужно защищать свой файл authorized_keys . Было бы лучше заставить user12 запустить команду с помощью конфигурации, вставив в sshd_config следующее:

Match user user12
  ForceCommand /usr/local/bin/validate_rsync

Я думаю, что это решение лучше, чем возиться с authorized_keys.

Также , в вашем validate_rsync я бы процитировал $ SSH_ORIGINAL_COMMAND (безопаснее), и я бы изменил ваше предложение case , чтобы проверить правильность команды для регулярного выражения, используя grep ; проще, компактнее и мощнее:

echo "$SSH_ORIGINAL_COMMAND" >> /var/log/synchronize-log.log
if echo "$SSH_ORIGINAL_COMMAND" | grep -qE '[&;<>`|]'; then
  echo Rejected
elif [[ "${SSH_ORIGINAL_COMMAND:0:14}" == "rsync --server" ]]; then
  $SSH_ORIGINAL_COMMAND
else
  echo Rejected
fi

Чтобы ответить на ваш второй вопрос, когда вы регистрируете SSH_ORIGINAL_COMMAND, вы можете запустить тест с каталогами, которые хотите рассмотреть, а затем изучить SSH_ORIGINAL_COMMAND, который вы получаете. Затем вы можете заставить validate_rsync проверять только эту команду.

3
ответ дан 3 December 2019 в 00:35

Для защиты файла authorized_keys я наткнулся на это решение: https://superuser.com/questions/852434/how-to-protect-authorized-keys-file

Довольно часто просто удаляется доступ к этому файлу, если ты не планируешь часто его менять.

chmod 400 ~/.ssh/authorized_keys

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

sudo chattr +i ~/.ssh/authorized_keys
sudo chattr +i ~/.ssh
1
ответ дан 3 December 2019 в 00:35

Теги

Похожие вопросы