Rsync + открытый ключ аутентификации безопасности
Я прочитал несколько статей о том, как автоматически создавать резервные копии файлов с помощью аутентификации Rsync и открытого ключа. Все они очень похожи. Я только что закончил настройку, и все работает нормально, но... Я только что нашел статью, в которой говорится, что это небезопасно. Я сделал следующее:
- На резервном сервере я сгенерировал открытый и закрытый ключи.
- Я скопировал открытый ключ в каталог удаленных (оригинальных) серверов:
/var/sites/.ssh
(файлauthorized_keys
). Каталог принадлежит"user12"
- Я добавил следующее в файл author_keys:
from="BACKUP.SERVERS.IP.ADDRESS",command="/root/validate_rsync"
Я создал файл /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" [email protected]:/var/sites/photos/ /var/sites/sync/photos
Я получил сообщение об ошибке: проблемы с разрешением файла /root/validate_rsync
, Я переместил файл /root/validate_rsync
в /var/sites/validate_rsync
и поразил его user12:user12
Теперь синхронизация работает. Но я нашел статью, в которой говорится, что это небезопасно:
1 - сама команда validate_rsync не должна принадлежать или записываться пользователем, использующим команду rsync. В противном случае rsync можно использовать для перезаписи сценария проверки другим сценарием, который не проверяет, или даже для выполнения произвольных команд.
2 - аналогично, файл с авторизованными ключами не должен принадлежать или записываться пользователем rsync, в противном случае rsync может быть использован для перезаписи этого файла, с одним, который снимает требование запустить validate-rsync, или с другим, который запускает какую-то другую команду. вместо.
Что я могу сделать? Если validate_rsync
принадлежит root, синхронизация не начинается, потому что user12
не может получить доступ root
файлы. Если authorized-keys
файл будет принадлежать другому пользователю, я не смогу войти с именем пользователя user12
,
Мои вопросы:
Где я должен поместить файлы validate_rsync и authorized keys, в какой каталог? Какие разрешения и права владения они должны иметь?
Есть ли способ, как сказать
validate_rsync
файл, позволяющий синхронизировать только 2 папки:/var/sites/photos/
,/var/sites/photos2/
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
Я думаю, что это решение лучше, чем возиться с авторизованными ключами.
Кроме того, в вашем 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
проверить только эту команду.
Чтобы защитить 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