Một máy chủ ảo (VPS) mới giống như một ngôi nhà vừa xây xong: vững chãi nhưng cửa chưa khóa. Việc bỏ qua các bước cấu hình bảo mật ban đầu có thể biến VPS của bạn thành mục tiêu cho các cuộc tấn công tự động, dẫn đến mất dữ liệu và ảnh hưởng nghiêm trọng đến uy tín. Chủ động bảo vệ là bước đi khôn ngoan nhất.
Bài viết này là một hướng dẫn chi tiết, từng bước một, giúp bạn xây dựng một pháo đài phòng thủ vững chắc. Chúng ta sẽ cùng nhau thực hiện hướng dẫn hardening VPS một cách bài bản, từ việc gia cố “cửa chính” SSH, dựng lên “tường rào” UFW và triển khai “hệ thống báo động” Fail2Ban để tạo nên một hệ thống bảo mật VPS Linux toàn diện.
Dù bạn là người mới làm quen với VPS hay đã có kinh nghiệm, hướng dẫn này đều sẽ cung cấp những giá trị thiết thực. Các bước được trình bày một cách logic và dễ hiểu, giúp bạn tự tin làm chủ và bảo vệ tài sản số của mình một cách hiệu quả nhất. Hãy cùng bắt đầu hành trình làm cứng cho máy chủ Linux của bạn.
Các bước bảo mật cơ bản ban đầu
Đây là những viên gạch nền móng đầu tiên. Việc thực hiện đúng và đủ các bước này sẽ giúp loại bỏ phần lớn các nguy cơ bảo mật phổ biến nhất, tạo tiền đề vững chắc cho các lớp phòng thủ chuyên sâu hơn mà chúng ta sẽ thiết lập ở các phần sau. Các bước này cũng là một phần quan trọng trong checklist tối ưu VPS Ubuntu ngay sau khi cài đặt.
Cập nhật hệ thống
Hành động đầu tiên và bắt buộc sau khi nhận VPS là cập nhật toàn bộ hệ thống. Các bản cập nhật chứa những bản vá cho các lỗ hổng bảo mật đã được phát hiện. Việc bỏ qua bước này cũng giống như bạn biết rõ điểm yếu của mình nhưng lại không làm gì để khắc phục nó.
Đối với các hệ điều hành phổ biến như Ubuntu hay Debian, bạn chỉ cần chạy một dòng lệnh duy nhất để cập nhật danh sách phần mềm, nâng cấp các gói đã cài và dọn dẹp những file không còn cần thiết.
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y
Tạo và sử dụng tài khoản Sudo User
Sử dụng tài khoản root
cho mọi tác vụ hàng ngày là cực kỳ nguy hiểm. Một lệnh gõ nhầm với quyền root
có thể xóa sổ toàn bộ dữ liệu của bạn mà không có bất kỳ cảnh báo nào. Nguyên tắc an toàn là hãy luôn làm việc trên một tài khoản người dùng thường.
Chúng ta sẽ tạo một người dùng mới và cấp cho người dùng đó quyền sudo
. Quyền này cho phép thực thi các lệnh quản trị khi cần bằng cách thêm sudo
ở phía trước. Điều này tạo ra một lớp an toàn, buộc bạn phải xác nhận lại ý định của mình.
Tạo người dùng mới (thay ten_nguoi_dung
bằng tên bạn muốn):
adduser ten_nguoi_dung
Thêm người dùng vừa tạo vào nhóm sudo
để cấp quyền quản trị:
usermod -aG sudo ten_nguoi_dung
Từ bây giờ, hãy đăng xuất khỏi root
và luôn đăng nhập bằng tài khoản mới này.
Tăng cường bảo mật cho cổng SSH (SSH Hardening)
Dịch vụ SSH là cửa ngõ chính để bạn truy cập và quản trị VPS. Đây cũng chính là mục tiêu mà các bot tấn công trên Internet nhắm đến đầu tiên và liên tục. Việc gia cố “cánh cửa” này là tối quan trọng, quyết định đến 80% sự an toàn của máy chủ.
Bước 1: Thiết lập xác thực bằng SSH Key
Mật khẩu dù mạnh đến đâu vẫn có thể bị bẻ khóa. SSH Key là phương thức xác thực vượt trội và an toàn hơn rất nhiều. Để đảm bảo an toàn và hiệu quả nhất, chúng ta sẽ sử dụng thuật toán khóa Ed25519. Đây là tiêu chuẩn hiện đại được khuyên dùng, nổi bật với hiệu suất cao, độ bảo mật vững chắc và khóa có độ dài ngắn gọn, dễ quản lý.
Trước tiên, hãy tạo cặp khóa trên máy tính cá nhân của bạn:
ssh-keygen -t ed25519 -C "[email protected]"
Sau đó, sao chép public key lên VPS. Cách dễ nhất là dùng lệnh ssh-copy-id
. Lệnh này sẽ tự động tạo file và thiết lập quyền chính xác trên máy chủ.
ssh-copy-id ten_nguoi_dung@DIA_CHI_IP_VPS
Lựa chọn thay thế cho ssh-copy-id
:
Nếu máy tính của bạn (ví dụ: Windows không có WSL) không có sẵn ssh-copy-id
, bạn có thể thực hiện thủ công bằng lệnh sau. Lệnh này sẽ tạo thư mục, file và thiết lập quyền truy cập nghiêm ngặt mà SSH yêu cầu.
cat ~/.ssh/id_ed25519.pub | ssh ten_nguoi_dung@DIA_CHI_IP_VPS "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Mẹo cho lập trình viên:
Nếu bạn lưu trữ public key trên GitHub hoặc GitLab, bạn có thể nhập chúng trực tiếp một cách nhanh chóng bằng lệnh ssh-import-id
.
# Thay the 'ten_github' bang username GitHub cua ban
ssh-import-id gh:ten_github
Bước 2: Cấu hình dịch vụ SSH
Khi đã chắc chắn có thể đăng nhập bằng SSH Key, chúng ta sẽ khóa chặt các cấu hình còn lại. Mở file cấu hình chính của SSH:
sudo nano /etc/ssh/sshd_config
Thực hiện các thay đổi sau để tăng cường bảo mật:
- Vô hiệu hóa đăng nhập của Root:
Việc đầu tiên là cấm hoàn toàn tài khoảnroot
đăng nhập qua SSH. Điều này buộc kẻ tấn công phải dò ra cả tên người dùng và mật khẩu của bạn, thay vì chỉ cần dò mật khẩu cho tài khoảnroot
đã biết trước.
PermitRootLogin no
- Thay đổi cổng mặc định:
Hầu hết các bot tấn công tự động đều quét cổng mặc định 22. Việc thay đổi cổng SSH sang một số khác (ví dụ: 2222, 4836) là một biện pháp “ẩn mình” hiệu quả. Nó giúp bạn tránh được phần lớn các cuộc tấn công brute-force tự động không chủ đích.
/etc/ssh/sshd_config
, tìm dòng #Port 22
. Bỏ dấu #
ở đầu và thay đổi số 22 thành một số cổng mà bạn muốn (ví dụ: 2222
).# Chọn một số cổng ngẫu nhiên trong khoảng 1024-65535
Port 2222
- Tắt hoàn toàn xác thực bằng mật khẩu:
Trong file/etc/ssh/sshd_config
, tìm và đổi giá trị của dòng sau thànhno
:
PasswordAuthentication no
LƯU Ý CHO VPS/CLOUD SERVER:
Trên các phiên bản Ubuntu mới, hệ thống cloud-init
có thể tạo ra một file cấu hình ghi đè. Sau khi sửa file trên, hãy kiểm tra thư mục /etc/ssh/sshd_config.d/
. Nếu có file như 50-cloud-init.conf
chứa PasswordAuthentication yes
, bạn bắt buộc phải đổi nó thành no
trong file đó, vì nó sẽ ghi đè lên cài đặt chính của bạn.
Bước 3: Áp dụng thay đổi một cách an toàn
Trước khi khởi động lại dịch vụ SSH, hãy luôn kiểm tra cú pháp file cấu hình để đảm bảo không có lỗi. Bước này cực kỳ quan trọng để tránh bị khóa khỏi máy chủ.
sudo sshd -t
Nếu lệnh trên không báo lỗi, bạn có thể an toàn khởi động lại dịch vụ SSH:
sudo systemctl restart sshd
Cảnh báo: Sau bước này, phiên kết nối SSH hiện tại của bạn vẫn hoạt động. Hãy mở một cửa sổ dòng lệnh mới và thử kết nối lại bằng cổng mới và người dùng mới để chắc chắn mọi thứ hoạt động chính xác trước khi bạn đóng phiên làm việc cũ.
Hướng dẫn cấu hình tường lửa UFW
Nếu SSH là cửa chính của ngôi nhà, thì tường lửa (firewall) chính là hàng rào và các bức tường bao quanh. Nó kiểm soát tất cả các kết nối mạng đi vào và đi ra khỏi VPS của bạn, chỉ cho phép những truy cập hợp lệ mà bạn đã định sẵn.
Giới thiệu về UFW
UFW, viết tắt của Uncomplicated Firewall, là một giao diện quản lý tường lửa được thiết kế để đơn giản hóa công việc phức tạp của iptables
. Đúng như tên gọi, UFW giúp việc cấu hình tường lửa trở nên cực kỳ dễ dàng, ngay cả với người mới bắt đầu, mà vẫn đảm bảo hiệu quả bảo mật mạnh mẽ.
Trên hầu hết các bản phân phối dựa trên Debian như Ubuntu, UFW thường đã được cài đặt sẵn. Bạn có thể kiểm tra và cài đặt (nếu cần) bằng lệnh sau:
sudo apt install ufw
Nếu muốn tìm hiểu sâu hơn về mọi tùy chọn hoặc xem hướng dẫn chi tiết riêng cho một phiên bản cụ thể, bạn có thể tham khảo bài viết cách cài đặt và thiết lập tường lửa UFW trên Debian 11.
Trước khi kích hoạt UFW, chúng ta cần thiết lập các quy tắc cơ bản để đảm bảo không tự khóa mình ở bên ngoài.
Cấu hình các quy tắc (Rules) cơ bản
Nguyên tắc vàng của tường lửa là “chặn tất cả, chỉ cho phép những gì cần thiết”. Chúng ta sẽ thiết lập chính sách mặc định để từ chối mọi kết nối đến và cho phép mọi kết nối đi ra.
sudo ufw default deny incoming
sudo ufw default allow outgoing
Tiếp theo, chúng ta phải mở những cổng dịch vụ cần thiết. Quan trọng nhất là cổng SSH mới mà bạn đã đổi (ví dụ: 2222).
sudo ufw allow 2222/tcp
Nếu bạn có một trang web, bạn cần mở cổng cho HTTP (80) và HTTPS (443):
sudo ufw allow http
sudo ufw allow https
Bây giờ, khi các quy tắc quan trọng đã được thiết lập, chúng ta có thể kích hoạt UFW. Hệ thống sẽ cảnh báo rằng việc này có thể làm gián đoạn kết nối, hãy nhập y
và nhấn Enter để xác nhận.
sudo ufw enable
Cuối cùng, hãy kiểm tra trạng thái của tường lửa để xem các quy tắc của bạn với thông tin chi tiết:
sudo ufw status verbose
Quản lý và giám sát UFW
Để quản lý các quy tắc hiệu quả hơn, bạn có thể xem chúng theo số thứ tự:
sudo ufw status numbered
Ví dụ output:
Status: active
To Action From
-- ------ ----
[ 1] 2222/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 2222/tcp (v6) ALLOW IN Anywhere (v6)
[ 5] 80/tcp (v6) ALLOW IN Anywhere (v6)
[ 6] 443/tcp (v6) ALLOW IN Anywhere (v6)
Việc này giúp bạn dễ dàng xóa một quy tắc cụ thể khi cần bằng số thứ tự của nó:
sudo ufw delete 2
Để tăng cường bảo mật, bạn có thể giới hạn truy cập SSH chỉ từ một địa chỉ IP đáng tin cậy (ví dụ: IP nhà hoặc văn phòng của bạn):
sudo ufw allow from 203.0.113.10 to any port 2222
Đồng thời, hãy bật tính năng ghi log của UFW. Việc này rất quan trọng để giám sát các nỗ lực kết nối bị từ chối và phát hiện sớm các hành vi đáng ngờ.
sudo ufw logging on
Cài đặt Fail2Ban để chống tấn công Brute-Force
Chúng ta đã có tường rào UFW, nhưng vẫn có những kẻ cố gắng trèo rào hoặc phá khóa. Có thể hình dung Fail2Ban như một hệ thống báo động tự động. Nó sẽ theo dõi nhật ký hệ thống, phát hiện các hành vi đáng ngờ và tự động hành động để vô hiệu hóa kẻ tấn công.
Cần lưu ý rằng, Fail2Ban là một lớp phòng thủ phản ứng hiệu quả, giúp giảm đáng kể các cuộc tấn công tự động. Tuy nhiên, nó không thể thay thế cho các biện pháp xác thực mạnh như SSH Key đã được cấu hình ở trên.
Fail2Ban hoạt động như thế nào?
Fail2Ban liên tục quét các file log của các dịch vụ (như SSH, Nginx, Apache). Khi nó phát hiện một địa chỉ IP nào đó cố gắng đăng nhập sai mật khẩu quá nhiều lần trong một khoảng thời gian ngắn, nó sẽ tự động cập nhật quy tắc của tường lửa (UFW) để chặn IP đó trong một thời gian nhất định.
Để khám phá tất cả các tùy chọn cấu hình nâng cao của công cụ này, bạn có thể xem qua hướng dẫn cài đặt Fail2Ban để bảo mật máy chủ Linux của chúng tôi.
Cài đặt và tùy chỉnh
Việc cài đặt Fail2Ban rất đơn giản. Gói phần mềm này có sẵn trong kho lưu trữ mặc định của Ubuntu/Debian.
sudo apt install fail2ban -y
Bạn có thể xác nhận cài đặt thành công và xem phiên bản đang sử dụng bằng lệnh:
sudo fail2ban-client version
Chúng ta không nên sửa file cấu hình mặc định. Thay vào đó, hãy tạo một file .local
mới để ghi đè các thiết lập. Việc tạo file .local
riêng biệt là phương pháp hay nhất (best practice), giúp đảm bảo các tùy chỉnh của bạn không bị ghi đè khi phần mềm được cập nhật.
sudo nano /etc/fail2ban/jail.local
Dán nội dung sau vào file. File này sẽ kích hoạt bảo vệ cho SSH, trỏ đến cổng mới của bạn và đặt ra các giới hạn hợp lý.
[sshd]
enabled = true
port = 2222
bantime = 1d
maxretry = 3
bantime = 1d
: Chặn một IP trong vòng 1 ngày.maxretry = 3
: Chặn sau 3 lần thử sai.
Khởi động lại Fail2Ban để áp dụng cấu hình:
sudo systemctl restart fail2ban
Bạn có thể kiểm tra trạng thái của jail sshd
hoặc xem tất cả các jail đang hoạt động:
sudo fail2ban-client status sshd
sudo fail2ban-client status
Các bước bảo mật nâng cao
Bảo mật là một quá trình liên tục, không phải là một hành động chỉ làm một lần. Để duy trì sự an toàn lâu dài, bạn nên xem xét các bước nâng cao sau:
Kiểm tra & giám sát với Lynis
Lynis là một công cụ kiểm toán bảo mật cực kỳ mạnh mẽ. Việc sử dụng nó là một phần quan trọng của quy trình đánh giá lỗ hổng bảo mật trên VPS Linux định kỳ. Nó vượt trội hơn các công cụ quét mạng vì nó kiểm tra từ bên trong hệ thống (host-based), cho kết quả sâu hơn và không làm nhiễu loạn log. Nó sẽ quét và đưa ra các đề xuất cụ thể để bạn tiếp tục làm cứng hệ thống.
sudo apt install lynis -y
sudo lynis audit system
Sau khi quá trình quét hoàn tất, bạn sẽ thấy một báo cáo tóm tắt tương tự như sau. Hãy đặc biệt chú ý đến chỉ số Hardening index và các mục Warnings hoặc Suggestions.
-[ Lynis 3.0.9 Results ]-
Hardening index : [65]
Tests performed : 272
Plugins enabled : 2
-[ Warnings ]-
* Found a form of password hashing that is considered to be weak [AUTH-9328]
* SSH option 'PermitRootLogin' is not set to 'no' or 'without-password' [SSH-7408]
-[ Suggestions ]-
* Consider hardening system services [SERV-9628]
* Check kernel hardening options [KRNL-5820]
---------------------------------------------------
Kết quả chi tiết được lưu trong file /var/log/lynis.log
để bạn phân tích sau.
Thiết lập sao lưu (Backup) tự động
Mọi biện pháp bảo mật đều có thể thất bại. Một chiến lược sao lưu tự động và đáng tin cậy là lớp bảo vệ cuối cùng và quan trọng nhất cho dữ liệu của bạn. Hãy đảm bảo bạn có lịch trình sao lưu định kỳ và lưu các bản sao lưu đó ở một nơi an toàn, tách biệt khỏi VPS chính.
Theo dõi Log hệ thống
Thường xuyên kiểm tra các file log trong /var/log
(đặc biệt là auth.log
và fail2ban.log
) sẽ giúp bạn nhận biết các hoạt động bất thường hoặc các cuộc tấn công đang diễn ra, ngay cả khi chúng chưa thành công.
Xác thực hai yếu tố (2FA)
Đối với những ai có nhu cầu bảo mật cao nhất, việc kích hoạt Xác thực hai yếu tố (2FA) cho SSH là lớp phòng thủ cuối cùng. Điều này yêu cầu một yếu tố thứ hai (ngoài SSH Key) để đăng nhập, chẳng hạn như khóa bảo mật vật lý (FIDO/U2F) hoặc mã từ ứng dụng xác thực (TOTP).
Việc thiết lập 2FA là một chủ đề nâng cao, nhưng nó gần như khiến việc truy cập trái phép vào SSH là bất khả thi.
Kết luận
Chúc mừng bạn! Bằng cách hoàn thành các bước trên, bạn đã nâng cấp đáng kể tình trạng bảo mật VPS Linux của mình. Từ một hệ thống mở, giờ đây VPS của bạn đã được trang bị một hệ thống phòng thủ nhiều lớp, vững chắc, có khả năng chống lại hầu hết các cuộc tấn công tự động phổ biến. Đây là nền tảng an toàn để bạn tự tin triển khai các dự án của mình.
Bảo vệ tài sản số của bạn là một khoản đầu tư xứng đáng. Đừng chần chừ, hãy áp dụng những hướng dẫn này ngay hôm nay để biến VPS của bạn thành một pháo đài vững chắc. Nếu bạn gặp khó khăn hoặc muốn tìm hiểu các giải pháp bảo mật nâng cao hơn, đừng ngần ngại liên hệ với nhà cung cấp VPS của bạn để được hỗ trợ.
Tài liệu tham khảo
- Tài liệu chính thức của UFW: Ubuntu Community Help Wiki – UFW
- Tài liệu chính thức của Fail2Ban: Fail2Ban Documentation
- Tài liệu chính thức về SSH của Ubuntu: Ubuntu Server Guide – Secure Shell
- Trang chủ dự án Lynis: CISOfy – Lynis