Linux에서 포트 노킹을 사용하는 방법 (및 사용하지 않아야하는 이유)

0
506
닫힌 문을 두드리는 손.
Photographee.eu/Shutterstock

포트 노킹은 방화벽 포트를 닫아 서버를 보호하는 방법입니다. 이러한 포트는 연결 요청이 비밀 노크를 제공하는 경우 요청시에만 열립니다.

포트 노킹은“비밀 노크”입니다

1920 년대에 금지가 본격적으로 시작되었을 때, 말하기 쉬운 상태에 들어가려면 비밀 노크를 알고 올바르게 들어가야합니다.

포트 노킹은 현대에 해당합니다. 사람들이 컴퓨터의 서비스에 액세스 할 수 있지만 인터넷에서 방화벽을 열고 싶지 않은 경우 포트 노킹을 사용할 수 있습니다. 방화벽에서 포트를 닫아 들어오는 연결을 허용하고 미리 지정된 연결 시도 패턴이 만들어지면 자동으로 열리도록합니다. 일련의 연결 시도는 비밀 노크 역할을합니다. 또 다른 비밀 노크가 포트를 닫습니다.

포트 노킹은 참신한 일이지만, 모호함을 통한 보안의 예라는 것을 알아야합니다. 그 개념에 근본적인 결함이 있습니다. 시스템에 액세스하는 방법의 비밀은 특정 그룹의 사람들 만 알고 있기 때문에 안전합니다. 그러나 공개, 관찰, 추측 또는 해결 된 비밀이 밝혀지면 보안이 무효화됩니다. SSH 서버에 키 기반 로그인을 요구하는 것과 같은 다른 더 강력한 방법으로 서버를 보호하는 것이 좋습니다.

사이버 보안에 대한 가장 강력한 접근 방식은 다중 계층이므로 포트 노킹은 이러한 계층 중 하나 여야합니다. 레이어가 많을수록 좋습니다. 그러나 포트 노킹이 제대로 강화되고 안전한 시스템에 많은 것을 추가하지 못한다고 주장 할 수 있습니다.

사이버 보안은 광범위하고 복잡한 주제이지만 포트 노킹을 유일한 방어 수단으로 사용해서는 안됩니다.

관련 : Linux 셸에서 SSH 키를 만들고 설치하는 방법

노크 설치

포트 노킹을 시연하기 위해 SSH 포트 인 포트 22를 제어하는 ​​데 사용합니다. 우리는 knockd라는 도구를 사용할 것입니다. 사용하다 apt-get Ubuntu 또는 다른 데비안 기반 배포판을 사용하는 경우이 패키지를 시스템에 설치하십시오. 다른 Linux 배포판에서는 Linux 배포판의 패키지 관리 도구를 대신 사용하십시오.

다음을 입력하십시오.

sudo apt-get install knockd

터미널 창에서 "sudo apt-get install knockd"명령

시스템에 이미 iptables 방화벽이 설치되어 있지만 설치해야 할 수도 있습니다. iptables-persistent 꾸러미. 저장된 자동 로딩을 처리합니다. iptable 규칙.

설치하려면 다음을 입력하십시오.

sudo apt-get install iptables-persistent

터미널 창에서 "sudo apt-get install iptables-persistent"명령

IPV4 구성 화면이 나타나면 스페이스 바를 눌러 “예”옵션을 승인하십시오.

스페이스 바를 눌러 iptables-persistent IPV4 화면에서 "Yes"옵션을 승인하십시오.

IPv6 구성 화면에서 스페이스 바를 다시 눌러 “예”옵션을 승인하고 계속 진행하십시오.

스페이스 바를 눌러 IPv6 구성 화면에서 "예"옵션을 승인하십시오.

다음 명령은 iptables 확립되고 진행중인 연결을 계속할 수 있습니다. 이제 다른 명령을 실행하여 SSH 포트를 닫습니다.

이 명령을 발행 할 때 누군가 SSH로 연결되어있는 경우 차단하지 않기를 바랍니다.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

터미널 창에서 "sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT"명령

