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/nologin
centos7および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_config
rootログインを許可するように設定する必要があります。
引用する
答え2
ssh_config
for マンページには次のように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
問題が解決します。