Các Thực Hành Tốt Nhất Bảo Mật SSH: Giải Thích Xác Thực Khóa, Fail2Ban và Port Knocking

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Vấn Đề Đặt Ra: Cánh Cửa Mở Của Máy Chủ

Sau khi máy chủ của tôi bị nhắm mục tiêu bởi các cuộc tấn công vét cạn SSH vào một đêm khuya, bảo mật ngay lập tức trở thành ưu tiên hàng đầu của tôi. Thật là một trải nghiệm đáng sợ khi chứng kiến các nỗ lực đăng nhập tự động, không ngừng nghỉ nhắm vào máy của bạn. Giao thức Secure Shell (SSH) là công cụ không thể thiếu để quản lý máy chủ từ xa.

Tuy nhiên, cấu hình mặc định của nó có thể tạo ra một lỗ hổng rõ ràng nếu không được bảo mật đúng cách. Bất cứ khi nào bạn kết nối một máy chủ với internet, về cơ bản bạn đang mở một cánh cửa kỹ thuật số. Nếu không có các khóa chắc chắn và sự cảnh giác liên tục, cánh cửa đó có thể nhanh chóng trở thành một lời mời hấp dẫn đối với những vị khách không mời.

Nhiều sự cố bảo mật liên quan đến SSH xuất phát từ các vấn đề phổ biến: thông tin đăng nhập yếu, phụ thuộc vào cài đặt mặc định và thiếu phát hiện mối đe dọa chủ động. Các tác nhân độc hại liên tục quét internet để tìm các cổng SSH mở, không ngừng cố gắng đoán mật khẩu.

Ví dụ, một mật khẩu đơn giản gồm 6 ký tự, chỉ gồm chữ thường, có thể bị bẻ khóa chỉ trong vài giây bởi các bot tự động. Ngay cả khi sử dụng mật khẩu mạnh, phức tạp, số lượng lớn các cuộc tấn công này—thường là hàng ngàn mỗi giờ—có thể làm quá tải nhật ký hệ thống của bạn và có khả năng làm lộ các lỗ hổng khác.

Các Khái Niệm Cốt Lõi: Bảo Vệ SSH Đa Tầng

Để chống lại các mối đe dọa dai dẳng một cách hiệu quả, chúng ta cần nhiều hơn một cơ chế phòng thủ duy nhất. Thay vào đó, chúng ta xây dựng một cách tiếp cận bảo mật mạnh mẽ, đa tầng bằng cách sử dụng một số kỹ thuật đã được chứng minh. Chúng ta sẽ khám phá ba chiến lược cơ bản: xác thực dựa trên khóa mạnh, phòng chống tấn công vét cạn chủ động với Fail2Ban, và kỹ thuật ẩn danh thường bị đánh giá thấp được gọi là port knocking.

Xác Thực Khóa: Loại Bỏ Mật Khẩu Vĩnh Viễn

Việc dựa vào xác thực bằng mật khẩu cho SSH giống như bảo vệ cửa trước nhà bạn bằng một ổ khóa lỏng lẻo. Nó rất dễ bị tấn công vét cạn (brute-force attacks) và tấn công từ điển (dictionary attacks).

Xác thực khóa SSH thay thế điều này bằng một cặp khóa mã hóa: một khóa công khai (public key) được lưu trữ trên máy chủ và một khóa riêng (private key) được giữ an toàn trên máy cục bộ của bạn. Khi bạn bắt đầu kết nối, máy chủ sẽ thách thức máy khách của bạn, và máy khách của bạn sau đó chứng minh danh tính của nó bằng cách sử dụng khóa riêng, mà không bao giờ truyền khóa này qua mạng.

Phương pháp này mang lại tính bảo mật được tăng cường đáng kể bởi vì một khóa riêng được tạo tốt (ví dụ: khóa RSA 4096-bit hoặc ED25519) thực tế là không thể đoán được. Hơn nữa, khóa riêng của bạn có thể được bảo vệ bằng một cụm mật khẩu mạnh (passphrase), thêm một lớp bảo vệ bổ sung. Nếu không sở hữu khóa riêng của bạn, không ai có thể đăng nhập, ngay cả khi họ bằng cách nào đó có được tên người dùng của bạn.

