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에서 흥미로운 점을 발견하면 세 번째 호스트를 추가해도 여전히 작동합니다.

[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_config루트 로그인을 허용하도록 설정해야 합니다.

인용하다

답변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문제가 해결됩니다.

관련 정보