이 명령은 방화벽에 규칙을 추가합니다.

  • -ㅏ: 규칙을 방화벽 규칙 테이블에 추가하십시오. 즉, 바닥에 추가하십시오.
  • 입력: 이것은 들어오는 연결에 대한 규칙입니다.
  • -m conntrack: 방화벽 규칙은 규칙의 기준과 일치하는 네트워크 트래픽 (패킷)에 작용합니다. 그만큼 -m 매개 변수 원인 iptables 추가 패킷 일치 모듈 (이 경우에는 conntrack 커널의 네트워크 연결 추적 기능과 함께 작동합니다.
  • –cstate 설립, 관련: 규칙을 적용 할 연결 유형 (예 : ESTABLISHED 및 RELATED 연결)을 지정합니다. 확립 된 연결은 이미 진행중인 연결입니다. 관련 연결은 설정된 연결 작업으로 인해 만들어진 연결입니다. 연결된 누군가가 파일을 다운로드하려고 할 수 있습니다. 이는 호스트가 시작한 새로운 연결을 통해 발생할 수 있습니다.
  • -j 수락: 트래픽이 규칙과 일치하면 방화벽의 ACCEPT 대상으로 이동하십시오. 즉, 트래픽이 허용되고 방화벽을 통과 할 수 있습니다.

이제 명령을 내려 포트를 닫을 수 있습니다 :

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

터미널 창에서 "sudo iptables -A INPUT -p tcp --dport 22 -j REJECT (터미널 창에서 거부)"명령.

이 명령은 방화벽에 규칙을 추가합니다.

  • -ㅏ: 규칙을 방화벽 규칙 테이블에 추가합니다 (예 : 맨 아래에 추가).
  • 입력:이 규칙은 들어오는 연결에 관한 것입니다.
  • -p tcp:이 규칙은 전송 제어 프로토콜을 사용하는 트래픽에 적용됩니다.
  • – 포트 22:이 규칙은 특히 포트 22 (SSH 포트)를 대상으로하는 TCP 트래픽에 적용됩니다.
  • -j 거부: 트래픽이 규칙과 일치하면 방화벽의 거부 대상으로 이동하십시오. 따라서 트래픽이 거부되면 방화벽을 통해 허용되지 않습니다.

우리는 시작해야합니다 netfilter-persistent 악마. 이 명령으로 그렇게 할 수 있습니다 :

sudo systemctl start netfilter-persistent

터미널 창에서 "sudo systemctl start netfilter-persistent".

우리는 원한다 netfilter-persistent 저장 및 재로드주기를 진행하기 위해 iptable 규칙.

다음 명령을 입력하십시오.

sudo netfilter-persistent save

터미널 창에 "sudo netfilter-persistent save"가 있습니다.

sudo netfilter-persistent reload

터미널 창에서 "sudo netfilter-persistent reload".

이제 유틸리티를 설치했으며 SSH 포트가 닫힙니다 (다른 사람의 연결을 종료하지 않고). 이제 비밀 노크를 구성 할 차례입니다.

노크 구성

구성하기 위해 편집하는 두 파일이 있습니다 knockd. 첫 번째는 다음과 같습니다 knockd 구성 파일 :

sudo gedit /etc/knockd.conf

터미널 창에서 "sudo gedit /etc/knockd.conf".

그만큼 gedit 편집기가 열립니다 knockd 구성 파일이로드되었습니다.

gedit 편집기의 노크 구성 파일

필요에 따라이 파일을 편집합니다. 관심있는 섹션은 “openSSH”및 “closeSSH”입니다. 각 섹션에는 다음과 같은 4 가지 항목이 있습니다.

  • 순서: 포트 22를 열거 나 닫으려면 누군가 액세스해야하는 일련의 포트. 기본 포트는 7000, 8000 및 9000이며 포트는 9000, 8000 및 7000입니다. 이 목록을 변경하거나 포트를 더 추가 할 수 있습니다. 우리의 목적을 위해, 우리는 기본값을 고수 할 것입니다.
  • seq_timeout: 누군가 포트를 열거 나 닫으려면 포트에 액세스해야하는 기간입니다.
  • 명령: 명령이 iptables 열기 또는 닫기 조치가 트리거 될 때 방화벽. 이 명령은 방화벽에 규칙을 추가하거나 (포트를 열기 위해) 제거합니다 (포트를 닫기 위해).
  • tcpflags: 각 포트의 패킷 유형은 비밀 순서대로 수신해야합니다. SYN (동기화) 패킷은 TCP 연결 요청에서 처음으로 3 방향 핸드 셰이크라고합니다.

“openSSH”섹션은“포트 22를 여는 명령이 방화벽으로 전송 되려면 5 분 이내에 포트 7000, 8000 및 9000에 TCP 연결 요청이 이루어져야합니다.”로 읽을 수 있습니다.

“closeSSH”섹션은“포트 22를 닫는 명령이 방화벽으로 전송 되려면 5 번 이내에 포트 9000, 8000 및 7000에 TCP 연결 요청이 이루어져야합니다.”로 읽을 수 있습니다.

방화벽 규칙

openSSH 및 closeSSH 섹션의“명령”항목은 하나의 매개 변수를 제외하고 동일하게 유지됩니다. 이것이 그들이 구성되는 방식입니다 :

  • -ㅏ: 방화벽 규칙 목록 하단에 규칙을 추가합니다 (openSSH 명령의 경우).
  • -디: 방화벽 규칙 목록에서 명령을 삭제하십시오 (closeSSH 명령의 경우).
  • 입력:이 규칙은 들어오는 네트워크 트래픽과 관련이 있습니다.
  • -s % IP %: 연결을 요청하는 장치의 IP 주소입니다.
  • -피: 네트워크 프로토콜; 이 경우 TCP입니다.
  • –dport: 대상 포트; 이 예에서는 포트 22입니다.
  • -j 수락: 방화벽 내 수락 대상으로 이동합니다. 다시 말해, 패킷이 다른 규칙에 영향을주지 않으면 서 패킷을 삭제하게합니다.

노크 구성 파일 편집

파일을 수정하면 아래에 빨간색으로 강조 표시됩니다.

편집 내용이 강조 표시된 gedit 편집기의 녹아웃 구성 파일

“seq_timeout”을 15 초로 연장합니다. 관대하지만 연결 요청에서 누군가가 수동으로 실행하는 경우 많은 시간이 필요할 수 있습니다.

“openSSH”섹션에서 -A 명령의 (추가) 옵션 -I (끼워 넣다). 이 명령은 새로운 방화벽 규칙을 상단 방화벽 규칙 목록 당신이 떠나면 -A 옵션, 그것 추가 방화벽 규칙 목록을 바닥.

들어오는 트래픽은 위에서 아래의 목록에있는 각 방화벽 규칙에 따라 테스트됩니다. 포트 22를 닫는 규칙이 이미 있습니다. 따라서 트래픽을 허용하는 규칙을보기 전에 들어오는 트래픽을 해당 규칙에 대해 테스트하면 연결이 거부됩니다. 이 새 규칙이 먼저 표시되면 연결이 허용됩니다.

close 명령은 방화벽 규칙에서 openSSH에 의해 추가 된 규칙을 제거합니다. SSH 트래픽은 기존의 “포트 22가 닫혔습니다”규칙에 의해 한 번 더 처리됩니다.

편집 한 후 구성 파일을 저장하십시오.

관련 : gedit를 사용하여 Linux에서 그래픽으로 텍스트 파일을 편집하는 방법

노크 된 제어 파일 편집

그만큼 knockd 제어 파일이 더 간단합니다. 그러나 우리가 그것을 이해하고 편집하기 전에 네트워크 연결의 내부 이름을 알아야합니다. 그것을 찾으려면 다음 명령을 입력하십시오.

ip addr

터미널 창에서 "ip addr"명령

이 기계가이 기사를 조사하는 데 사용하는 연결을 enp0s3. 연결 이름을 기록해 두십시오.

다음 명령은 knockd 제어 파일 :

sudo gedit /etc/default/knockd

터미널 창에서 "sudo gedit / etc / default / knockd"명령

여기에 knockd 제출하다 gedit.

gedit의 노크 된 제어 파일.

몇 가지 수정 사항이 빨간색으로 강조 표시됩니다.

편집 내용이 강조 표시된 gedit의 녹아웃 된 제어 파일.

“START_KNOCKD =”항목을 0에서 1로 변경했습니다.

해시도 제거했습니다 # “KNOCKD_OPTS =”항목의 시작 부분부터 “eth1″을 네트워크 연결 이름으로 대체했습니다. enp0s3. 물론 네트워크 연결이 eth1변경하지 않습니다.

푸딩에 증거가있다

이것이 작동하는지 확인할 때입니다. 우리는 시작합니다 knockd 이 명령으로 데몬 :

sudo systemctrl start knockd

터미널 창에서 "sudo systemctrl start knocked"명령

이제 다른 컴퓨터로 이동하여 연결을 시도합니다. 우리는 설치 knockd 포트 노킹을 설정하려는 것이 아니라 knockd 패키지는 다른 도구를 제공합니다 knock. 우리는이 기계를 사용하여 비밀스러운 순서로 발사하고 우리를 노크합니다.

IP 주소가 192.168.4.24 인 포트 노킹 호스트 컴퓨터의 포트로 비밀 연결 순서를 보내려면 다음 명령을 사용하십시오.

knock 192.168.4.24 7000 8000 9000 -d 500

이것은 알려줍니다 knock IP 주소 192.168.4.24에서 컴퓨터를 대상으로하고 포트 7000, 8000 및 9000에 대한 연결 요청을 차례로 -d 그들 사이에 500 밀리 초의 (지연).

“dave”라는 사용자는 192.168.4.24에 SSH 요청을합니다.

ssh dave@192.168.4.24

연결이 승인되고 비밀번호를 입력하면 원격 세션이 시작됩니다. 그의 명령 프롬프트는 dave@nostromodave@howtogeek. 원격 컴퓨터에서 로그 아웃하려면 다음을 입력하십시오.

exit

그의 명령 프롬프트는 로컬 컴퓨터로 돌아갑니다. 그는 사용한다 knock 이번에는 원격 컴퓨터의 SSH 포트를 닫기 위해 포트를 역순으로 대상을 지정합니다.

knock 192.168.4.24 9000 8000 7000 -d 500

터미널 창에서 포트 노킹 및 SSH 연결 세션.

분명히 이것은 유익한 원격 세션이 아니지만 포트 노킹을 통한 포트의 개폐를 보여주고 단일 스크린 샷에 적합합니다.

그래서 이것은 다른 쪽에서 어떻게 생겼습니까? 포트 노킹 호스트의 시스템 관리자는 다음 명령을 사용하여 시스템 로그에 도착하는 새 항목을 봅니다.

tail -f /var/log/syslog

터미널 창에서 포트 노킹 이벤트를 표시하는 syslog

  • 세 개의 openSSH 항목이 표시됩니다. 각 포트는 원격 노크 유틸리티의 대상이되므로 발생합니다.
  • 트리거 시퀀스의 세 단계가 모두 충족되면 “OPEN SESAME”이라는 항목이 기록됩니다.
  • 에 규칙을 삽입하는 명령 iptables 규칙 목록이 전송됩니다. 정확한 비밀 노크 (192.168.4.23)를 제공 한 PC의 특정 IP 주소에서 포트 22의 SSH를 통한 액세스를 허용합니다.
  • 사용자 “dave”는 몇 초 동안 만 연결 한 다음 연결을 끊습니다.
  • 세 개의 closeSSH 항목이 표시됩니다. 각 포트는 원격 노크 유틸리티의 대상이되므로 포트 노킹 호스트에게 포트 22를 닫으라고 지시합니다.
  • 세 단계가 모두 트리거되면 “OPEN SESAME”메시지가 다시 나타납니다. 규칙을 제거하기 위해 명령이 방화벽으로 전송됩니다. (항구를 닫을 때“CLOSE SESAME”이 아닌 이유는 무엇입니까?)

이제 유일한 규칙 iptables 포트 22에 관한 규칙 목록은 해당 포트를 닫기 위해 처음에 입력 한 것입니다. 이제 포트 22가 다시 닫힙니다.

머리를 두 드리십시오

포트 노킹의 팔러 트릭입니다. 그것을 기분 전환으로 취급하고 현실 세계에서는하지 마십시오. 또는 필요한 경우 유일한 보안 형식으로 의존해서는 안됩니다.