読者です 読者をやめる 読者になる 読者になる

SSHのエージェントフォワーディングを「sudo」の後でも引き継ぐ

SSHのエージェントフォワーディングは「sudo」したときは無効になります。

※ hoge へのログインにエージェントフォワーディングは使用されない
sudo ssh hoge

↑のような使い方だと意味はありませんが、例えば rsync を over ssh で使っている場合はエージェントフォワーディングが切れると困ることもあります。

※ /path/ に書き込むには root が必要なので sudo した例
※ rsync から呼ばれる ssh で認証エージェントが使われないため remotehost にログイン出来ない
sudo rsync -av remotehost:/path/ /path/

エージェントフォワーディングは、sshログイン後に「/tmp/ssh-xxx/agent.12345」のような名前のソケットファイルを作成し、そのソケットファイルを介してローカル側の認証エージェント(ssh-agent や pageant)と対話することで実現されています。

そのソケットファイルのパスは環境変数 SSH_AUTH_SOCK に記録されており ssh コマンドが勝手に探して使います。

sudo をすると一部を除いて環境変数がクリアされます(sudoers によるけど)。そのため SSH_AUTH_SOCK もクリアされ、対話用のソケットファイルが見つからなくなるため、エージェントフォワーディングが効かなくなります。


visudo で「env_keep」に「SSH_AUTH_SOCK」を追加すれば、sudo しても「SSH_AUTH_SOCK」がそのまま維持されるため、エージェントフォワーディングを有効なままにすることが出来ます。

Defaults env_keep += "SSH_AUTH_SOCK"

もしくは・・・

sudo SSH_AUTH_SOCK=$SSH_AUTH_SOCK rsync -av remotehost:/path/ /path/

とかでも大丈夫です(変数の置換は sudo の前に行われるから)。


ということは・・・



1つのホストに複数人がログインしているとき、そのホストで root になれるなら「/tmp/ssh-*/agent.*」のソケットファイルを環境変数 SSH_AUTH_SOCK に設定して他人の認証エージェントを乗っ取ることが出来ます・・・