ติดตั้ง knockd ใช้ร่วมกับ UFW เพื่อซ่อน sshd บน ubuntu 16.04

จาก Wiki Opensource

บันทึกนี้ปรับปรุงล่าสุดเมื่อวันที่ 19-06-60
ดูแลโดย วิบูลย์

บทความนี้ใช้สำหรับ server ที่เปิดใช้งาน UFW แล้ว และโดยค่า default ของ UFW จะ deny ทุกอย่าง ดังนั้นเรามักจะเปิด Port 22/tcp ไว้เพื่อ ssh เข้าไปทำงานได้อยู่ก่อนแล้ว
ต้องอ่านเรื่อง การใช้งาน UFW เพื่อทำเป็น host firewall บน ubuntu 16.04 และเข้าใจแล้ว

1. ติดตั้ง knockd

sudo apt install knockd 

เริ่มต้นใช้ UFW ปิด port 22 ก่อนเลย

sudo ufw insert 1 deny from any to any port 22

หลังจากคำสั่งนี้ เราจะไม่สามารถ ssh เข้าไปที่ server ได้แล้วนะ ทดสอบดูได้จาก client
และหากจะยกเลิกไม่ใช้งาน knockd ซ่อน sshd แล้ว ให้ทำดังนี้

sudo ufw delete deny from any to any port 22

จำเป็นอย่างมากในขั้นตอนนี้ ให้เลือกเลข port ที่จะใช้มาสัก 3 เลข เช่น 7001,8002,9003 เป็นต้น แล้วเปิดอนุญาต port ไว้ด้วย

sudo ufw allow 7001
sudo ufw allow 8002
sudo ufw allow 9003


2. แก้ไขไฟล์ /etc/knockd.conf
จากเดิม

 
[options]
        UseSylog

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

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

ให้เป็น

[options]
        LogFile = /var/log/portknocking.log

[openSSH]
        sequence    = 7001,8002,9003
        seq_timeout = 5
        command     = ufw insert 1 allow from %IP% to any port 22
        tcpflags    = syn

[closeSSH]
        sequence    = 9003,8002,7001
        seq_timeout = 5
        command     = ufw delete allow from %IP% to any port 22
        tcpflags    = syn


3. เปิดใช้งาน knockd
โดยแก้ไขไฟล์ /etc/default/knockd เพื่อกำหนดว่าจะใช้งานกับ network interface ใด ตัวอย่างคือ enp0s3

sudo vi /etc/default/knockd

ตั้งค่าดังนี้

START_KNOCKD=1
KNOCKD_OPTS="-i enp0s3"

แล้วทำคำสั่งนี้

sudo systemctl restart knockd.service 

ตรวจสอบว่า knockd ทำงานสำเร็จ โดยใช้คำสั่งเพื่อเปิดดูส่วนท้ายของ Log file ต่อเนื่อง

mama@s2:~$ sudo tail -f /var/log/portknocking.log 
[2017-06-19 11:08] starting up, listening on enp0s3

รอดูว่าจะมีการใช้ Port knocking เข้ามาหรือไม่

4. ทดสอบจากเครื่อง client ที่มี knockd ติดตั้งไว้
4.1 ติดตั้ง knockd (ถ้ายังไม่มี)

sudo apt update
sudo apt install knockd

4.2 รันคำสั่งทดสอบ ขอเปิด sshd

knock 10.0.2.4 7001 8002 9003

ผลลัพธ์ที่ฝั่ง server sshd

[2017-06-19 11:09] 10.0.2.5: openSSH: Stage 1
[2017-06-19 11:09] 10.0.2.5: openSSH: Stage 2
[2017-06-19 11:09] 10.0.2.5: openSSH: Stage 3
[2017-06-19 11:09] 10.0.2.5: openSSH: OPEN SESAME
[2017-06-19 11:09] openSSH: running command: ufw insert 1 allow from 10.0.2.5 to any port 22

ผลลัพธ์ที่ฝั่ง client หลังคำสั่ง knock จะ ssh เข้าได้

linuxlite@linuxlite-VirtualBox:~$ knock 10.0.2.4 7001 8002 9003
linuxlite@linuxlite-VirtualBox:~$ ssh mama@s2.natnetwork
mama@s2.natnetwork's password: 

4.3 รันคำสั่งทดสอบ ขอปิด sshd

knock 10.0.2.4 9003 8002 7001

ผลลัพธ์ที่ฝั่ง server sshd

[2017-06-19 11:11] 10.0.2.5: closeSSH: Stage 1
[2017-06-19 11:11] 10.0.2.5: closeSSH: Stage 2
[2017-06-19 11:11] 10.0.2.5: closeSSH: Stage 3
[2017-06-19 11:11] 10.0.2.5: closeSSH: OPEN SESAME
[2017-06-19 11:11] closeSSH: running command: ufw delete allow from 10.0.2.5 to any port 22

ผลลัพธ์ที่ฝั่ง client หลังคำสั่ง knock จะ ssh เข้าไม่ได้ ต้องกด Ctrl + C ยกเลิก

linuxlite@linuxlite-VirtualBox:~$ knock 10.0.2.4 9003 8002 7001
linuxlite@linuxlite-VirtualBox:~$ ssh mama@s2.natnetwork
^C
linuxlite@linuxlite-VirtualBox:~$ 

หมายเหตุ ขอแนะนำ knockd อีก 1 วิธี (มีอีกหลายวิธี) แบบเปิด แล้ว ปิด ตามจำนวนวินาทีในตัวแปร cmd_timeout จึงต้องเขียน config อีกแบบ

[options]
                LogFile = /var/log/portknocking.log

[opencloseSSH]
                sequence       = 7001,8002,9003
                seq_timeout   = 5
                tcpflags          = syn
                start_command = ufw insert 1 allow from %IP% to any port 22
                cmd_timeout  = 10
                stop_command = ufw delete allow from %IP% to any port 22

ทุกครั้งที่แก้ไข config file /etc/knockd.conf ให้ทำคำสั่งนี้ด้วย

sudo systemctl restart knockd.service 


Reference:
https://joost.vunderink.net/blog/2015/05/07/hiding-your-sshd-with-ufw-and-knockd-on-ubuntu/