설정

설정

다른 문제에 대한 시스템 로그를 확인하는 동안 실시간으로 많은 SSH 시도가 발생하고 있음을 발견했습니다. 특히 궁금한 점이 있습니다.하루 10,000회 시도!

$ grep Disconnected /var/log/auth.log | wc -l #since March 6
46149

나는 NAT 뒤에 있고 일반적으로 로그인 시도가 0번이기 때문에 이것은 나에게 놀라운 일이었습니다. 로그에서 무슨 일이 일어나고 있는지에 대한 명확한 힌트를 얻었습니다. 로그인 시도는 모두 localhost!

Mar 10 11:27:38 devbox sshd[11409]: Disconnected from invalid user mn 127.0.0.1 port 45822 [preauth]
Mar 10 11:27:46 devbox sshd[11426]: Disconnected from authenticating user root 127.0.0.1 port 45824 [preauth]

내가 생각할 수 있는 유일한 것은 이러한 연결이 집에서 내 회사 컴퓨터에 로그인할 수 있도록 점프 호스트를 위해 설정한 역방향 SSH 터널에서 시작된다는 것입니다. 사실 sudo systemctl stop reverse-tunnel모든 활동을 할 때는 즉시 멈춰주세요! 그래서 내 설정에 뭔가 수상한 점이 있습니다. 지금까지 나는 내 설정에서 클라이언트가 연결 시작을 허용하기 위해 해당 호스트에 유효한 인증서를 사용하여 점프 호스트에 로그인할 수 있어야 한다고 가정했지만 이는 분명히 잘못된 것입니다!

설정

고객.ssh/config

Host jump
    HostName jumphost.somedomain.com
    User ubuntu
    IdentityFile ~/.ssh/jump

# local -> jump -> jump:30001 --> work
# reverse tunnel: work -> jump:22 sets up jump:30001 -> work
Host work
    ProxyJump jump
    User my-user
    IdentityFile ~/.ssh/work
    HostName jumphost.somedomain.com
    Port 30001

위의 내용은 "클라이언트" 비트만 다루고 로컬 컴퓨터에 연결 방법을 알려주기 때문에 좋아 보입니다.

역방향 터널 서비스

이것은 항상 실행되도록 설정된 시스템 서비스이며 실제로 점프 호스트에서 내 작업 컴퓨터로의 인바운드 연결을 허용합니다. 이것이 주요 용의자입니다.

# The SSH tunnel is configured mostly through options specified in the default ssh config file (such as private key)
# It needs to be copied to /etc/systemd/system/ to be picked up and then run
#    sudo systemctl daemon-reload
#    sudo systemctl enable tunnel
#    sudo systemctl start tunnel
# Original implementation: https://askubuntu.com/a/1316825/165026

[Unit]
Description=Maintain Reverse SSH Tunnel
After=network.target

[Service]
User=my-user
ExecStart=/usr/bin/autossh  -o ServerAliveInterval=30 -o "ServerAliveCountMax 3" -M 44444 -o ExitOnForwardFailure=yes -gnNT -R 30001:localhost:22 jump
RestartSec=15
Restart=always
KillMode=mixed

[Install]
WantedBy=multi-user.target

나는 이것이 범인이라고 생각합니다.-R 30001:localhost:22 jump

답변1

이게 서버 구성이야, 바보야

분명히 포트 30001은 공용 네트워크 인터페이스에서 대중에게 완전히 공개된 것으로 보입니다. 이를 확인하기 위해 를 사용하여 로그인을 시도했는데 ssh -p 30001 clearly-wrong@jump실제로 쉽게 접근할 수 있는 다음과 같은 사용자 이름이 로그에 나타납니다.

Mar 10 14:35:46 ACME sshd[22697]: Failed password for invalid user pt from 127.0.0.1 port 45854 ssh2
Mar 10 14:36:08 ACME sshd[22705]: Failed password for invalid user cluster from 127.0.0.1 port 45856 ssh2
Mar 10 14:36:37 ACME sshd[22736]: Failed password for invalid user clearly-wrong from 127.0.0.1 port 45858 ssh2

더 쉬운 방법은 netcat을 사용하는 것입니다.

$ nc jumphost.somedomain.com 30001
SSH-2.0-OpenSSH_8.4p1 Ubuntu-6ubuntu2.1

이는 문제가 더 쉽다는 것을 나타냅니다.

따라서 이 포트를 대중에게 성공적으로 닫으면 보안 구멍이 닫힌 것입니다.netstat어떤 포트에서 수신 대기하는지 알아 보겠습니다 .

$ sudo netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1984729/sshd: /usr/ 
tcp        0      0 0.0.0.0:30001           0.0.0.0:*               LISTEN      2950075/sshd: ubunt 

따라서 분명히 모든 인터페이스에서 수신 대기하고 있습니다.

이제 내 작업 컴퓨터에서 실행되는 이 코드를 살펴보겠습니다 -R 30001:localhost:22 jump. 이는 "로컬 호스트의 포트 30001에서 포트 22로 역방향 터널을 엽니다"라고 말합니다. 여기서 누락된 것으로 보이는 것은 포트 30001에서 수신 대기해야 하는 IP를 지정하는 것입니다. 누락된 경우 다음을 의미할 수 있습니다.모든 인터페이스. localhost거기에도 제한 하자 ! 그래서 나는 연결을 사용합니다

ssh -nNT -R 127.0.0.1:30001:localhost:22 jump

이런 식으로 처리해야 할까요?

$ sudo netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1984729/sshd: /usr/ 
tcp        0      0 0.0.0.0:30001           0.0.0.0:*               LISTEN      2950287/sshd: ubunt 

아니, 아무것도 안 하는 것으로 밝혀졌나요? 알았어, 그러니까더 읽어보세요sshd구성에 GatewayPorts뭔가 관련이 있는 것으로 밝혀졌습니다 (분명히 제가 이 작업을 오래 전에 수행했다는 사실을 잊어버렸습니다). 그래서 주석 처리를 시도한 다음 ssh 구성을 다시 로드해 보았습니다. 짜잔:

$ sudo service ssh reload
$ sudo netstat -tapn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1984729/sshd: /usr/ 
tcp        0      0 127.0.0.1:30001         0.0.0.0:*               LISTEN      2950497/sshd: ubunt 

실제로 이것은 문제를 해결했습니다.

$ nc -v jumphost.somedomain.com 30001
nc: connect to jumphost.somedomain.com (191.212.201.145) port 30001 (tcp) failed: Connection refused

ProxyJumpSSH 별명이 작동하기 위해 지금 해야 할 유일한 조정은 work공개 호스트 이름을 .HostNamelocalhost

문제: 다른 서비스에 대해 GatewayPort를 활성화해야 합니다...

이렇게 하면 SSH에 쉽게 연결할 수 있지만 때로는 점프 호스트의 작업 컴퓨터에서 실행되는 포트를 노출해야 할 때도 있습니다. 일반적으로 직장 컴퓨터에서 일부 PHP 서버가 실행되고 있고 집에서 디버깅해야 하는 경우입니다. 활성화와 비활성화 사이에 중간 옵션이 있는 것으로 나타났습니다. clientspecified! 당신은 읽을 수있다더 많은 정보를 원하시면 여기를 클릭하세요.

관련 정보