SSH ProxyJumpにはローカルシェルアクセスが必要ですか?

SSH ProxyJumpにはローカルシェルアクセスが必要ですか?

localhostにSSHで接続できるアカウントがあります。

$ ssh root@localhost
# logout
Connection to localhost closed.

ただし、sshのJumpProxy機能では機能しません。

$ ssh -J root@localhost root@localhost
/sbin/nologin: invalid option -- 'c'

Usage:
 nologin [options]

Politely refuse a login.

Options:
 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see nologin(8).
ssh_exchange_identification: Connection closed by remote host

これは、現在のユーザーのシェルが/sbin/nologinに設定されていることに関連しているようです。一時的にbashに変更すると、コマンドは機能します。不要なユーザーに対してシェルアクセスを無効にするのがベストプラクティスのようです。しかし、(なぜ?)JumpProxyでこれを要求するのですか?

答え1

OpenSSH 7.4を使用したテストでは、具体的には次のようになります。

$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

ユーザーのシェルをまたはに設定でき、サーバーAを介してサーバーBにログインできました/sbin/nologin/bin/false

はい

$ cat /etc/passwd
user1:x:1001:1001::/home/user1:/sbin/nologin

または

$ cat /etc/passwd
user1:x:1001:1001::/home/user1:/bin/false
ホストA→B

私はサーバーA(centos7)を介してサーバーB(mulder)にログインしようとしています。

[vagrant@centos7 ~]$ ssh -J user1@localhost root@mulder
user1@localhost's password:
Last login: Sat Jul 21 15:59:00 2018 from macbook1
[root@mulder ~]#
ホストA→B→C

VMで興味深い点を見つけた場合、3番目のホストを追加しても機能します。

[vagrant@centos7 ~]$ ssh -J user1@localhost,user1@mulder root@skinner
user1@localhost's password:
user1@mulder's password:
Last login: Sat Jul 21 16:09:48 2018 from 192.168.1.10
[root@skinner ~]# 

メモ:上記のシナリオでは、user1は/sbin/nologincentos7およびmulderサーバーで定義されています。/etc/passwd

問題のデバッグ

それでは-vvvスイッチでデバッグを始めましょうssh

$ ssh -vvv -J user1@localhost,user1@mulder root@skinner
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 58: Applying options for *
debug1: Setting implicit ProxyCommand from ProxyJump: ssh -l user1 -J user1@localhost -vvv -W %h:%p mulder
debug1: Executing proxy command: exec ssh -l user1 -J user1@localhost -vvv -W skinner:22 mulder
...
...
debug1: Setting implicit ProxyCommand from ProxyJump: ssh -l user1 -vvv -W %h:%p localhost
debug1: Executing proxy command: exec ssh -l user1 -vvv -W mulder:22 localhost
...
...
debug2: PTY allocation request accepted on channel 0
debug2: channel 0: rcvd adjust 2097152
debug3: receive packet: type 99
debug2: channel_input_status_confirm: type 99 id 0
debug2: shell request accepted on channel 0
Last login: Sat Jul 21 16:10:28 2018 from 192.168.1.10
[root@skinner ~]#

メモ:上からジャンププロキシサーバーを通過しながら、さまざまなコマンドに展開され、-J実際に後ろから実行されているタスクを見ることができます。ssh

問題をより詳細に分類するには、これらのコマンドを直接実行して実行方法を確認することをお勧めします。

ルート@ローカルホスト→ルート@ローカルホスト

ssh私の実験では、次のように試してみました。

$ ssh -J root@localhost root@localhost
root@localhost's password:
root@localhost's password:
Last login: Sat Jul 21 16:40:54 2018 from localhost
CentOS 7 Build 1805.02
$

これを行うには、/etc/ssh/sshd_configrootログインを許可するように設定する必要があります。

引用する

答え2

ssh_configfor マンページには次のようにProxyCommand記載されています。

コマンド文字列は行末まで拡張され、シェルプロセスの遅延を避けるために、ユーザーのシェル 'exec'コマンドを使用して実行されます。

私はそれを実行しstrace、次を見る:

write(2, "debug1: Executing proxy command:"..., 114debug1: Executing proxy command: exec ssh -l rundeck -v -W '[target]:22' proxy
[pid 30151] execve("/usr/sbin/nologin", ["/usr/sbin/nologin", "-c", "exec ssh -l rundeck -v -W '[172."...], 0x55f477e50ab0 /* 15 vars */ <unfinished ...>

デフォルトでは、SSHは賢明にユーザーのシェルを見つけてから、シェルを使用してエージェントコマンドを実行したいと思います。ただし、シェルが存在しない場合は失敗します。

SHELL実行する前に環境変数を設定するとssh問題が解決します。

関連情報