Bảo Mật SSH: Giới Hạn Truy Cập Theo Địa Chỉ IP
Giới Thiệu
Giao thức Secure Shell (SSH) là xương sống cho việc quản lý máy chủ từ xa. Tuy nhiên, việc mở cổng SSH (thường là cổng 22) ra Internet tiềm ẩn nhiều rủi ro bảo mật, khiến máy chủ của bạn trở thành mục tiêu của các cuộc tấn công dò mật khẩu (brute-force) và các hành vi độc hại khác. Một trong những biện pháp hiệu quả nhất để giảm thiểu rủi ro này là giới hạn quyền truy cập SSH chỉ từ các địa chỉ IP đáng tin cậy. Bằng cách này, bạn có thể kiểm soát chặt chẽ ai có thể kết nối đến máy chủ của mình, tăng cường đáng kể lớp bảo mật đầu tiên.
Trong bài hướng dẫn này, chúng ta sẽ tìm hiểu cách cấu hình giới hạn truy cập SSH theo địa chỉ IP bằng các công cụ phổ biến trên Linux.
📋 Thời gian: 15 phút | Độ khó: Cơ bản
Yêu Cầu
Để thực hiện theo hướng dẫn này, bạn cần:
- Một máy chủ Linux (Ubuntu, Debian, CentOS, RHEL, Fedora, v.v.) có cài đặt dịch vụ OpenSSH.
- Quyền truy cập root hoặc người dùng có quyền
sudotrên máy chủ. - Địa chỉ IP công cộng của máy tính bạn sẽ dùng để truy cập SSH.
- Kiến thức cơ bản về dòng lệnh Linux.
Các Bước Thực Hiện
Bước 1: Xác Định Địa Chỉ IP Của Bạn Và Cổng SSH
Trước khi thực hiện bất kỳ thay đổi nào, bạn cần biết địa chỉ IP mà bạn sẽ sử dụng để kết nối đến máy chủ. Bạn có thể tìm địa chỉ IP công cộng của mình bằng cách truy cập các trang web như whatismyip.com hoặc sử dụng lệnh sau trên máy client:
# Trên máy client của bạn
curl ifconfig.me
# Hoặc
dig +short myip.opendns.com @resolver1.opendns.com
Tiếp theo, hãy chắc chắn bạn biết cổng SSH đang chạy trên máy chủ của bạn (mặc định là 22). Bạn có thể kiểm tra trong file cấu hình SSH:
# Trên máy chủ
grep Port /etc/ssh/sshd_config
Nếu không có dòng Port, mặc định là 22.
Bước 2: Giới Hạn Truy Cập Bằng Firewall (Khuyến nghị)
Sử dụng firewall là phương pháp được khuyến nghị nhất để giới hạn truy cập SSH vì nó chặn kết nối ở cấp độ mạng trước khi chúng đến được dịch vụ SSH. Chúng ta sẽ xem xét hai firewall phổ biến: UFW (cho Debian/Ubuntu) và Firewalld (cho CentOS/RHEL/Fedora).
2.1: Sử dụng UFW (Uncomplicated Firewall - cho Debian/Ubuntu)
UFW là một giao diện đơn giản cho iptables, rất dễ sử dụng.
-
Cài đặt UFW (nếu chưa có):
sudo apt update
sudo apt install ufw -y -
Kiểm tra trạng thái UFW:
sudo ufw status verboseNếu UFW đang hoạt động và có các quy tắc chặn mọi thứ, hãy đảm bảo bạn cho phép cổng SSH trước khi bật nó để tránh bị khóa.
-
Cho phép truy cập SSH từ địa chỉ IP cụ thể: Thay thế
YOUR_IP_ADDRESSbằng địa chỉ IP bạn đã xác định ở Bước 1. Nếu bạn có nhiều IP, hãy lặp lại lệnh này cho từng IP.sudo ufw allow from YOUR_IP_ADDRESS to any port 22
# Ví dụ: sudo ufw allow from 203.0.113.42 to any port 22Nếu bạn sử dụng cổng SSH khác (ví dụ: 2222), hãy thay
port 22bằngport 2222. -
Từ chối tất cả các truy cập SSH khác: Quy tắc này sẽ từ chối tất cả các kết nối đến cổng 22 (hoặc cổng SSH tùy chỉnh của bạn) mà không khớp với các quy tắc
allowtrước đó.sudo ufw deny any to any port 22
# Nếu bạn dùng cổng khác: sudo ufw deny any to any port 2222⚠️ Quan trọng: Đảm bảo bạn đã thêm địa chỉ IP của mình vào danh sách cho phép trước khi thêm quy tắc từ chối chung này.
-
Kích hoạt UFW (nếu chưa hoạt động):
sudo ufw enableBạn sẽ được hỏi để xác nhận. Gõ
yvà nhấn Enter. ✅ Thành công: UFW hiện đã được kích hoạt và chỉ cho phép SSH từ địa chỉ IP của bạn. -
Kiểm tra lại quy tắc:
sudo ufw status verboseBạn sẽ thấy các quy tắc
ALLOWtừ IP của bạn vàDENYcho tất cả các IP khác trên cổng SSH.
2.2: Sử dụng Firewalld (cho CentOS/RHEL/Fedora)
Firewalld là firewall mặc định trên các hệ thống dựa trên RHEL.
-
Kiểm tra trạng thái Firewalld:
sudo systemctl status firewalldNếu nó không chạy, hãy khởi động nó:
sudo systemctl start firewalldvàsudo systemctl enable firewalld. -
Cho phép truy cập SSH từ địa chỉ IP cụ thể: Thay thế
YOUR_IP_ADDRESSbằng địa chỉ IP của bạn.sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="YOUR_IP_ADDRESS" port port="22" protocol="tcp" accept'
# Ví dụ: sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.42" port port="22" protocol="tcp" accept'Nếu bạn dùng cổng SSH khác, thay
port="22"bằng cổng của bạn. -
Xóa dịch vụ SSH mặc định (để từ chối các IP khác): Nếu dịch vụ
sshđã được cho phép cho tất cả các nguồn, bạn cần xóa nó để quy tắc rich-rule của bạn có hiệu lực.sudo firewall-cmd --permanent --remove-service=sshNếu bạn muốn chặn tất cả các cổng 22 không được chỉ định, bạn có thể cần cấu hình thêm hoặc đảm bảo không có quy tắc chung nào cho phép SSH.
rich-rulesẽ ưu tiên nếu nó cụ thể hơn. -
Tải lại Firewalld để áp dụng thay đổi:
sudo firewall-cmd --reload✅ Thành công: Firewalld hiện đã được cấu hình để chỉ cho phép SSH từ địa chỉ IP của bạn.
-
Kiểm tra lại quy tắc:
sudo firewall-cmd --list-all
Bước 3: Giới Hạn Truy Cập Bằng TCP Wrappers (Phương pháp thay thế/bổ sung)
TCP Wrappers là một hệ thống kiểm soát truy cập dựa trên máy chủ, sử dụng các tệp /etc/hosts.allow và /etc/hosts.deny. Đây là một phương pháp cũ hơn nhưng vẫn có hiệu quả và có thể được sử dụng bổ sung cho firewall.
-
Chỉnh sửa
/etc/hosts.allow: Mở tệp này bằng trình soạn thảo văn bản yêu thích của bạn (ví dụ:nanohoặcvi).sudo nano /etc/hosts.allowThêm dòng sau vào cuối tệp, thay thế
YOUR_IP_ADDRESSbằng địa chỉ IP của bạn. Bạn có thể liệt kê nhiều IP cách nhau bằng dấu cách hoặc thêm nhiều dòng.sshd: YOUR_IP_ADDRESS
# Ví dụ: sshd: 203.0.113.42 192.168.1.0/24sshdlà tên dịch vụ mà chúng ta muốn kiểm soát. -
Chỉnh sửa
/etc/hosts.deny: Mở tệp này:sudo nano /etc/hosts.denyThêm dòng sau để từ chối tất cả các kết nối SSH khác:
sshd: ALLDòng này có nghĩa là "từ chối tất cả các kết nối đến dịch vụ
sshd". TCP Wrappers sẽ kiểm tra/etc/hosts.allowtrước, nếu tìm thấy một quy tắc cho phép, nó sẽ bỏ qua/etc/hosts.deny. -
Lưu và thoát khỏi trình soạn thảo. Không cần khởi động lại dịch vụ SSH, TCP Wrappers sẽ kiểm tra các tệp này mỗi khi có yêu cầu kết nối.
💡 Mẹo: TCP Wrappers hoạt động theo thứ tự: hosts.allow được kiểm tra trước. Nếu tìm thấy một quy tắc phù hợp cho phép truy cập, kết nối sẽ được chấp nhận. Nếu không tìm thấy, hosts.deny sẽ được kiểm tra. Nếu tìm thấy một quy tắc từ chối phù hợp, kết nối sẽ bị từ chối. Nếu không tìm thấy quy tắc nào trong cả hai tệp, quyền truy cập sư� được cho phép (trừ khi dịch vụ được cấu hình khác).
Troubleshooting
- ⚠️ Bị khóa khỏi máy chủ: Đây là lỗi phổ biến nhất khi cấu hình firewall. Luôn luôn có một phiên SSH thứ hai đang mở hoặc sử dụng console ảo nếu có thể khi thực hiện các thay đổi về firewall. Nếu bạn bị khóa, bạn sẽ cần truy cập máy chủ qua console vật lý hoặc bảng điều khiển ảo của nhà cung cấp dịch vụ cloud để sửa lỗi firewall.
- Quy tắc không hoạt động:
- Kiểm tra lại cú pháp của các lệnh firewall hoặc nội dung tệp cấu hình (
hosts.allow,hosts.deny). - Đảm bảo bạn đã tải lại hoặc kích hoạt firewall sau khi thay đổi.
- Kiểm tra xem có quy tắc nào khác đang ghi đè quy tắc của bạn không (ví dụ: một quy tắc cho phép rộng hơn).
- Kiểm tra log của firewall (
sudo journalctl -u ufwhoặcsudo journalctl -u firewalld) để xem các kết nối bị chặn hay cho phép.
- Kiểm tra lại cú pháp của các lệnh firewall hoặc nội dung tệp cấu hình (
- Lỗi cú pháp trong
/etc/hosts.allowhoặc/etc/hosts.deny: Một lỗi nhỏ có thể khiến TCP Wrappers không hoạt động như mong đợi. Đảm bảo không có khoảng trắng thừa hoặc ký tự đặc biệt không mong muốn. - Dịch vụ SSH không chạy: Đảm bảo dịch vụ
sshdđang chạy:sudo systemctl status sshd.
Kết Luận
Giới hạn truy cập SSH theo địa chỉ IP là một bước quan trọng và tương đối đơn giản để tăng cường bảo mật cho máy chủ Linux của bạn. Bằng cách chỉ cho phép các địa chỉ IP đã biết và đáng tin cậy kết nối, bạn giảm đáng kể bề mặt tấn công và bảo vệ máy chủ khỏi các mối đe dọa phổ biến.
✅ Best practices:
- Kết hợp các lớp bảo mật: Ngoài việc giới hạn IP, hãy luôn sử dụng xác thực bằng khóa SSH thay vì mật khẩu, vô hiệu hóa đăng nhập root trực tiếp và thay đổi cổng SSH mặc định (từ 22 sang một cổng khác cao hơn).
- Theo dõi log: Thường xuyên kiểm tra log SSH (
/var/log/auth.logtrên Debian/Ubuntu hoặc/var/log/securetrên CentOS/RHEL) để phát hiện các nỗ lực truy cập trái phép. - Kiểm tra định kỳ: Định kỳ xem xét lại các quy tắc firewall và TCP Wrappers của bạn để đảm bảo chúng vẫn phù hợp với nhu cầu bảo mật hiện tại.
- Đừng quên địa chỉ IP động: Nếu địa chỉ IP của bạn thay đổi thường xuyên, bạn sẽ cần cập nhật các quy tắc firewall/TCP Wrappers. Cân nhắc sử dụng VPN hoặc một dải IP rộng hơn (nếu an toàn) nếu bạn có nhiều vị trí truy cập.