보안을 안전하게 하자, knockd 설치하는법. [우분투 16.04 LTS]

| 2017년 7월 6일 | 0 Comments

2017년 많은 사람들이 리눅스는 윈도우보다 안전하다고 생각하던 시절과는 달리 보안에 민감해지기 시작했습니다.
지금 이 시간에도 많은 사람들은 리눅스의 서버 보안 설정을 튼튼하게 설정하고 중요한 파일들을 매일같이 신경써서
백업하기도 하며 사용하는 패스워드를 주기적으로 복잡하게 변경하여 서버의 안전성을 확보하고 있습니다.

제가 소개할 프로그램은 서버의 안전성을 증가시켜주는 프로그램중 하나로써 제한된 시간 내에 TCP 또는 UTP등의
패킷을 수신 받아서 그 패킷이 설정한 패킷과 같으면 설정된 내용을 실행시키는 기능을 하는 knockd 프로그램입니다.

주의 : 이 글에서는 iptables 설정을 변경합니다. 잘못설정시 서버에 콘솔로 접근하여 설정을 변경 해야하는점 
            명심해주시기 바라며 knockd의 설치 및 설정에 의해 발생하는 문제점은 작업하시는 분의 책임입니다. 
            절대 작성자 및 스마일서브가 책임을 지지않습니다.

서버(가상) 구성 2대
리눅스 OS : Ubuntu 16.04 LTS 64 bit
CPU : 1core
메모리 : 1GB

윈도우 OS : 윈도우 10 64bit
CPU : 1core
메모리 : 1GB

 

윈도우 knock client 설치

1.png

리눅스 서버에 knockd를 설치하기 전에 윈도우 부분을 먼저 셋팅합니다.  아래의 URL로 이동하여 
Other Downloads항목의 Native Win32 Client를 다운로드 받습니다.

다만 자신이 사용하는 컴퓨터 OS가 리눅스거나 또는 knockd에 보낼 패킷을
스마트폰의 어플을 이용하여 보내실경우 이 부분을 진행하지 않으셔도 무방하며
리눅스의 경우 knockd client, telnet, nmap등으로도 패킷을 보낼수 있는점 참고바랍니다.
(윈도우도 telnet이 존재하지만 패킷 전송이 잘되지않는 문제가 있습니다.)

URL: http://www.zeroflux.org/projects/knock

2.png

다운로드 받은 knock-win32의 압축을 해제합니다.

3.png

4.png

압축을 해제한뒤 knock-win32 > knock-win32-port > Release 순으로 이동하면 knock.exe를
확인할수 있습니다. 그것을 Crtl + c로 복사한후 C:\Windows\System32에 이동하여 붙여넣습니다.
관리자 권한이 필요하다는 부분에는 계속을 클릭하면 되며 이렇게 하면 윈도우에서 할일은 끝입니다.

순서 정리

1. knock-win32 > knock-win32-port > Release로 이동한다.
2. knock.exe를 복사한다.
3. C:\Windows\System32에 knock를 붙여넣는다.
4. 관리자 권한이 필요합니다. 부분에서 계속(C)을 클릭.


 리눅스 knockd 서버 설치

5.png

이번엔 리눅스 서버로 접속하여 knockd_0.7-1_amd64.deb를 다운로드 받은뒤 설치합니다.
보통은 apt-get install knockd로도 설치가 됩니다만 저의 경우 이렇게 설치하면 기능이 정상적으로
작동하지 않아 부득이하게 deb 파일을 다운받아 설치를 진행하였습니다.

순서정리

1. /usr/local/src로 이동한다.
cd /usr/local/src

2. wget 으로 knockd_0.7-1_amd64.deb를 다운로드 받는다.
wget http://ftp.kr.debian.org/debian/pool/main/k/knockd/knockd_0.7-1_amd64.deb

3. dpkg로 설치를 진행한다.
dpkg -i knockd_0.7-1_amd64.deb

6.png

7.png

/etc/knockd.conf로 이동하여 설정을 진행합니다.
초기 설정은 SSH에 관련된 openSSH, closeSSH 총 두가지의 설정으로 구성되어있습니다.
이 부분은 간단하게 풀어서 설명하도록하겠습니다.

[openSSH] : 이름을 설정합니다.
sequence : 패킷을 설정합니다. 설정에 따라 TCP 또는 UCP로 패킷을 받아올수있습니다. 
seq_timeout : 패킷을 받을 시간 제한을 설정합니다. (초 단위)
command : 설정한 패킷이 올바르면 명령어가 구동됩니다. 
tcpflags : 플래그와 일치시킬 패킷을 설정합니다.

저는 여기서 openSSH 설정을 조금 다르게 변경해보도록 하겠습니다.
변경 후를 보시면 sequence와 seq_timeout, command를 변경한것을 알수있습니다.
이렇게 변경한 이유는 받을 패킷을 변경하고 패킷을 받아올 시간에 조금 여유를 주기 위함이며
이번 글에서는 iptables의 22번 포트를 막아놓고 knockd를 통해 IP를 방화벽에 등록시키기위해
-A에서 -I로 설정을 변경하였습니다.

변경 전

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
        tcpflags    = syn

변경 후

[openSSH]
        sequence    = 1111,2222,3333 # 순서대로 1111 2222 3333의 패킷이
        seq_timeout = 20 # 20초안에 서버에 도달하면
        command     = /sbin/iptables -I INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
       # 패킷을 발송할 서버의 IP가 방화벽에 등록된다.
        tcpflags    = syn

변경이 완료되면 서비스를 시작합니다.

/etc/init.d/knockd start

8.png

제가 테스트한 서버는 최소 설치만 진행한 상태로 iptables의 룰이 셋팅 되어있지 않습니다.
여기서 icmp 및 22번 포트를 차단해보도록 하겠습니다.

