웹사이트 검색

Linux에서 SSH 서비스를 보호하기 위해 포트 노킹을 사용하는 방법


포트 노킹은 합법적인 사용자만 서버에서 실행되는 서비스에 액세스하도록 허용하여 포트에 대한 액세스를 제어하는 멋진 기술입니다. 이는 올바른 연결 시도가 이루어지면 방화벽이 닫힌 포트를 기꺼이 여는 방식으로 작동합니다.

포트 노킹 뒤에 숨은 논리는 열린 포트를 찾아 헤매는 자동화된 포트 스캐너로부터 Linux 시스템을 보호하는 것입니다. 이 가이드에서는 포트 노킹을 설치하는 방법과 SSH 서비스를 보호하기 위해 이를 구성하는 방법을 살펴봅니다. 데모 목적으로 Ubuntu 18.04를 사용하겠습니다.

1단계: knockd 설치 및 구성

시작하려면 Linux 시스템에 로그인하고 표시된 대로 knockd 데몬을 설치하세요.

sudo apt install knockd

설치가 완료되면 원하는 텍스트 편집기를 사용하여 knockd.conf 구성을 엽니다. 여기서는 vim 명령줄 텍스트 편집기를 사용하고 있습니다.

sudo vim /etc/knockd.conf

기본 구성 파일은 다음과 같습니다.

[openSSH] 섹션에서 기본 노크 순서(7000,8000,9000)를 다른 것으로 변경해야 합니다. 이는 이러한 값이 이미 알려져 있고 시스템 보안을 손상시킬 수 있기 때문입니다.

테스트 목적으로 값을 10005, 10006, 10007로 설정했습니다. 이는 클라이언트 시스템에서 SSH 포트를 여는 데 사용되는 순서입니다.

세 번째 줄 – command로 시작하는 /sbin/iptables 바로 다음에 -A-I로 변경합니다. 명령과 INPUT 앞에 있습니다.

마지막으로 [closeSSH] 섹션에서 기본 순서를 원하는 대로 다시 변경하세요. 이는 사용자가 작업을 마치고 서버에서 로그아웃한 후 SSH 연결을 닫는 데 사용되는 순서입니다.

전체 구성은 다음과 같습니다.

완료되면 변경 사항을 저장하고 종료합니다.

수정해야 할 또 다른 구성은 /etc/default/knockd입니다. 다시 한 번 텍스트 편집기를 사용하여 엽니다.

sudo vim /etc/default/knockd

START_KNOCKD=0 줄을 찾으세요. 주석을 해제하고 값을 1로 설정하세요.

다음으로, KNOCKD_OPTS= ”-i eth1 ” 줄로 가서 주석 처리를 제거하고 기본 eth1 값을 시스템의 활성 네트워크 인터페이스로 바꿉니다. 네트워크 인터페이스를 확인하려면 ip addr 또는 ifconfig 명령을 실행하면 됩니다.

우리 시스템에서는 enp0s3이 활성 네트워크 카드입니다.

전체 구성은 그림과 같습니다.

변경 사항을 저장하고 종료합니다.

그런 다음 그림과 같이 knockd 데몬을 시작하고 활성화합니다.

sudo systemctl start knockd
sudo systemctl enable knockd

knockd 데몬의 상태를 확인하려면 다음 명령을 실행하세요.

sudo systemctl status knockd

2단계: 방화벽에서 SSH 포트 22 닫기

knockd 서비스의 목적은 SSH 서비스에 대한 액세스를 허용하거나 거부하는 것이므로 방화벽에서 SSH 포트를 닫겠습니다. 하지만 먼저 UFW 방화벽의 상태를 확인해 보겠습니다.

sudo ufw status numbered

출력에서 SSH 포트 22IPv4IPv6 프로토콜 모두에서 열려 있음을 확실히 알 수 있습니다. 각각 Strong>5 및 9입니다.

표시된 대로 가장 높은 값인 9부터 시작하여 이 두 규칙을 삭제해야 합니다.

sudo ufw delete 9
sudo ufw delete 5

이제 서버에 원격으로 로그인을 시도하면 그림과 같이 연결 시간 초과 오류가 발생합니다.

3단계: SSH 서버에 연결하도록 노크 클라이언트 구성

마지막 단계에서는 클라이언트를 구성하고 먼저 서버에서 구성한 노크 시퀀스를 전송하여 로그인을 시도합니다.

하지만 먼저 서버에서 했던 것처럼 knockd 데몬을 설치하세요.

sudo apt install knockd

설치가 완료되면 표시된 구문을 사용하여 노크 시퀀스를 보냅니다.

knock -v server_ip knock_sequence

우리의 경우 이는 다음과 같이 해석됩니다.

knock -v 192.168.2.105 10005 10006 10007

시퀀스에 따라 우리가 가진 것과 유사한 출력을 얻어야 합니다. 이는 노크 시도가 성공했음을 나타냅니다.

이제 SSH를 사용하여 서버에 성공적으로 로그인할 수 있는 위치에 있어야 합니다.

원격 서버에서 작업 수행이 완료되면 닫기 노크 시퀀스를 전송하여 SSH 포트를 닫습니다.

knock -v 192.168.2.105 10007 10006 10005

설명된 대로 서버에 로그인하려는 모든 시도는 실패합니다.

마무리 생각

이것으로 포트 노킹을 활용하여 서버의 SSH 서비스를 보호하는 방법에 대한 이 가이드를 마무리합니다. 더 좋고 쉬운 접근 방식은 SSH 키 쌍을 사용하여 비밀번호 SSH 인증을 구성하는 것입니다. 이렇게 하면 개인 키를 가진 사용자만 공개 키가 저장된 서버에 인증할 수 있습니다.