Nguồn ảnh DO

Thông thường chúng ta vẫn sử dụng giao thức SSH để kết nối giữa client và server. Để thực hiện được việc này chúng ta cần mở một port trên server để cho phép kết nối này. Như vậy hacker có thể sử dụng các kỹ thuật để biết port này và sử dụng các phương pháp tấn công để SSH vào server. Trong bài viết này tôi sẽ giới thiệu một kỹ thuật được sử dụng để ẩn port có tên là port knock.

Cách thức hoạt động của port knock

Port knocking hoạt động bằng cách xem log lưu lượng các gói tin vào ra trên filewall hoặc lưu lượng gói tin trên một interface. Dựa vào đây chúng ta sẽ cấu hình chuỗi các sự kiện theo quy tắc. Nếu chuối sự kiện này đúng thì sẽ thực hiện thay đổi rule của firewall.

Ví dụ cấu hình port knock cho port 22. Mặc định firewall sẽ không mở port 22 để cho phép kết nối SSH. Khi cấu hình port knock ta để sự kiện là khi nhận được lần lượt 3 gói tin SYN gửi đến các port 7000, 8000 và 9000 thì firewall sẽ được thay đổi để mở port 22. Và khi nhận lần lượt 3 gói tin SYN đến các port 9000, 8000, 7000 thì firewall sẽ xóa rule cho phép SSH.

Cài đặt

Cài đặt iptables

Port knock hoạt động dựa trên iptables nên ta cần cài iptables trên server.

Trên Ubuntu sử dụng ufw làm firewall nên để cài iptables ta cần disable ufw trước

ufw disable

Cài đặt iptables

apt-get install iptables iptables-persistent

Cho phép giữ các phiên đang kết nối để việc thực hiện không bị gián đoạn (trong trường hợp bạn đang SSH vào server)

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

Đổi policy mặc định của iptables thành DROP

iptables --policy INPUT DROP

Lưu lại cấu hình

netfilter-persistent save

netfilter-persistent reload

Cài đặt knockd

Install knockd

apt-get install knockd -y

Enable knockd để start knockd mỗi lần reboot.

vi /etc/default/knockd

Trong file này ta sửa lại 2 dòng

START_KNOCKD=1
KNOCKD_OPTS="-i ens3"

Trong đó ens3 là tên của interface lắng nghe kết nối trên server

Tiếp tục sửa file /etc/knockd.conf

vi /etc/knockd.conf

Sửa file này lại như sau

[options]
        logfile = /var/log/knockd.log

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

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

Trong đó:

  • logfile: là file log của dịch vụ knockd
  • sequence: Thứ tự các port nhận kết nối trước khi mở port SSH
  • seq_timeout: thời gian đợi để nhận đủ các gói tin đến các port liệt kê ở sequence
  • command: command sẽ được thực hiện khi nhận đủ gói tin đến các port liệt kê ở sequence trước khoảng thời gian seq_timeout
  • tcpflags: cờ của mỗi gói tin gửi đến các port trên

Như vậy khi client gửi liên tiếp 3 gói tin với cờ SYN được bật đến các port 7000, 8000 và 9000 của server thì câu lệnh mở port SSH sẽ được thực hiện. Và khi ta thực hiện liên gửi 3 gói tin SYN đến lần lượt 3 port 9000, 8000, 7000 thì port SSH này sẽ được đóng lại.

Test lại

Để đảm bảo rằng cấu hình đã thành công chúng ta thực hiện kiểm tra lại

SSH đến server

ssh root@10.10.1.10
ssh: connect to host 10.10.1.10 port 22: Connection refused

Không thể SSH đến server

Sử dụng nmap để kiểm tra xem port SSH có mở

nmap 10.10.1.10

Starting Nmap 7.60 ( https://nmap.org ) at 2019-10-11 16:21 +07
Nmap scan report for 10.10.1.10
Host is up (0.00011s latency).
All 1000 scanned ports on 10.10.1.10 are filtered
MAC Address: 52:54:00:AB:22:F8 (QEMU virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 11.38 seconds

Ta không thấy port SSH đâu

Thực hiện telnet lần lượt đến 3 port 7000, 8000 và 9000

telnet 10.10.1.10 7000
telnet 10.10.1.10 8000
telnet 10.10.1.10 9000

Sử dụng nmap để kiểm tra lại

nmap 10.10.1.10

Starting Nmap 7.60 ( https://nmap.org ) at 2019-10-11 16:22 +07
Nmap scan report for 10.10.1.10
Host is up (0.00040s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: 52:54:00:AB:22:F8 (QEMU virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 18.30 seconds

Ta thấy port SSH lúc này đã là open

SSH lại vào server

ssh root@10.10.1.10
root@10.10.1.10's password: 
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-142-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

131 packages can be updated.
84 updates are security updates.

New release '18.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Tue Oct  8 00:13:34 2019 from 10.10.1.1
root@ubuntu:~# 

Tôi đã thực hiện login thành công.

Đến đây việc cấu hình đã thành công. Hy vọng đây sẽ là kỹ thuật nhỏ giúp server của bạn an toàn hơn.