SshキーでログインできるサーバーAがあり、「Sudo su-otheruser」を実行できる場合、環境変数が削除されるため、キーの転送が失われますandソケットは元のユーザーのみが読み取ることができます。 「Sudo su-otheruser」を介してキー転送をブリッジする方法はありますか?転送されたキー(私の場合はgit cloneとrsync)をサーバーBで実行できますか?
私が考えることができる唯一の方法は、otheruserおよび "ssh otheruser @ localhost"のauthorized_keysにキーを追加することですが、これは、ユーザーとサーバーのすべての組み合わせに対して行うのが面倒です。
要するに:
$ Sudo -HE ssh user@Host
(success)
$ Sudo -HE -u otheruser ssh user@Host
Permission denied (publickey).
あなたが言及したように、環境変数はセキュリティ上の理由から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
Sudo -E -s
これにより、元のキーがまだロードされたルートシェルが提供されます。
otheruserが$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以外のユーザーでも機能します;-)
これも機能することがわかりました。
Sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"
他の人が指摘したように、切り替え先のユーザーに$ SSH_AUTH_SOCK(root以外のほとんどのユーザー)に対する読み取り権限がない場合、これは機能しません。 $ SSH_AUTH_SOCKとそのディレクトリに777のアクセス許可を設定することで、これを回避できます。
chmod 777 -R `dirname $SSH_AUTH_SOCK`
Sudo su otheruser -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"
これはかなり危険です。基本的に、システム上の他のすべてのユーザーに(ログアウトするまで)SSHエージェントを使用する許可を与えます。また、グループを設定して、アクセス許可を770に変更することもできます。これにより、セキュリティを強化できます。ところが、グループを変更しようとすると、「操作が許可されていません」というメッセージが表示されました。
Sudo su - $USER
の使用が許可されている場合は、$ USERのホームディレクトリにある有効な公開鍵を使用して、代わりにssh -AY $USER@localhost
を実行することを許可されていることについて、適切な議論があるはずです。次に、認証転送が実行されます。
Sudoを使用する代わりに、エージェント転送で常にlocalhostにSSHで接続できます。
ssh -A otheruser@localhost
欠点は、再度ログインする必要があることですが、画面/ tmuxタブで使用している場合は、1回限りの作業ですが、サーバーから切断すると、ソケットは(もちろん)再び壊れます。 。そのため、常にscreen/tmuxセッションを開いたままにしておくことができないのは理想的ではありません(ただし、クールであれば、SSH_AUTH_SOCK
環境変数を手動で更新することもできます)。
また、ssh転送を使用する場合、rootは常にソケットにアクセスし、ssh認証を使用できます(ssh転送でログインしている場合)。ルートを信頼できることを確認してください。
私がこれを思いついた他の回答からの情報を組み合わせる:
user=app
setfacl -m $user:x $(dirname "$SSH_AUTH_SOCK")
setfacl -m $user:rwx "$SSH_AUTH_SOCK"
Sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" -u $user -i
sudoers
ファイルを編集する必要がないため、これが好きです。
Ubuntu 14.04でテスト済み(acl
パッケージをインストールする必要がありました)。
Sudo su - USER
ではなくSudo -i -u USER
を使用してください。私のために働く!
コマンドのsu
の後の-
(ダッシュ)オプションに問題があると思います:
Sudo su - otheruser
s のmanページを読むと、オプション-, -l, --login
がシェル環境をログインシェルとして起動することがわかるでしょう。これは、otheruser
を実行する環境変数に関係なく、su
の環境になります。
簡単に言うと、ダッシュはSudo
から渡されたものを弱体化します。
代わりに、次のコマンドを試してください。
Sudo -E su otheruser
@ joao-costaが指摘したように、-E
はSudo
を実行した環境のすべての変数を保持します。次に、ダッシュなしで、su
はその環境を直接使用します。
残念ながら、別のユーザーにsu(またはSudoを使用)すると、転送されたキーを使用できなくなります。これはセキュリティ機能です。ランダムなユーザーがssh-agentに接続してキーを使用することは望ましくありません:)
"ssh -Ay $ {USER} @localhost"メソッドは少し面倒です(そして、破損しやすいDavidの回答に関する私のコメントで述べたように)、それはおそらくあなたができる最善の方法です。