たけまるの日記

たけまるの日記です。web関係の技術ネタが多いですが、好きなことを適当に書いています。

su/sudoした先でエージェントフォワードを使うためのたった1つのこと

例えばServerA、ServerBがあって、自マシン->ServerA->ServerBのようにServerAを踏み台にしてServerBにSSHしたいとする。


エージェントフォワードを使わない場合、ServerAにServerBにログインできる秘密鍵を置かなければならないが、セキュリティ上置きたくない場合もある


エージェントフォワードを使えばServerAに鍵を置く必要はなく、自マシンに鍵を置いておけばよい。


ただしServerAにログインした後、su/sudoコマンドでroot等の他ユーザーになってそこからsshする場合、エージェントフォワードが効かなかったのでちゃんと調べてみた。


suを使うかsudoを使うかで遣り方が違うのでメモ。


前提

エージェントフォワードを有効にしてServerAにログインした場合、以下のような環境変数が設定される。

$ env
-省略-
SSH_AUTH_SOCK=/tmp/ssh-egzmmXXXXX/agent.XXXXX
-省略-

詳しい仕組みは調べていないが、この環境変数がポイントの模様。


suの場合

普段suを使ってrootになる場合、このようにコマンドを打っていた

$ su -

-をつけるとそのユーザーの環境変数が設定しなおされ、SSH_AUTH_SOCKが消されるためエージェントフォワードができない。

ServerA$ su
ServerA# ssh ServerB
ServerB#


sudoの場合

sudoの場合、元の環境から引き継ぐ環境変数がsudoの設定で決まっているが、SSH_AUTH_SOCKは初期設定では引き継がれない。

ServerA$ sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"
ServerA# ssh ServerB
ServerB#


これで解決。


参考

http://serverfault.com/questions/107187/sudo-su-username-while-keeping-ssh-key-forwarding