Fail2Ban: Người Gác Cổng Của Máy Chủ Bạn

Ngay cả khi đã triển khai xác thực khóa mạnh mẽ, các dịch vụ trên máy chủ của bạn vẫn sẽ đối mặt với các cuộc dò xét và cố gắng do thám. Fail2Ban là một ứng dụng phân tích log mã nguồn mở thông minh. Nó quét tỉ mỉ các tệp log hệ thống, chẳng hạn như /var/log/auth.log hoặc /var/log/secure, để tìm kiếm các hành vi độc hại lặp đi lặp lại như quá nhiều lần đăng nhập không thành công. Khi Fail2Ban phát hiện các mẫu này, nó sẽ tự động cập nhật các quy tắc tường lửa để chặn tạm thời hoặc vĩnh viễn địa chỉ IP vi phạm.

Hãy coi Fail2Ban là người gác cổng cảnh giác của máy chủ bạn. Nếu một người dùng trái phép cố gắng đột nhập quá nhiều lần—ví dụ, năm lần thử không thành công trong vòng mười phút—người gác cổng sẽ can thiệp. Nó ngay lập tức loại bỏ họ bằng cách chặn địa chỉ IP của họ trong một khoảng thời gian có thể cấu hình, thường là một giờ. Điều này làm giảm đáng kể bề mặt tấn công và giảm tải hệ thống do các nỗ lực đăng nhập không mong muốn liên tục.

Port Knocking: Mật Mã Bí Mật

Port knocking cung cấp một lớp bảo mật bổ sung thông qua sự ẩn danh. Đây là một cơ chế bí mật được thiết kế để giữ cho cổng SSH của bạn (mặc định là 22) bị ẩn và hoàn toàn vô hình đối với thế giới bên ngoài.

Cổng này vẫn đóng cho đến khi một chuỗi các nỗ lực kết nối cụ thể, thường được gọi là “gõ cửa” (knock), được thực hiện trên các cổng đã được xác định trước, vốn đang đóng. Chỉ sau khi nhận được chuỗi chính xác, được xác định trước, tường lửa mới tự động mở cổng SSH cho địa chỉ IP của máy khách đã gõ cửa, và chỉ trong một khoảng thời gian ngắn, có thể cấu hình được.

Cách tiếp cận này thêm một lớp ẩn danh mạnh mẽ. Nếu những kẻ tấn công không biết rằng cổng SSH của bạn đang lắng nghe, họ thậm chí không thể bắt đầu cố gắng tấn công. Nó giống như biết một mật khẩu bí mật để tiết lộ một lối vào ẩn: nếu bạn không biết nhịp điệu chính xác, bạn sẽ không bao giờ nghi ngờ có một cánh cửa tồn tại.

Thực Hành: Bảo Mật SSH Của Bạn

1. Triển Khai Xác Thực Khóa SSH

Hãy bắt đầu bằng cách tạo một cặp khóa SSH trên máy cục bộ của bạn. Nếu bạn đã có một cặp khóa, hãy bỏ qua và chuyển sang bước sao chép nó vào máy chủ của bạn.

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_my_server

Làm theo các hướng dẫn. Rất khuyến nghị sử dụng một cụm mật khẩu mạnh, duy nhất cho khóa riêng của bạn. Mặc dù RSA 4096 đủ mạnh, ED25519 cung cấp bảo mật tương đương với khóa ngắn hơn và hoạt động nhanh hơn, khiến nó trở thành một khuyến nghị hiện đại.

Bây giờ, hãy chuyển khóa công khai của bạn lên máy chủ. Nhớ thay thế useryour_server_ip bằng tên người dùng và địa chỉ IP thực của máy chủ của bạn.

ssh-copy-id user@your_server_ip

