Я хочу, чтобы резервный хост мог получать резервные копии с удаленного хоста.
Резервный хост использует аутентификацию по ключу ssh для аутентификации в качестве ограниченного пользователя на удаленном хосте, этот пользователь ограничен rsync
команда с помощью authorized_key
файл.
/etc/sudoers
позволяет пользователю выполнять rsync от имени суперпользователя.
Хост резервного копирования должен логически иметь возможность читать файлы / копировать файлы с удаленного хоста, но не записывать файлы / копировать файлы на удаленный хост, поскольку он может легко поставить под угрозу удаленный хост, перезаписав /etc/passwd
или просто подделать файлы, если они были скомпрометированы.
Как я могу этого добиться? Я уже читал о rrsync
, но не видел опции, позволяющей это сделать.
В -ro
флаг rrsync
гарантирует, что rsync вызывается с --sender
вариант, который, согласно rrsync
документацию, убедитесь, что файлы можно только читать - однако я не смог найти авторитетный источник (также известный как документация rsync), который это подтверждает. В моих тестах этого было достаточно для предотвращения записи на сервер.
Посмотри на authprogs - Я использовал его для очень похожего сценария (backuppc через ssh)
Это похоже на некромантинг, но все же я первым нашел этот вопрос и считаю, что он неполный, потому что он полагается на внешние программы.
Таким образом, в режиме pull на стороне получателя режим только для чтения предполагает доверие. В качестве метода резервного копирования вышеуказанные команды могут работать хорошо, если только правильно настроенный клиент запрашивает данные. Если вы хотите ограничить использование rsync поверх ssh, можно выполнить одну удаленную настройку ro
на стороне клиента может быть недостаточно.
Если у вас есть доступ к серверу, данные извлекаются через SSH, необходимо выполнить некоторую простую дополнительную настройку, чтобы ограничить действия пользователя, вошедшего в систему. SSH, используемый с открытым и закрытым ключами, предлагает этот дополнительный способ гарантировать, что клиент может вызвать определенный command
только.
Вот как это делается. На сервере, откуда берутся данные, есть ~/.ssh/known_hosts
файл в user
домашний каталог. Файл содержит одну строку для каждого хоста, для которого известен ключ pubkey, например
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host
Добавьте к этому префиксу command
ты хочешь позволить
command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host
иметь это так, чтобы user@host
может только выполнить /bin/myscript.sh
на удаленном.
Связанный вопрос с хорошими ответами: на сайте SO.
[Раскрытие: я написал sshdo, описанный ниже]
Как упоминалось выше, rrsync можно использовать для управления тем, что rsync может делать по ssh, но, как и в большинстве случаев использования принудительных команд ssh, он ограничен одной командой rsync для каждого авторизованного ключа.
Другой способ управлять тем, что rsync может делать по ssh, - использовать общий белый список команд для ssh.
Для этого есть программа sshdo. Он контролирует, какие команды могут быть выполнены через входящие ssh-соединения. Его можно скачать по адресу:
http://raf.org/sshdo/ (read manual pages here)
https://github.com/raforg/sshdo/
В нем есть режим обучения, позволяющий выполнять все попытки выполнения команд, и параметр --learn для создания конфигурации, необходимой для постоянного разрешения изученных команд. После этого режим обучения можно выключить, и никакие другие команды выполняться не будут.
У него также есть опция --unlearn, чтобы запретить выполнение команд, которые больше не используются, чтобы поддерживать минимальные привилегии, поскольку требования меняются с течением времени.
Он очень требователен к тому, что позволяет. Это не позволит использовать команду с любыми аргументами. Могут быть разрешены только полные команды оболочки.
Но он поддерживает простые шаблоны для представления похожих команд, которые различаются только цифрами, которые появляются в командной строке (например, порядковые номера или отметки даты / времени).
Это похоже на брандмауэр или белый список для команд ssh.