주의 : 이 상태로 하면 knockd를 통해 IP가 22번 포트에 접속할수 있도록 방화벽에서 허용하거나 콘솔로 접속하여 
          22번 포트를 허용하지 않는이상 PUTTY등으로 SSH 접속을 할수 없게됩니다. 사용전 이 점 꼭 주의하세요.

# icmp 및 22번 포트 차단
iptables -F # iptables의 룰 제거 꼭 사용하지 않아도됩니다.
iptables -A INPUT -p icmp –icmp-type echo-request -j DROP
iptables -A INPUT -p tcp -m tcp –dport 22 -j DROP


윈도우 knock client에서 패킷을 knock 서버로 전송

9.png

윈도우로 이동한 후 cmd를 실행한 뒤 knock를 통해 iptables에 IP를 허용할수 있도록 /etc/knockd.conf에서 
설정한 [openSSH]의 sequence대로 패킷을 발송합니다.

# 패킷 발송

1. 윈도우에서 cmd를 실행
– Ctrl + R > cmd 입력후 확인
– 시작을 누르고 검색쪽에 cmd를 입력후 엔터

2. knock를 통해 패킷 발송
명령어 : knock      서버 IP          설정해둔 sequence
예시 : knock 111.222.333.444 1111 2222 3333

10.png

[openSSH]의 sequence에 맞게 패킷이 발송되면 명령어가 실행되어 서버에 접근할수 있게 되며
iptables 명령어를 통해 IP가 방화벽에 등록이 되어있는 부분을 확인할수 있습니다.


knockd의 응용법

11.png

아까 iptables에서 22번을 차단하기전에 icmp를 먼저 차단하였습니다. ping을 확인해보면 ping 확인이
안되는 부분을 확인할수 있습니다. 이번에는 knockd에 다른 설정을 추가하여 허용된 IP만 ping 확인이 
가능하도록 설정해보도록 하겠습니다.

12.png

리눅스 서버의 /etc/knockd.conf로 이동하여 설정을 진행해보겠습니다. 이번에 추가할것은 
패킷이 전송되면 icmp를 허용시켜주는 openicmp와 패킷이 전송되면 icmp를 차단하는 closeicmp입니다.
설정한후에는 꼭 knockd의 재시작이 필요합니다.

kncokd.conf에 별도 설정 추가.

vi /etc/knockd.conf
[openicmp]
        sequence    = 1212,1313,1414
        seq_timeout = 15
        command     = /sbin/iptables -I INPUT -s %IP% -p icmp –icmp-type echo-request -j ACCEPT
        tcpflags    = syn

[closeicmp]
        sequence    = 1515,1616,1717
        seq_timeout = 15
        command     = /sbin/iptables -D INPUT -s %IP% -p icmp –icmp-type echo-request -j ACCEPT
        tcpflags    = syn

설정후 재시작

/etc/init.d/knockd restart

13.png

윈도우로 이동한후 cmd를 실행한 뒤 knock를 통해 iptables에 IP를 허용할수 있도록 /etc/knockd.conf에서 
설정한 [openicmp]의 sequence대로 패킷을 발송합니다. 패킷도 아까와 다른 1212 1313 1414 입니다.

패킷 발송

1. 윈도우에서 cmd를 실행
– Ctrl + R > cmd 입력후 확인
– 시작을 누르고 검색쪽에 cmd를 입력후 엔터

2. knock를 통해 패킷 발송
명령어 : knock 서버 IP 설정해둔 sequence
예시 : knock 111.222.333.444 1111 2222 3333

 
15.png
14.png
 
정상적으로 패킷을 받게되면 명령어가 구동되며 IP가 icmp를 받아올수 있도록 방화벽 설정이 진행되며
ping 확인도 정상적으로 진행할수 있는점을 확인하였습니다.
 
로그 
 
16.png
 
knockd의 로그는 /var/log/syslog에 저장되며 문제가 발생시 해당 로그를 확인해보면됩니다.
이 부분도 리눅스의 telnet으로 패킷을 보낸다는 가정하에 예시를 들어보도록 하겠습니다. 
 
# 패킷 1111가 서버에 발송되어 openSSH의 첫번째 패킷과 일치함을 확인
root@imitator:~#  telnet 서버 IP 1111
Jul  6 15:04:08 localhost knockd:                          openSSH: Stage 1
# 패킷 2222가 서버에 발송되어 openSSH의 두번째 패킷과 일치함을 확인
root@imitator:~#  telnet 서버 IP 2222
Jul  6 15:04:08 localhost knockd:                          openSSH: Stage 2
# 패킷 3333가 서버에 발송되어 openSSH의 세번째 패킷과 일치함을 확인
root@imitator:~#  telnet 서버 IP 3333
Jul  6 15:04:08 localhost knockd:                          openSSH: Stage 3
 
# 모든 패킷이 일치함을 확인
Jul  6 15:04:08 localhost knockd:                          openSSH: OPEN SESAME
 
# 명령어 동작
Jul  6 15:04:08 localhost knockd: openSSH: running command: /sbin/iptables -I INPUT -s 
                                                      -p tcp –dport 22 -j ACCEPT

knockd는 여러모로 유용하게 사용하기 좋은 프로그램이라고 생각합니다. 평소에는 모든 IP의 접속을 차단하고 
설정해둔 패킷만 올바르게 받으면 해당 IP만 서버에 접속할수 있게끔 하는 설정도 사용할수 있고 또한 별도의 명령어를
설정해서 사용할수 있다는게 장점이기도 하며 단점이기도 합니다.  한번 이용해보셔도 괜찮을것같습니다.

Category: LINUX

About the Author ()