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


153

私は私のsshキーを使ってログインすることができますその中に、サーバAを持っていると私が「sudoの秀- otheruser」能力を持っている場合は、ENV変数が削除されているので、私は、キーの転送を失うソケットは、私の元のユーザーによってのみ読み取り可能です。「sudo su-otheruser」を介してキー転送をブリッジできる方法はありますか。そのため、転送されたキー(私の場合はgit cloneとrsync)を使用してサーバーBで処理を行うことができますか?

私が考えることができる唯一の方法は、他のユーザーと「ssh otheruser @ localhost」のauthorized_keysにキーを追加することですが、それは私が持つすべてのユーザーとサーバーの組み合わせに対して行うのは面倒です。

要するに:

$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey). 

回答:


182

前述のように、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@serverAありuser2@serverBserverA/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

1
これは正解です。マークする必要があります。
Xealot

41
これだけあれば作品、user2上記ですroot!そうでuser2ない場合、SSH_AUTH_SOCKが正しくセットアップされますが、user2/ tmp / ssh-GjglIJ9337 /などにアクセスできません。rootそのアクセス権はありません。だから、これは問題の一部を解決するためではなく、オプス可能性があります「ソケットは、私の元のユーザーによってのみ読み取り可能である」
ピーターV.Mørch

6
Defaults>root env_keep+=SSH_AUTH_SOCKルートにsudo するときにのみ転送することを確認する必要があります。セキュリティ上の理由から、とにかく他のユーザーにそれをしたくありません。他のssh-agentを個別に実行し、適切なキーを追加してください。
ポールスカスカ14

1
sudo su -私にとってはうまくいきません。おそらくsudoシェル起動時ではないので、環境を保存することはできません。sudo su動作するようです。
アレックスフォーチュナ

3
sudo suとにかく人々が使用する理由を理解したことがない。ルートシェルが必要なsudo -s場合sudo -iは、それが目的です。
eaj

68
sudo -E -s
  • -Eは環境を保存します
  • -sはコマンドを実行します。デフォルトはシェルです

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


2
上記のコメントと同様に、これはルートになっている場合にのみ質問に対処します。その場合、ルートは$ SSH_AUTH_SOCKの通常のアクセス許可を回避できるからです。
-doshea

35

他のユーザーが$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ユーザーでも動作します;-)


6
この方法を使用する場合、ログインしている他のotheruserユーザーもssh認証を使用できます。
-gitaarik

これは、 "sudo su-otheruser"を "sudo su otheruser"に変更する必要があった(-を削除する)以外は、私にとってはうまくいきます。
チャールズフィンケル14年

1
なぜそうrwxでないかrw(またはまったくないr)?
アナトリーテクトニク14年

3
@anatolytechtonik From man 7 unix-Linuxでソケットに接続するには、そのソケットに対する読み取りおよび書き込み権限が必要です。また、ソケットを作成するディレクトリの検索(実行)および書き込み権限、またはこのソケットに接続するときの検索(実行)権限のみが必要です。したがって、上記の答えでは、ソケットの実行許可は冗長です。
ミクセル

代わりに使用できるの/ etc / sudoersファイルを編集したのsudo -u otheruser --preserve-env=HOME -s

14

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

sudo su -l -c "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK; bash"

他の人が指摘したように、切り替え先のユーザーが$ SSH_AUTH_SOCK(これはルート以外のほとんどのユーザー)に対する読み取り権限を持っていない場合、これは機能しません。これを回避するには、$ 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に変更することもできますが、これはより安全です。ただし、グループを変更しようとすると、「操作は許可されていません」と表示されました。


6
これは非常に危険です。他のすべてのユーザーにSSHエージェントを使用する許可を与えることは、すべての資格情報をユーザーに与えることと同等です(sudoまたはsuを使用する場合は、システム上の他のすべてのユーザー、およびsshする他のすべてのシステムに対するルート権限を付与します!) 。これは絶対に行わないでください!
マティヤナリス14年

4
「これは絶対にしないでください!」という声明には同意しません。このリスクが許容される多くの場合があります。たとえば、全員が同じ権限を持ち、他のすべてのユーザーを信頼する小さなチーム。関与するリスクを理解せずに実行しないでください。しかし、これらのリスクが理解されると、リスクが許容される場合があります。
phylae 14年

6

あなたがに許可されている場合sudo su - $USER、あなたはおそらく行うことが許可されているために良い引数だろうssh -AY $USER@localhost$ユーザーのホーム・ディレクトリにあなたの有効な公開鍵を使用して、代わりに。その後、認証の転送が行われます。


彼は質問の一番下でそれを言及し、それをするのは難しいだろうと言った。
ファハドサダ

これはおそらく最良の解決策ですが、$ USERがReal Person(tm)の場合、毛むくじゃらになります
。authorized_keys

authorized_keysへの書き込みアクセスを削除できます(Florianアクセスを拒否するように設定されている場合は、所有しているディレクトリにあるため、削除および再作成できます)
Fahad Sadah

4

sudoを使用する代わりに、常にエージェント転送を使用してlocalhostにsshすることができます。

ssh -A otheruser@localhost

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

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


あなただけへのアクセス権を持っている場合、これは動作しませんotheruser経由sudoの代わりに、SSHを介して(例えば、あなたがSCPのものにしたいなどwww-data
ゲルトファンデンベルク

3

使用しないsudo su - USERで、むしろsudo -i -u USER。私のために働く!


sudoのバージョンはありますか?私(1.6.7p5、CentOS 4.8)のマニュアルページには-iがありません。
デビッドマッキントッシュ

Sudo version 1.6.9p17Debian Lennyで実行しています。試しsudo -sますか?
ファハドサダ

6
私にはうまくいきません。

Ubuntuでは、須藤1.8.9p5、どちらを使ってsudo -sもすることはsudo -i...私のために働く
ジョン・L.

2

他の回答からの情報を組み合わせて、私はこれを思いつきました:

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


1

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

sudo su - otheruser

suのマニュアルページを読むと、このオプション-, -l, --loginがシェル環境をログインシェルとして起動することがあります。これは、otheruser実行するenv変数に関係なく環境になりますsu

簡単に言えば、ダッシュはあなたから渡されたものをすべて損なうでしょうsudo

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

sudo -E su otheruser

@ joao-costaが指摘したように、-E実行した環境のすべての変数が保存されますsudo。その後、ダッシュなしで、suその環境を直接使用します。


0

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

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


1
うーん、しかし、sshでこれを行うと、とにかくそのユーザーはエージェントにアクセスできますか、それとも間違っていますか?

エージェントを転送するターゲットユーザーにSSHで接続すると、エージェントリクエストは「実際の」エージェントがある場所にチェーンをバウンスします。元のユーザーからsuまたはsudoを離れると、SSHエージェントソケットにアクセスできません(またはアクセスできないはずです)-存在するディレクトリはモード700で、元のユーザーが所有しています。(明らかな警告:ルートに切り替えてSSH_AUTH_SOCK環境をリセットする場合、動作する可能性がありますが、私はそれに依存しません)
-voretaq7

1
私のサーバー(Ubuntu 12.04、sshバージョンOpenSSH_5.9p1 Debian-5ubuntu1.1、OpenSSL 1.0.1 2012年3月14日)では、sshには引数が-aあり-Aます。-a意図したものとは正反対になり、エージェント転送を無効にします!そのため、Ubuntuの最近の(そしておそらくすべての)バージョンで、-Aエージェント転送を有効にするために使用します。
knite

@kniteあなたは正しいです-それは私の答えの(3歳!)タイプミスです。今すぐ修正:-)
voretaq7
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.