저자는 자유 및 오픈 소스 기금을 기부를 위한 쓰기 프로그램의 일환으로 기부 대상으로 선택했습니다.
소개
인증 로그를 살펴보면 다양한 IP 주소에서 여러 번의 로그인 실패 시도가 있는 것을 볼 수 있습니다. 이러한 로그인 실패 시도는 대부분의 경우 기본 자격 증명을 사용하는 취약한 서버를 찾기 위해 전체 웹을 스캔하는 봇넷의 노드에서 옵니다. 대부분의 사람들은 자신의 서버로의 로그인을 방지하는 안전한 암호나 SSH 키를 가지고 있겠지만, 일부 서버는 이러한 스캔에 취약할 수 있습니다. 이러한 공격을 막을 수는 없지만 타피트를 사용하여 그 속도를 늦출 수 있습니다.
이 튜토리얼에서는 로그인 시도를 하는 사용자에게 무한히 긴 배너를 천천히 전송하는 Endlessh를 설치하고 구성합니다. 또한 SSH 서비스를 다른 포트에서 실행하도록 구성하여 인증 로그를 더욱 읽기 쉽게 만들 것입니다.
이 튜토리얼을 완료한 후에는 비표준 포트에서 서버에 연결할 수 있으며, 서버를 스캔하는 모든 봇들은 열리지 않는 문에 노크하는 시간을 허비하게 될 것입니다.
필수 조건
이 튜토리얼을 완료하려면 다음이 필요합니다:
- sudo 비루트 사용자가 있는 Ubuntu 서버, 방화벽 및 적어도 1GB의 RAM이 필요합니다. 이를 설정하는 방법은 Ubuntu 22.04의 초기 서버 설정을 따르면 됩니다.
- 서버에 설치된 Git으로, 이는 Git 설치 튜토리얼을 완료하여 설정할 수 있습니다.
단계 1 – SSH를 비표준 포트로 이동
이 단계에서는 Endlessh를 위한 포트를 확보하기 위해 SSH를 비표준 포트로 이동합니다. 봇넷은 무한한 리소스를 가지고 있지 않기 때문에 일반적으로 기본 SSH 포트(22
)만을 스캔합니다. SSH를 비표준 포트로 이동하면 봇을 Endlessh 트랩핏에 갇힐 수 있습니다.
시작하기 위해 서버에서 SSH 구성 파일을 다음 명령어로 백업합니다:
이 파일은 무언가 작동하지 않거나 SSH를 기본 포트로 다시 이동하기로 결정한 경우 원래 설정을 복원하는 데 사용될 수 있습니다.
/etc/ssh/sshd_config 파일을 nano 또는 좋아하는 텍스트 편집기를 사용하여 엽니다:
라인 #Port 22
을 찾습니다. 이 줄의 주석을 제거하여 해제한 다음, 서버에서 사용하지 않는 포트로 포트를 변경합니다:
...
Port 2222
...
보통 사용되지 않는 포트의 예는 2222
입니다. 반복적인 SSH 연결에 사용할 포트를 선택할 수 있습니다. 파일을 저장하고 닫습니다.
서버가 ufw
와 같은 방화벽을 사용하고 있다면, 새로운 포트로의 트래픽을 허용해야 합니다:
다음으로 SSH 서비스를 다시 시작합니다:
다른 터미널 세션에서 새로운 포트를 사용하여 서버에 연결을 시도합니다:
경고:새로운 포트를 통해 SSH에 연결할 수 있는지 확인하기 전에 활성 SSH 세션을 닫지 마십시오. 새로운 포트를 통해 연결할 수 없는 경우 세션을 닫음으로써 서버 액세스를 잃을 수 있습니다. 다른 터미널 세션에서 서버에 연결할 수 없는 경우 다음 명령을 실행하여 원래의 SSH 설정을 복원할 수 있습니다:
추가 문제가 발생하는 경우 sshd
가 성공적으로 다시 시작되었는지 확인하고 포트 2222
가 tcp 트래픽을 수락하도록 방화벽 설정을 검토합니다.
2222
포트로의 새로운 연결을 확인한 후에 원래의 터미널을 안전하게 닫을 수 있습니다. 미래에 서버에 연결할 때는 항상 새로운 포트를 지정해야 합니다. 다음과 같이:
이제 SSH를 비표준 포트로 성공적으로 이동했으므로 Endlessh를 설정할 시간입니다.
단계 2 – Endlessh 설치
Endlessh에는 공식 패키지가 없으므로 저장소를 복제하여 수동으로 빌드합니다. 저장소를 복제하려면 Git을 사용하고 프로젝트를 컴파일하기 위해 build-essential
패키지(프로젝트를 컴파일하기 위한)와 libc6-dev
패키지를 사용합니다.
apt 패키지 관리자를 사용하여 필요한 패키지를 설치합니다:
프롬프트에서 설치를 확인하려면 y
를 입력합니다.
그런 다음 GitHub에서 Endlessh 저장소를 홈 디렉토리에 복제합니다:
프로젝트 디렉토리로 이동하여 make
명령을 사용하여 Endlessh를 컴파일합니다:
다음 명령을 사용하여 Endlessh를 시작할 수 있습니다:
Endlessh가 작동하는지 테스트하려면 새 터미널 창에서 -v
verbose 플래그와 함께 포트 22
로 SSH 연결을 시도하여 끝없는 배너가 전송되는지 확인할 수 있습니다. 새 터미널 창에서 다음 명령 중 하나를 사용하여 포트 22
로 SSH 연결을 만듭니다:
새 SSH 세션이 포트 22
에 연결을 시도하면 세션이 닫힐 때까지 연결 터미널에 10초마다 무작위 문자열이 표시됩니다. 다음과 같은 출력을 확인할 수 있습니다:
Outputdebug1: kex_exchange_identification: banner line 0: NvnHF>]&W4p+tg*"+
debug1: kex_exchange_identification: banner line 1: n<
debug1: kex_exchange_identification: banner line 2: @/O5c0/;>1b{qd(M,vK
debug1: kex_exchange_identification: banner line 3: i+ OZ
debug1: kex_exchange_identification: banner line 4: yn
debug1: kex_exchange_identification: banner line 5: T[V\\[HUg
새 세션으로 연결하여 작동하는지 확인한 후, 원래 터미널 세션에서 Ctrl+C
를 사용하여 새 터미널을 닫고 Endlessh를 중지할 수 있습니다.
이 단계에서는 소스에서 Endlessh를 다운로드하고 빌드했습니다. 다음으로, 이를 구성하고 서비스로 배포하여 로그아웃하고 서버를 다시 시작할 때 지속되도록 할 것입니다.
단계 3 – Endlessh 구성
이 단계에서는 세션이 종료되고 시스템을 다시 시작한 후에도 지속되는 서비스로 Endlessh를 설정합니다.
컴파일된 이진 파일을 /usr/local/bin
디렉토리로 이동하십시오:
암호를 입력하십시오(필요한 경우).
프로젝트에서 서비스 파일을 /etc/systemd/system
디렉토리로 복사하십시오:
Endlessh를 1024
미만 포트에서 실행하도록 서비스 파일을 약간 수정할 것입니다. nano 또는 좋아하는 텍스트 편집기에서 서비스 파일을 엽니다:
1024
미만 포트에서 Endlessh를 실행하는 섹션을 찾습니다.
파일을 업데이트하여 AmbientCapabilities=CAP_NET_BIND_SERVICE
줄의 시작 부분에 있는 #
를 제거하고, 줄 PrivateUsers=true
의 시작 부분에 #
를 추가하십시오. 다음과 같이:
...
## Endlessh를 포트 < 1024에 바인딩하려면
## 1) 실행:
## setcap 'cap_net_bind_service=+ep' /usr/local/bin/endlessh
## 2) 다음 줄의 주석 처리를 제거합니다
AmbientCapabilities=CAP_NET_BIND_SERVICE
## 3) 다음 줄의 주석 처리를 추가합니다
#PrivateUsers=true
...
파일을 저장하고 종료합니다.
다음으로, Endlessh를 1024
보다 낮은 포트에서 실행할 수 있도록 허용할 것입니다. 이를 인터넷 도메인 우선 포트라고도 합니다. setcap
명령을 사용하여 Endlessh 이진 파일에 이 기능을 설정하세요:
Endlessh에게 어떤 포트를 사용할 지 알려주기 위해 구성 파일을 정의해야 합니다. /etc/endlessh/config
라는 구성 파일을 생성하고 엽니다:
구성 파일에서 사용할 포트를 22
로 정의하세요:
Port 22
파일을 저장하고 닫으세요.
이제 Endlessh 서비스를 영구적으로 시작할 수 있습니다:
--now enable
을 포함하면 서비스가 서버를 다시 시작한 후에도 유지됩니다.
서비스가 성공적으로 시작되었는지 확인하려면 systemctl status
명령을 사용할 수 있습니다:
성공적으로 시작된 경우 다음과 같은 출력이 표시됩니다:
Output● endlessh.service - Endlessh SSH Tarpit
Loaded: loaded (/etc/systemd/system/endlessh.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-22 11:20:39 UTC; 1 months 11 days ago
Docs: man:endlessh(1)
Main PID: 34007 (endlessh)
Tasks: 1 (limit: 1081)
Memory: 380.0K
CGroup: /system.slice/endlessh.service
└─34007 /usr/local/bin/endlessh
실행 중이라면, 새로운 터미널 세션에서 포트 22
에 연결을 시도할 수 있습니다:
타피트가 실행 중이므로, 새로운 터미널 세션은 연결할 수 없으며 연결하는 터미널에서 Ctrl+C
로 수동으로 중지할 때까지 영원히 실행됩니다.
서비스를 중지하려면 다음 명령을 사용할 수 있습니다:
서비스를 중지한 후에는 Step 1 경고의 SSH 복원 지침을 사용하여 원래의 서버 구성을 복원할 수 있습니다. 서비스를 다시 활성화하려면 sudo systemctl --now enable endlessh
를 사용하면 됩니다. 그러나 이때 포트 22
에서 SSH가 실행되지 않도록 주의하세요.
결론
Endlessh를 성공적으로 설치하고 구성하여 인증 로그를 정리하고 무작위 SSH 봇의 시간을 낭비하기 위해 준비되었습니다.
Endlessh 타피트를 설정한 후 다른 서버 보안을 위한 추천 보안 조치를 검토하십시오.
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-endlessh-tarpit-on-ubuntu-22-04