Port knocking là phương pháp mở động các cổng mạng bằng cách "gõ" (tức là kết nối) vào một chuỗi cổng được xác định trước. Phương pháp này đặc biệt hữu ích để che khuất một cổng mạng mở khỏi quá trình quét cổng vì cổng đó sẽ bị đóng trừ khi chuỗi gõ cổng được thực thi. Chuỗi gõ cổng đủ dài thực tế là không thể thực hiện được bằng cách tấn công brute force: ví dụ, để đoán thành công (bằng cách tấn công brute force) một tổ hợp 3 cổng TCP, kẻ tấn công sẽ phải thử gõ vào từng tổ hợp trong số 281 nghìn tỷ tổ hợp có thể có và quét các cổng mở sau mỗi chuỗi gõ cổng. Như bạn có thể tưởng tượng, việc này sẽ mất rất, rất nhiều thời gian.
Hướng dẫn này sẽ giúp bạn cài đặt knockd, một daemon gõ cổng linh hoạt, trên Debian 10. Với mục đích trình diễn, chúng tôi sẽ định cấu hình nó để che khuất cổng SSH, mặc dù bất kỳ cổng/dịch vụ nào khác đều có thể được bảo vệ bằng cách tiếp cận này.
Trước khi cài đặt knockd, hãy kiểm tra tên giao diện mạng công cộng của hệ thống bằng lệnh sau:
Lưu ý tên giao diện (ens18 trong trường hợp này). Nó sẽ cần sau.
Đầu tiên, sao lưu tệp cấu hình hiện có:
Thứ hai, mở tệp cấu hình trong trình soạn thảo văn bản của bạn:
Và nhập cấu hình hiển thị bên dưới:
(thay thế ens18 bằng tên giao diện mạng của bạn.)
Điều này sẽ hướng dẫn knockd bật lưu lượng đến cổng 22 sau khi nhận được chuỗi knock chính xác (1000,2000,3000 trong trường hợp này), sau đó tắt lại lưu lượng sau 20 giây trì hoãn. Do đó, các kết nối SSH sẽ chỉ được chấp nhận trong cửa sổ 20 giây này.
Tiếp theo, bật knockd bằng cách chỉnh sửa tệp /etc/default/knockd:
Và đặt START_KNOCKD thành 1:
Lưu tệp và thoát. Chúng tôi cũng sẽ sửa đổi đơn vị systemd cho knockd. Để thực hiện, hãy tạo một tệp đơn vị mới để ghi đè mặc định:
Và dán nội dung sau:
Sau đó sử dụng lệnh sau để tải và kích hoạt đơn vị mới:
Các lệnh sau đảm bảo rằng các kết nối hiện có không bị gián đoạn.
Sau đây là các quy tắc để hủy kết nối đến cổng 22/tcp:
Sau đó, lưu chuỗi quy tắc hiện tại để duy trì qua các lần khởi động lại:
Kết nối SSH bây giờ sẽ thành công.
Và thay thế cấu hình hiện tại bằng cấu hình sau:
Sau đó, khởi động lại dịch vụ để tải cấu hình mới:
Hướng dẫn này sẽ giúp bạn cài đặt knockd, một daemon gõ cổng linh hoạt, trên Debian 10. Với mục đích trình diễn, chúng tôi sẽ định cấu hình nó để che khuất cổng SSH, mặc dù bất kỳ cổng/dịch vụ nào khác đều có thể được bảo vệ bằng cách tiếp cận này.
Yêu cầu
- Máy chủ chạy Debian 10.
- Quyền truy cập gốc vào máy chủ của bạn.
- Biến môi trường $EDITOR phải là đặt.
- Hệ thống thứ hai để thử nghiệm.
Trước khi cài đặt knockd, hãy kiểm tra tên giao diện mạng công cộng của hệ thống bằng lệnh sau:
Mã:
ip link show | grep -v lo
Mã:
2: ens18: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
Bước 1: Cài đặt Knockd
knockd là một daemon gõ cổng lắng nghe các kết nối và mở các cổng tương ứng. Chúng tôi sẽ sử dụng knockd với các quy tắc iptables để triển khai gõ cổng. Cài đặt các gói cần thiết như sau:
Mã:
apt updateapt install knockd iptables-persistent
Bước 2: Cấu hình Knockd
Knockd sử dụng một tệp cấu hình duy nhất, /etc/knockd.conf, để xác định trình tự gõ và các tham số khác. Có hai chế độ hoạt động thực tế. Chế độ đầu tiên yêu cầu một trình tự gõ duy nhất để mở và đóng cổng được xác định trước, trong khi chế độ còn lại sử dụng các trình tự mở và đóng riêng biệt. Chúng tôi sẽ sử dụng cái trước vì nó yêu cầu ít tương tác của người dùng hơn.Đầu tiên, sao lưu tệp cấu hình hiện có:
Mã:
mv /etc/knockd.conf /etc/knockd.conf.bak
Mã:
$EDITOR /etc/knockd.conf
(thay thế ens18 bằng tên giao diện mạng của bạn.)
Mã:
[tùy chọn] UseSyslog Interface = ens18[SSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT cmd_timeout = 20
Tiếp theo, bật knockd bằng cách chỉnh sửa tệp /etc/default/knockd:
Mã:
$EDITOR /etc/default/knockd
Mã:
START_KNOCKD=1
Mã:
$EDITOR /etc/systemd/system/knockd.service
Mã:
[Unit]Description=Port-Knock DaemonAfter=network.targetRequires=network.targetDocumentation=man:knockd(1)[Service]EnvironmentFile=-/etc/default/knockdExecStartPre=/usr/bin/sleep 1ExecStart=/usr/sbin/knockd $KNOCKD_OPTSExecReload=/bin/kill -HUP $MAINPIDKillMode=mixedRestart=alwaysSuccessExitStatus=0 2 15ProtectSystem=fullCapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN[Cài đặt]WantedBy=multi-user.target
Mã:
systemctl daemon-reloadsystemctl enable --now knockd.service
Bước 3: Quy tắc tường lửa
Lúc này, Knockd đã sẵn sàng, nhưng theo mặc định, mọi lưu lượng đều được bật thông qua tường lửa. Chúng tôi sẽ tạo các quy tắc tường lửa để từ chối truy cập vào cổng 22/tcp.Các lệnh sau đảm bảo rằng các kết nối hiện có không bị gián đoạn.
Mã:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Mã:
iptables -A INPUT -p tcp --destination-port 22 -j DROPip6tables -A INPUT -p tcp --destination-port 22 -j DROP
Mã:
iptables-save > /etc/iptables/rules.v4ip6tables-save > /etc/iptables/rules.v6
Bước 4: Kiểm tra
Từ một hệ thống khác, hãy thử bắt đầu một phiên SSH mới tới máy chủ của bạn. Bạn sẽ không thể kết nối. Để thực hiện trình tự gõ, có thể sử dụng các công cụ khác nhau, mặc dù chúng tôi sẽ trình bày bằng knock, trình khách gõ có trong Knockd. Cài đặt gói knockd như được hiển thị trong Bước 1 vào một hệ thống khác, sau đó thực hiện các lệnh:
Mã:
knock server_ip_address 1000 2000 3000ssh username@server_ip_address
Cấu hình thay thế
Knockd cũng có thể được cấu hình để yêu cầu hai chuỗi riêng biệt để mở và đóng các cổng mạng. Điều này hữu ích nếu bạn muốn giữ các cổng mở trong thời gian dài. Để cấu hình Knockd theo cách này, hãy mở tệp cấu hình của nó:
Mã:
$EDITOR /etc/knockd.conf
Mã:
[options] UseSyslog Interface = your_interface[openSSH] sequence = 1000,2000,3000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT[closeSSH] sequence = 3000,2000,1000 seq_timeout = 15 tcpflags = syn start_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
Mã:
systemctl restart knockd.service