
다른 문제에 대한 시스템 로그를 확인하는 동안 실시간으로 많은 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
ProxyJump
SSH 별명이 작동하기 위해 지금 해야 할 유일한 조정은 work
공개 호스트 이름을 .HostName
localhost
문제: 다른 서비스에 대해 GatewayPort를 활성화해야 합니다...
이렇게 하면 SSH에 쉽게 연결할 수 있지만 때로는 점프 호스트의 작업 컴퓨터에서 실행되는 포트를 노출해야 할 때도 있습니다. 일반적으로 직장 컴퓨터에서 일부 PHP 서버가 실행되고 있고 집에서 디버깅해야 하는 경우입니다. 활성화와 비활성화 사이에 중간 옵션이 있는 것으로 나타났습니다. clientspecified
! 당신은 읽을 수있다더 많은 정보를 원하시면 여기를 클릭하세요.