Nếu tiện ích ssh-copy-id không có sẵn trên hệ thống của bạn, bạn có thể thực hiện việc chuyển thủ công:

cat ~/.ssh/id_ed25519_my_server.pub | ssh user@your_server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Sau khi khóa của bạn được sao chép thành công, hãy xác minh việc đăng nhập:

ssh user@your_server_ip

Bây giờ bạn sẽ được yêu cầu nhập cụm mật khẩu của khóa (nếu bạn đã đặt), thay vì mật khẩu hệ thống của bạn.

Cuối cùng, tắt xác thực bằng mật khẩu trên máy chủ của bạn để chỉ cho phép truy cập bằng khóa, điều này tăng cường đáng kể bảo mật. Chỉnh sửa tệp cấu hình daemon SSH, thường nằm tại /etc/ssh/sshd_config.

sudo nano /etc/ssh/sshd_config

Tìm và sửa đổi (hoặc thêm) các dòng quan trọng này:

PasswordAuthentication no
ChallengeResponseAuthentication no
# UsePAM no  # Bỏ ghi chú dòng này một cách cẩn trọng; có thể ảnh hưởng đến các phương thức xác thực khác

Khởi động lại dịch vụ SSH để áp dụng các thay đổi:

sudo systemctl restart sshd

Cảnh báo Quan trọng: Hãy giữ phiên SSH *hiện tại* của bạn hoạt động cho đến khi bạn đã đăng nhập thành công bằng khóa mới cấu hình từ một cửa sổ terminal *riêng biệt*. Bước thiết yếu này giúp bạn tránh vô tình tự khóa mình khỏi máy chủ.

2. Cài Đặt và Cấu Hình Fail2Ban

Đầu tiên, cài đặt Fail2Ban trên máy chủ của bạn. Đối với các hệ thống dựa trên Debian/Ubuntu, hãy sử dụng:

sudo apt update
sudo apt install fail2ban

Đối với các hệ thống dựa trên CentOS/RHEL, hãy sử dụng:

sudo yum install epel-release
sudo yum install fail2ban

Tiếp theo, tạo một tệp cấu hình cục bộ. Điều này cho phép bạn ghi đè các cài đặt mặc định mà không cần trực tiếp sửa đổi cấu hình chính, giúp việc cập nhật trong tương lai dễ dàng hơn:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Trong jail.local, điều hướng đến phần [DEFAULT]. Tại đây, bạn có thể tinh chỉnh các tham số như bantime (xác định thời gian chặn một IP, tính bằng giây), findtime (khoảng thời gian để phát hiện các lần đăng nhập không thành công) và maxretry (số lần thất bại tối đa được phép trước khi bị chặn).

[DEFAULT]
bantime = 3600  ; 1 giờ
findtime = 600  ; 10 phút
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 your_trusted_ip_address/32

Đảm bảo jail của daemon SSH ([sshd]) được bật một cách rõ ràng:

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Cuối cùng, bật và khởi động dịch vụ Fail2Ban để kích hoạt các quy tắc mới của bạn:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Bạn có thể xác minh trạng thái hoạt động của nó bằng cách sử dụng các lệnh này:

sudo fail2ban-client status
sudo fail2ban-client status sshd

3. Triển Khai Port Knocking Với knockd

Port knocking cung cấp một lớp bảo mật bổ sung thông qua sự ẩn danh. Bắt đầu bằng cách cài đặt knockd:

sudo apt install knockd

Bây giờ, hãy chỉnh sửa tệp cấu hình chính nằm tại /etc/knockd.conf. Dưới đây là một ví dụ cấu hình để bạn bắt đầu:

sudo nano /etc/knockd.conf

Sửa đổi cấu hình mặc định để xác định chuỗi độc đáo và các hành động liên quan của bạn:

[options]
	UseSyslog

