web-dev-qa-db-ja.com

ssh-agent転送と別のユーザーへのSudo

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). 
158
Florian Schulze

あなたが言及したように、環境変数はセキュリティ上の理由から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_keysuser1@serverAuser2@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
186
MiniQuark
Sudo -E -s
  • -Eは環境を保護します
  • -sコマンドを実行します。デフォルトはシェルです。

これにより、元のキーがまだロードされたルートシェルが提供されます。

71
Joao Costa

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以外のユーザーでも機能します;-)

38
Viliam Pucik

これも機能することがわかりました。

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に変更することもできます。これにより、セキュリティを強化できます。ところが、グループを変更しようとすると、「操作が許可されていません」というメッセージが表示されました。

14
phylae

Sudo su - $USERの使用が許可されている場合は、$ USERのホームディレクトリにある有効な公開鍵を使用して、代わりにssh -AY $USER@localhostを実行することを許可されていることについて、適切な議論があるはずです。次に、認証転送が実行されます。

6

Sudoを使用する代わりに、エージェント転送で常にlocalhostにSSHで接続できます。

ssh -A otheruser@localhost

欠点は、再度ログインする必要があることですが、画面/ tmuxタブで使用している場合は、1回限りの作業ですが、サーバーから切断すると、ソケットは(もちろん)再び壊れます。 。そのため、常にscreen/tmuxセッションを開いたままにしておくことができないのは理想的ではありません(ただし、クールであれば、SSH_AUTH_SOCK環境変数を手動で更新することもできます)。

また、ssh転送を使用する場合、rootは常にソケットにアクセスし、ssh認証を使用できます(ssh転送でログインしている場合)。ルートを信頼できることを確認してください。

5
gitaarik

私がこれを思いついた他の回答からの情報を組み合わせる:

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パッケージをインストールする必要がありました)。

3
warvariuc

Sudo su - USERではなくSudo -i -u USERを使用してください。私のために働く!

3
Fahad Sadah

コマンドのsuの後の-(ダッシュ)オプションに問題があると思います:

Sudo su - otheruser

s のmanページを読むと、オプション-, -l, --loginがシェル環境をログインシェルとして起動することがわかるでしょう。これは、otheruserを実行する環境変数に関係なく、suの環境になります。

簡単に言うと、ダッシュはSudoから渡されたものを弱体化します。

代わりに、次のコマンドを試してください。

Sudo -E su otheruser

@ joao-costaが指摘したように、-ESudoを実行した環境のすべての変数を保持します。次に、ダッシュなしで、suはその環境を直接使用します。

1
Koala Yeung

残念ながら、別のユーザーにsu(またはSudoを使用)すると、転送されたキーを使用できなくなります。これはセキュリティ機能です。ランダムなユーザーがssh-agentに接続してキーを使用することは望ましくありません:)

"ssh -Ay $ {USER} @localhost"メソッドは少し面倒です(そして、破損しやすいDavidの回答に関する私のコメントで述べたように)、それはおそらくあなたができる最善の方法です。

0
voretaq7