Tăng cường bảo mật SSH trên Ubuntu sử dụng port knock

30/12/2020

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.

ONET IDC thành lập vào năm 2012, là công ty chuyên nghiệp tại Việt Nam trong lĩnh vực cung cấp dịch vụ Hosting, VPS, máy chủ vật lý, dịch vụ Firewall Anti DDoS, SSL… Với 10 năm xây dựng và phát triển, ứng dụng nhiều công nghệ hiện đại, ONET IDC đã giúp hàng ngàn khách hàng tin tưởng lựa chọn, mang lại sự ổn định tuyệt đối cho website của khách hàng để thúc đẩy việc kinh doanh đạt được hiệu quả và thành công.
Bài viết liên quan

[Graylog] [LAB] [Phần 9] Cấu hình graylog gửi cảnh báo qua email

Là một System Admin bạn luôn phải lưu ý vấn đề bảo mật của hệ thống. Khi có hoạt động đăng...
30/12/2020

Quản lý cơ sở dữ liệu MariaDB trên CentOS 7

MariaDB là một hệ quản trị cơ sở dữ liệu được sử dụng phổ biến hiện nay. Vậy nó làm...
30/12/2020

Cài đặt và cấu hình SSMTP trên Linux để gửi mail

SSMTP (secure Simple Mail Transfer Protocol)là một sự thay thế cho sendmail để gửi thư trên Linux. Nó...
30/12/2020