[openSSH]
	sequence = 7000,8000,9000
	seq_timeout = 5
	command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
	# Nếu sử dụng UFW, hãy cân nhắc thay thế bằng: /usr/sbin/ufw allow from %IP% to any port 22
	# tcpflags = syn # Thường hữu ích cho việc gõ cửa mạnh mẽ hơn; bỏ ghi chú nếu gặp sự cố

[closeSSH]
	sequence = 9000,8000,7000
	seq_timeout = 5
	command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j DROP
	# Nếu sử dụng UFW, hãy cân nhắc thay thế bằng: /usr/sbin/ufw delete allow from %IP% to any port 22
	# tcpflags = syn # Thường hữu ích cho việc gõ cửa mạnh mẽ hơn; bỏ ghi chú nếu gặp sự cố

Giải Thích Các Tham Số Chính:

  • sequence = 7000,8000,9000: Định nghĩa chuỗi “gõ cửa” bí mật, tùy chỉnh của bạn.
  • seq_timeout = 5: Bạn có 5 giây nghiêm ngặt để hoàn thành toàn bộ chuỗi gõ cửa.
  • command: Lệnh này tự động mở cổng 22 đặc biệt cho địa chỉ IP đã thực hiện đúng chuỗi gõ cửa.
  • closeSSH: Phần này định nghĩa một chuỗi đảo ngược để đóng cổng an toàn sau phiên làm việc của bạn.

Tiếp theo, cấu hình knockd để khởi chạy tự động khi hệ thống của bạn khởi động. Chỉnh sửa tệp /etc/default/knockd:

sudo nano /etc/default/knockd

Thay đổi dòng START_KNOCKD=0 thành START_KNOCKD=1.

Bây giờ, điều cần thiết là thiết lập tường lửa của bạn (ví dụ: UFW hoặc iptables) để chặn hoàn toàn cổng SSH (cổng 22) ban đầu. Đối với UFW, hãy sử dụng các lệnh này:

sudo ufw default deny incoming
sudo ufw enable

Biện Pháp Phòng Ngừa Quan Trọng: Trước khi bật knockd, hãy đảm bảo tuyệt đối rằng tường lửa của bạn được cấu hình để cho phép *tất cả các dịch vụ cần thiết khác* cho máy chủ của bạn. Ngoài ra, hãy xác nhận rằng cổng 22 bị chặn rõ ràng theo mặc định. Không làm như vậy có thể dẫn đến việc bạn bị khóa khỏi hệ thống.

Cuối cùng, khởi động dịch vụ knockd để kích hoạt port knocking:

sudo systemctl enable knockd
sudo systemctl start knockd

Để thiết lập kết nối từ máy khách của bạn, trước tiên bạn sẽ thực hiện “gõ cửa” bằng cách sử dụng một công cụ như nmap hoặc netcat. Nhớ thay thế your_server_ip bằng địa chỉ IP thực của máy chủ của bạn:

nmap -p 7000,8000,9000 --reason your_server_ip
ssh user@your_server_ip

Sau khi hoàn tất phiên SSH của bạn, một thực hành tốt là thực hiện thao tác gõ cửa đóng:

nmap -p 9000,8000,7000 --reason your_server_ip

Kết Luận: Một Môi Trường SSH An Toàn Hơn

Bảo mật quyền truy cập SSH của bạn không phải là một cấu hình một lần; đó là một cam kết liên tục. Bằng cách cẩn thận triển khai xác thực khóa SSH, triển khai một công cụ cảnh giác như Fail2Ban và xem xét các kỹ thuật nâng cao như port knocking, bạn có thể củng cố đáng kể máy chủ của mình chống lại các cuộc tấn công phổ biến và tinh vi.

Các thực hành này giảm đáng kể khả năng bị tấn công vét cạn và thiết lập nhiều lớp phòng thủ giúp việc truy cập trái phép trở nên khó khăn hơn đáng kể. Ưu tiên các biện pháp bảo mật mạnh mẽ này ngay từ đầu sẽ giúp bạn tránh vô số rắc rối tiềm ẩn và đảm bảo quyền truy cập từ xa của bạn luôn thực sự an toàn.

Share: