Если я правильно понимаю, вы хотите установить SSH-соединение между A и B, скажем, от A до B. Можно установить TCP-соединение от A до B (B не находится за брандмауэром, который делает это невозможным), но вас беспокоит, что разрешить пользователю от A до входа в B может привести к нарушению безопасности на B, если A не заслуживает доверия.
OpenSSH предоставляет простое решение для этого. В ~ / .ssh / authorized_keys
вы можете ограничить действие ключа для выполнения только одной команды. Создайте новую пару ключей на A:
serverA$ ssh-keygen -N '' -f ~/.ssh/copy_to_B.id_rsa
serverA$ cat ~/.ssh/copy_to_B.id_rsa.pub
Возьмите сгенерированный открытый ключ и добавьте принудительную команду в конце строки. Также добавьте параметр restrict
, чтобы предотвратить такие вещи, как переадресация портов (которая может, например, позволить A делать запросы, поступающие изнутри периметра брандмауэра B). Новая строка в ~ / .ssh / authorized_keys
на B будет выглядеть так:
ssh-rsa AAAA… luc@serverA restrict command="cat >~/backups/B/latest.tgz"
Теперь при использовании этого ключа для входа в B команда cat> ~ / backups / B /latest.tgz
будет выполняться независимо от того, что вы передаете в ssh
. Таким образом, все, что B может сделать, это записать в файл
serverA$ tar … | ssh -i ~/.ssh/copy_to_B.id_rsa luc@serverB whatever
. Если SSH-сервер на B недостаточно новый, у него может не быть restrict
. Если у него нет ограничения
, используйте вместо него no-port-forwarding
плюс все остальные доступные параметры no-…
(проверьте ] man sshd
на B).
Вы можете ссылаться на исходную команду в принудительной команде через переменную SSH_ORIGINAL_COMMAND
, но будьте осторожны, если вы сделаете здесь что-то сложное, будет сложно гарантировать, что вы не открываете дыру в безопасности. Вот простая оболочка, которая позволяет B записывать в любой файл в ~ / backups / B
, передавая желаемое имя файла в качестве команды - обратите внимание, что оболочка заносит символы в белый список, чтобы избежать таких вещей, как запись в ../../.ssh/authorized_keys
.
ssh-rsa AAAA… luc@serverA restrict command="case $SSH_ORIGINAL_COMMAND in *[!-.A-Za-z0-9_]*) echo >&2 'bad target file'; exit 120;; [!-.]*) cat >~/backups/B/\"$SSH_ORIGINAL_COMMAND\";; *) echo >&2 'bad target file'; exit 120;; esac"
Если включено распространение монтирования, (см. man mount_namespaces
), будущие вложенные монтирования будут копироваться между монтированиями, если они созданы с помощью монтирования с привязкой.