SSH (Secure Shell) là một giao thức phổ biến được sử dụng để quản lý và kết nối máy chủ từ xa một cách an toàn. Tuy nhiên, nếu không được cấu hình đúng cách, SSH có thể trở thành điểm yếu lớn khiến hệ thống dễ bị tấn công bởi các cuộc xâm nhập trái phép. Vì vậy, việc bảo mật SSH trên máy chủ Linux là một trong những nhiệm vụ quan trọng mà bất kỳ quản trị viên hệ thống nào cũng cần chú ý.
Trong bài viết này, chúng tôi sẽ hướng dẫn bạn các bước cần thiết để tăng cường bảo mật SSH trên máy chủ Linux, bao gồm việc thay đổi cổng mặc định, sử dụng xác thực bằng khóa SSH, tắt đăng nhập bằng tài khoản root, và áp dụng các biện pháp giới hạn truy cập. Những giải pháp này không chỉ giúp bảo vệ dữ liệu của bạn trước các nguy cơ bảo mật mà còn đảm bảo hiệu suất hoạt động ổn định của hệ thống. Hãy cùng khám phá để giữ cho máy chủ Linux của bạn luôn an toàn trước các mối đe dọa tiềm ẩn!

Về cơ bản
SSH được chia thành hai phần chính: phần máy chủ, gọi là sshd, chạy trên máy chủ mà bạn muốn truy cập, và phần khách, ssh, được sử dụng để kết nối tới máy chủ đó.
Thông thường, bạn sẽ sử dụng một SSH client từ laptop của mình để quản lý máy chủ.
Đối với người dùng Windows, một lựa chọn phổ biến là Putty, trong khi người dùng Mac có thể sử dụng terminal tích hợp sẵn.
Về mặt bảo mật, phần máy chủ của SSH là phần quan trọng nhất. Chính máy chủ quyết định các khía cạnh bảo mật quan trọng, chẳng hạn như có cho phép xác thực bằng mật khẩu hay không.
Các quyết định của máy chủ sẽ ghi đè lên bất kỳ sở thích nào được đặt bởi khách hàng.
Cài đặt SSH của máy chủ được tìm thấy trong tệp /etc/ssh/sshd_config.
Ở phía khách, bạn sẽ tìm thấy các cài đặt cấu hình trong tệp /etc/ssh/ssh_config cho các cài đặt toàn hệ thống, hoặc trong tệp ~/.ssh/config cho các cài đặt của người dùng cá nhân.
Các cài đặt này cũng có thể được điều chỉnh khi thực hiện kết nối bằng các tùy chọn dòng lệnh.
Hướng dẫn này sẽ tập trung chủ yếu vào phần máy chủ của SSH.
Các lưu ý quan trọng
Trước khi đi vào các mẹo để bảo mật SSH, điều quan trọng là phải nhớ rằng không phải mẹo nào cũng phù hợp với tất cả mọi người.
Hãy suy nghĩ cẩn thận về những điều chỉnh nào phù hợp với nhu cầu của máy chủ của bạn. Hãy chắc chắn rằng bạn thực sự hiểu từng mẹo và quyết định xem nó có phù hợp với cấu hình của bạn hay không.
Ví dụ, mặc dù việc vô hiệu hóa xác thực bằng mật khẩu là một thực hành bảo mật phổ biến, nhưng nó có thể giảm nhu cầu sử dụng các công cụ như Fail2ban.
Hãy nhớ rằng chúng ta đang làm việc với các cài đặt trong tệp /etc/ssh/sshd_config.
Trước khi thực hiện bất kỳ thay đổi nào, hãy sao lưu tệp gốc này để tránh bất kỳ gián đoạn không mong muốn nào.
Hầu hết các biến trong tệp này được chú thích mặc định. Hãy nhớ bỏ chú thích chúng khi thay đổi bất kỳ giá trị nào.
Ngoài ra, một số nhà cung cấp máy chủ có thể bao gồm các cấu hình tùy chỉnh trong thư mục /etc/ssh/sshd_config.d/.
Tôi khuyên bạn nên xem xét kỹ lưỡng các tệp này để đảm bảo tính tương thích với bất kỳ điều chỉnh nào mà bạn dự định thực hiện.
Cuối cùng, điều quan trọng là phải tải lại dịch vụ SSH thay vì khởi động lại nó. Việc tải lại giúp giảm nguy cơ mất kết nối và không thể kết nối lại.
Ngoài ra, hãy luôn sử dụng lệnh sudo sshd -t sau mỗi lần điều chỉnh và trước khi tải lại SSH. Điều này giúp đảm bảo cú pháp và tùy chọn là chính xác.
Cổng SSH
SSH thường chạy trên cổng 22, cổng này rất quen thuộc với tin tặc và có thể dẫn đến các cuộc tấn công brute-force.
Để giảm thiểu những cuộc tấn công này, tốt nhất nên thay đổi cổng mặc định sang một cổng ít phổ biến hơn.
Tìm biến Port trong tệp /etc/ssh/sshd_config, biến này mặc định được chú thích và được thiết lập là 22.
Bỏ chú thích nó và thay đổi giá trị sang một số khác, như sau:
Port 592
Điều quan trọng cần nhớ là sau khi thay đổi cổng SSH mặc định và tải lại SSH, bạn nên sử dụng tùy chọn -p theo sau là số cổng mới khi ssh vào máy chủ một lần nữa.
Kiểm soát truy cập
Cuộn xuống một chút, bạn sẽ tìm thấy ba biến này, đều được chú thích:
#LoginGraceTime 2m
#MaxAuthTries 6
#MaxSessions 10
Biến LoginGraceTime chỉ định thời gian mà người dùng có để hoàn thành quá trình xác thực. Trong khi giá trị mặc định được thiết lập là 2 phút, bạn có thể muốn giảm xuống một khoảng thời gian ngắn hơn, chẳng hạn như 20 giây.
Biến MaxAuthTries chỉ định số lần cố gắng đăng nhập tối đa mà người dùng được phép thực hiện. Giá trị mặc định cho phép lên đến 6 lần thử. Điều này có nghĩa là người dùng có thể cố gắng truy cập máy chủ tối đa 6 lần.
Sau khi thất bại tất cả các lần thử, họ sẽ bị chặn khỏi việc truy cập vào máy chủ. Bạn có thể xem xét giảm giới hạn này xuống, ví dụ như 3 lần thử.
Biến MaxSessions kiểm soát số lượng phiên đồng thời tối đa cho phép trên mỗi kết nối người dùng. Giá trị mặc định thường cho phép 10 phiên. Điều này có nghĩa là một người dùng có thể có tối đa 10 phiên SSH hoạt động cùng một lúc.
Nếu máy chủ của bạn không cần hỗ trợ nhiều phiên đồng thời, bạn có thể xem xét giảm con số này. Ví dụ, thiết lập nó thành 5 có thể hợp lý hơn.
LoginGraceTime 20
MaxAuthTries 3
MaxSessions 5
Đây là các giá trị mà tôi khuyên dùng cho ba biến này.
Ngăn chặn mật khẩu trống
Trên một máy chủ Linux, có thể tạo người dùng với mật khẩu trống, điều này không được khuyến nghị vì họ có thể truy cập vào máy chủ mà không cần xác thực.
Theo mặc định, SSH ngăn chặn người dùng có mật khẩu trống khỏi việc truy cập vào máy chủ, nhưng luôn tốt để kiểm tra lại.
Tìm biến PermitEmptyPasswords và đảm bảo nó được thiết lập thành no như sau:
#PermitEmptyPasswords no
Biến này mặc định được chú thích. Nếu nó đã được thiết lập thành no, bạn có thể để nguyên như vậy.
Thời gian chờ khi không hoạt động
Thời gian chờ khi không hoạt động xác định thời gian mà kết nối SSH vẫn hoạt động khi không có hoạt động của người dùng.
Chẳng hạn, nếu bạn ssh vào máy chủ và để terminal mở mà không có bất kỳ tương tác nào, điều này tạo ra một phiên không hoạt động, điều này có thể gây ra rủi ro bảo mật.
Vì vậy, tốt nhất nên thiết lập một khoảng thời gian chờ tự động đóng kết nối SSH nếu phiên trở nên không hoạt động.
Điều này có thể được cấu hình với các biến ClientAliveInterval và ClientAliveCountMax.
Biến ClientAliveInterval xác định thời gian tính bằng giây mà máy chủ chờ trước khi gửi một thông điệp kiểm tra đến khách hàng để giữ kết nối SSH sống.
Ví dụ, thiết lập nó thành 60 giây nghĩa là máy chủ kiểm tra mỗi 60 giây xem liệu khách hàng vẫn còn kết nối hay không.
Biến ClientAliveCountMax thiết lập số lượng thông điệp kiểm tra tối đa mà máy chủ có thể gửi mà không nhận được phản hồi trước khi kết thúc kết nối.
Ví dụ, nếu nó được thiết lập thành 3 và khách hàng không phản hồi ba thông điệp, máy chủ sẽ kết thúc phiên làm việc.
ClientAliveInterval 60
ClientAliveCountMax 3
Đây là các giá trị mà tôi khuyên dùng cho hai biến này.
Vì vậy, nếu một khách hàng không hoạt động trong 180 giây (3 lần kiểm tra, mỗi lần 60 giây), máy chủ sẽ kết thúc phiên SSH.
Rhosts
Rhosts, mặc dù hiện nay không còn phổ biến, trước đây là một phương pháp xác thực yếu hơn, dựa trên việc tin tưởng vào khách hàng dựa trên địa chỉ IP của họ mà thôi.
Theo mặc định, Rhosts thường bị vô hiệu hóa. Tuy nhiên, như tôi thường nhấn mạnh, tốt nhất nên kiểm tra lại.
Tìm biến IgnoreRhosts và đảm bảo nó được thiết lập thành yes như sau:
#IgnoreRhosts yes
Biến này mặc định được chú thích. Nếu nó đã được thiết lập thành yes, bạn có thể để nguyên như vậy.
Chuyển tiếp X11
Theo mặc định, SSH có thể chuyển tiếp các phiên X11, điều này có thể hữu ích cho một số ứng dụng đồ họa nhất định.
Trừ khi cần thiết, hãy vô hiệu hóa chuyển tiếp X11 trong SSH, vì giao thức X11 không chú trọng vào bảo mật.
Tìm biến X11Forwarding và thiết lập nó thành no như sau:
X11Forwarding no
Việc vô hiệu hóa các tính năng không cần thiết như chuyển tiếp X11 trong SSH có thể tăng cường bảo mật cho máy chủ của bạn rất nhiều.
Chuyển tiếp Agent và TCP
Chuyển tiếp agent SSH cho phép bạn sử dụng các khóa SSH của mình để di chuyển từ máy chủ này sang máy chủ khác mà không cần lưu trữ khóa trên máy chủ đầu tiên.
Nó giúp việc kết nối qua nhiều máy chủ dễ dàng hơn nhưng có thể rủi ro về mặt bảo mật.
Chuyển tiếp TCP SSH, còn được gọi là chuyển tiếp cổng, cho phép bạn chuyển hướng dữ liệu giữa máy tính cục bộ và máy tính từ xa của mình.
Vô hiệu hóa hai tính năng này nếu bạn không cần chúng để giảm thiểu bề mặt tấn công.
Tìm các biến AllowAgentForwarding và AllowTcpForwarding và thiết lập chúng thành no như sau:
AllowAgentForwarding no
AllowTcpForwarding no
Tôi khuyên bạn nên tắt chúng vì chúng thường được bật theo mặc định, trừ khi thật sự cần thiết cho nhu cầu cụ thể của bạn.
Truy cập Root
Khi bạn truy cập vào máy chủ lần đầu tiên, bạn có thể sử dụng người dùng root, nhưng điều này không được khuyến nghị.
Người dùng root có toàn quyền kiểm soát trên máy chủ và rất dễ gây hại khi thực hiện các lệnh với tư cách là root.
Sử dụng một người dùng không phải root an toàn hơn, vì nó yêu cầu tiền tố sudo cho các tác vụ quản trị và yêu cầu mật khẩu. Ngoài ra, việc chọn người dùng không phải root giúp bảo mật hơn chống lại các cuộc tấn công brute force.
Vì người dùng root là mặc định trên tất cả các máy chủ Linux, họ thường bị tấn công bởi những kẻ cố gắng đoán mật khẩu của bạn. Việc sử dụng người dùng không phải root có thể giúp giảm thiểu rủi ro này.
Do đó, tốt hơn hết là sử dụng một người dùng không phải root và hoàn toàn hạn chế quyền truy cập của người dùng root vào máy chủ.
Tìm biến PermitRootLogin, thường được chú thích theo mặc định và thay đổi giá trị của nó thành no như sau:
PermitRootLogin no
Bằng cách này, bạn chỉ có thể truy cập vào máy chủ bằng người dùng không phải root của mình, tên đăng nhập của họ không được công khai biết đến.
Xác thực mật khẩu
Việc truy cập vào máy chủ của bạn thường liên quan đến việc sử dụng mật khẩu với SSH. Nhưng một phương pháp an toàn hơn là xác thực bằng khóa SSH.
Phương pháp này sử dụng hai khóa: một khóa công khai trên máy chủ của bạn và một khóa riêng mà bạn giữ. Bạn sẽ nhận quyền truy cập khi máy chủ xác minh rằng bạn sở hữu khóa riêng đó.
Phương pháp này an toàn hơn so với việc chỉ sử dụng mật khẩu vì nó đảm bảo rằng chỉ những ai sở hữu khóa riêng mới có thể vào máy chủ.
Tìm biến PasswordAuthentication và đặt giá trị của nó thành no như sau:
PasswordAuthentication no
Bằng cách này, bạn đảm bảo rằng chỉ những khóa SSH mới có thể truy cập vào máy chủ.
Hãy luôn nhớ giữ an toàn khóa riêng của bạn.
Hạn chế truy cập SSH
Khi không phải mọi người dùng đều cần truy cập vào máy chủ, việc hạn chế quyền truy cập SSH chỉ cho một số ít người là một thực hành tốt.
Một phương pháp là tạo ra một nhóm, thêm những người dùng cần thiết vào nhóm đó và sau đó sử dụng tùy chọn AllowGroups để chỉ cho phép những người trong nhóm đó ssh vào máy chủ.
Tuy nhiên, phương pháp tôi thích hơn là sử dụng tùy chọn AllowUsers. Điều này cho phép tôi chỉ định chính xác những người dùng nào có thể SSH vào máy chủ.
Với AllowUsers, bạn đang cấp quyền truy cập cho một số người dùng nhất định trong khi từ chối quyền truy cập cho tất cả những người khác.
Nếu bạn muốn hạn chế quyền truy cập chỉ cho những người dùng được chọn thì hãy cuộn xuống cuối tệp và thêm tùy chọn AllowUsers theo sau là tên người dùng:
AllowUsers <user1> <user2> <user3>
Điều này đảm bảo rằng chỉ những người dùng đã chỉ định mới có thể truy cập vào máy chủ qua SSH.
Bạn cũng có thể hạn chế lưu lượng SSH chỉ đến một địa chỉ IP duy nhất và đáng tin cậy. Điều này có nghĩa rằng chỉ địa chỉ IP cụ thể đó mới có thể kết nối đến máy chủ của bạn bằng SSH.
Nếu bạn có địa chỉ IP cố định không thay đổi thì tôi rất khuyến khích làm điều này. Tuy nhiên, nếu nhà cung cấp dịch vụ Internet của bạn cấp phát địa chỉ IP động thay đổi theo thời gian thì điều này có thể không khả thi.
Để thiết lập điều này khá giống với những gì tôi đã giải thích trước đó về việc hạn chế quyền truy cập cho những người dùng cụ thể. Chỉ cần sử dụng tùy chọn AllowUsers như sau:
AllowUsers <user>@<ip_address>
Điều này đảm bảo rằng chỉ người dùng đã chỉ định từ địa chỉ IP cụ thể đó mới có thể kết nối qua SSH.
AllowUsers *@<ip_address>
Điều này hạn chế quyền truy cập đến địa chỉ IP đã chỉ định cho tất cả người dùng trên máy chủ.
Những thay đổi đơn giản này tạo thêm một lớp bảo mật bằng cách cho phép quyền truy cập SSH chỉ cho những người dùng đã được phê duyệt từ các địa chỉ IP cụ thể.
Tải lại SSH
Sau khi bạn đã thực hiện các thay đổi của mình, hãy đảm bảo tải lại dịch vụ SSH để áp dụng chúng.
Trước đó, bạn nên xác minh cấu hình để kiểm tra lỗi. Bạn có thể làm điều này bằng cách sử dụng lệnh sau:
sudo sshd -t
Sử dụng lệnh này để tải lại SSH:
sudo systemctl reload ssh
Khi dịch vụ đã được tải lại, các thay đổi của bạn sẽ có hiệu lực.
Bạn cũng có thể sử dụng lệnh sudo sshd -T để liệt kê tất cả các biến cùng với giá trị của chúng, giúp bạn kiểm tra xem liệu các thay đổi đã có hiệu lực hay chưa.
Kết luận
Bảo mật SSH là một yếu tố quan trọng giúp bảo vệ máy chủ Linux của bạn trước các mối đe dọa tiềm ẩn từ bên ngoài. Việc áp dụng những biện pháp như thay đổi cổng mặc định, vô hiệu hóa đăng nhập bằng mật khẩu, sử dụng khóa SSH, chặn IP nghi ngờ, và cài đặt tường lửa sẽ góp phần nâng cao đáng kể mức độ an toàn cho hệ thống. Ngoài ra, việc thường xuyên cập nhật phần mềm và theo dõi nhật ký hệ thống để phát hiện sớm các hành vi bất thường cũng rất cần thiết.
Không chỉ bảo vệ dữ liệu quan trọng, việc bảo mật SSH còn đảm bảo tính ổn định và hiệu suất của máy chủ trong môi trường làm việc. Đừng bao giờ xem nhẹ vấn đề này, bởi chỉ một sơ suất nhỏ cũng có thể dẫn đến hậu quả nghiêm trọng. Hãy tuân thủ các nguyên tắc bảo mật để tạo lá chắn vững chắc cho hệ thống của bạn.
Nếu bạn muốn máy chủ Linux hoạt động lâu dài và an toàn, việc đầu tư thời gian vào bảo mật SSH ngay từ đầu là quyết định đúng đắn. Thực hiện các bước trên sẽ mang lại hiệu quả bền vững và giảm thiểu rủi ro tối đa.









