
Если у меня есть сервер A, на который я могу войти с помощью своего ключа SSH, и у меня есть возможность выполнить команду «sudo su - otheruser», я потеряю пересылку ключей, поскольку переменные env будут удалены.исокет доступен для чтения только моему исходному пользователю. Есть ли способ объединить пересылку ключей через "sudo su - otheruser", чтобы я мог что-то делать на сервере B с моим пересланным ключом (git clone и rsync в моем случае)?
Единственный способ, который приходит мне в голову, — это добавить свой ключ в authorized_keys другого пользователя и «ssh otheruser@localhost», но это обременительно для каждой комбинации пользователя и сервера, которые у меня могут быть.
Суммируя:
$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey).
решение1
Как вы упомянули, переменные среды удаляются из sudo
соображений безопасности.
Но, к счастью, sudo
его можно легко настроить: вы можете точно указать, какие переменные среды вы хотите сохранить, благодаря env_keep
параметру конфигурации в /etc/sudoers
.
Для переадресации агента вам нужно сохранить SSH_AUTH_SOCK
переменную окружения. Для этого просто отредактируйте /etc/sudoers
файл конфигурации (всегда используя visudo
) и установите env_keep
опцию для соответствующих пользователей. Если вы хотите, чтобы эта опция была установлена для всех пользователей, используйте строку Defaults
следующим образом:
Defaults env_keep+=SSH_AUTH_SOCK
man sudoers
Больше подробностей.
Теперь вы сможете сделать что-то вроде этого (при условии, что user1
открытый ключ присутствует в ~/.ssh/authorized_keys
и user1@serverA
, user2@serverB
а serverA
файл /etc/sudoers
настроен так, как указано выше):
user1@mymachine> eval `ssh-agent` # starts ssh-agent
user1@mymachine> ssh-add # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2 # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB # goto user2@serverB w/o typing pwd again...
user2@serverB> # ...because forwarding still works
решение2
sudo -E -s
- -E сохранит окружающую среду
- -s запускает команду, по умолчанию — оболочку
Это даст вам root-оболочку с загруженными исходными ключами.
решение3
Позволятьдругойпользовательдля доступа к $SSH_AUTH_SOCK
файлу и его каталогу, например, с помощью правильного ACL, перед переключением на них.
В примере предполагается, Defaults:user env_keep += SSH_AUTH_SOCK
что на /etc/sudoers
хост-машине:
$ ssh -A user@host
user@host$ setfacl -m otheruser:x $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$
Более безопасно и работает даже для пользователей без прав root
решение4
Вы всегда можете просто подключиться по ssh к localhost с переадресацией агента вместо использования sudo:
ssh -A otheruser@localhost
Недостаток в том, что вам нужно снова войти в систему, но если вы используете его на вкладке screen/tmux, это всего лишь разовая попытка, однако, если вы отключитесь от сервера, сокет (конечно) снова будет сломан. Так что это не идеальный вариант, если вы не можете держать сеанс screen/tmux открытым все время (однако вы можете вручную обновить переменную env, SSH_AUTH_SOCK
если вы крутой).
Также обратите внимание, что при использовании ssh-переадресации root всегда может получить доступ к вашему сокету и использовать вашу ssh-аутентификацию (при условии, что вы вошли в систему с ssh-переадресацией). Поэтому убедитесь, что вы можете доверять root.