Một số cách bảo mật SSH hữu ích và hiệu quả
18 tháng 7, 2023 bởi
Một số cách bảo mật SSH hữu ích và hiệu quả
iTricks
| Chưa có bình luận

Dịch vụ SSH (Secure Shell) là một giao thức mạng được sử dụng để thiết lập kết nối an toàn và mã hóa giữa hai máy tính từ xa. Nó cung cấp một phương thức bảo mật để truy cập và điều khiển máy chủ từ xa, cho phép người dùng thực hiện các tác vụ quản trị hệ thống và truyền tải dữ liệu một cách an toàn qua mạng.

SSH sử dụng mã hóa để bảo vệ dữ liệu khi được truyền qua mạng, đồng thời cung cấp các cơ chế xác thực để đảm bảo rằng chỉ người dùng có quyền truy cập mới có thể kết nối và thực hiện các hoạt động trên máy chủ từ xa.

Dịch vụ SSH bao gồm hai thành phần chính: máy chủ SSH (SSH server) và máy khách SSH (SSH client). Máy chủ SSH chạy trên máy chủ được quản lý, trong khi máy khách SSH chạy trên máy tính của người dùng muốn truy cập vào máy chủ từ xa.

SSH là một công cụ quan trọng trong việc quản lý hệ thống và bảo mật mạng. Nó cho phép quản trị viên từ xa truy cập vào máy chủ mà không cần có mặt vật lý tại địa điểm đó, đồng thời cung cấp một phương thức bảo mật cao để truyền tải dữ liệu qua mạng công cộng một cách an toàn.

0. Một số file cấu hình của dịch vụ OpenSSH trên Linux mà bạn cần lưu ý:

Dịch vụ OpenSSH trên Linux có một số tệp cấu hình quan trọng. Dưới đây là một số tệp cấu hình chính và vai trò của chúng:

  1.  `/etc/ssh/sshd_config`: Đây là tệp cấu hình chính của máy chủ SSH. Nó chứa các cài đặt và tùy chọn liên quan đến cấu hình máy chủ SSH như cổng dịch vụ, phương thức xác thực, giới hạn đăng nhập, chứng chỉ SSH, chuyển tiếp cổng và nhiều hơn nữa. Quản trị viên thường chỉnh sửa tệp này để tùy chỉnh cấu hình máy chủ SSH.
  2.  `/etc/ssh/ssh_config`: Đây là tệp cấu hình cho máy khách SSH. Nó chứa các cài đặt và tùy chọn liên quan đến cấu hình máy khách SSH như cách xác thực, giới hạn thời gian kết nối, tuỳ chọn proxy và nhiều hơn nữa. Tệp này được sử dụng để tùy chỉnh cấu hình của máy khách SSH.
  3. `/etc/ssh/ssh_host_*_key`: Đây là tệp khóa riêng tư của máy chủ SSH. Mỗi tệp tương ứng với một thuật toán mã hóa cụ thể như RSA, DSA hoặc ECDSA. Các tệp khóa này là các khóa mã hóa được sử dụng để xác thực và bảo mật kết nối SSH.
  4. `/etc/ssh/ssh_known_hosts` và `~/.ssh/known_hosts`: Đây là các tệp danh sách máy chủ được tin cậy mà máy khách SSH đã kết nối trước đây. Chúng chứa thông tin về khóa công khai của máy chủ và được sử dụng để kiểm tra tính toàn vẹn của máy chủ khi kết nối.
  5. `~/.ssh/config`: Đây là tệp cấu hình cục bộ cho máy khách SSH, chỉ áp dụng cho người dùng hiện tại. Bạn có thể tùy chỉnh cài đặt như tên máy chủ, người dùng, cổng, khóa SSH và các tuỳ chọn khác.
  6. /etc/nologin : nếu file này tồn tại, thì dịch vụ sẽ từ chối kết nối đăng nhập từ các user khác trên hệ thống ngoại trừ user root. File này thường dùng trong trường hợp khẩn cấp cần cách lý sớm hệ thống.

Lưu ý rằng các đường dẫn và tên tệp cụ thể có thể thay đổi tùy thuộc vào phiên bản Linux và cấu hình cụ thể của hệ thống.

1. Chỉ sử dụng giao thức SSH phiên bản 2

Giao thức SSH phiên bản 1 (SSH-1) cho tới bây giờ đã không còn an toàn do tồn tại những lổ hổng bảo mật như bị tấn công “man-in-the-middle”. Vì vậy hãy chỉ sử dụng giao thức SSH phiên bản 2 . Hiện tại mặc định dịch vụ SSH đã kích hoạt phiên bản “2”, nhưng trên 1 số OS cũ thì vẫn còn hỗ trợ cả 1 và 2.

Code Snippet

Terminal Code

Copy code
      
Protocol 2
      
    


2. Không sử dụng mật khẩu rỗng

Bạn cần cấu hình không cho phép các đăng nhập SSH vào hệ thống được sử dụng mật khẩu rổng, điều này là cực kì nguy hiểm.

Code Snippet

Terminal Code

Copy code
      
PermitEmptyPasswords no
      
    


3. Thay đổi cổng SSH mặc định (port 22)

Dịch vụ SSH mặc định chạy cổng 22 do đây là quy định tiêu chuẩn chung của thế giới. Vì là port phổ biến, nên rất dễ bị kẻ xấu thực hiện các hoạt động dò tìm mật khẩu tự động đăng nhập SSH vào hệ thống của bạn. Vì vậy bạn có thể thay đổi port kết nối SSH đến VPS/Cloud Server của bạn.

Code Snippet

Terminal Code

Copy code
      
Port 8088
      
    

Nếu hệ thống Linux của bạn có nhiều hơn 1 địa chỉ IP thì tốt nhất nên chỉ định rõ địa chỉ IP nào sẽ lắng nghe port dịch vụ SSH lắng nghe kết nối tới. Điều này sẽ tốt hơn việc bạn để dịch vụ SSH mở trên toàn bộ địa chỉ IP đang hoạt động của hệ thống.

Code Snippet

Terminal Code

Copy code
      
ListenAddress 192.168.1.123
      
    


4. Không cho đăng nhập bằng user root

Chúng ta sẽ không cho phép đăng nhập bằng user root của hệ thống. Để cấu hình không cho user root đăng nhập SSH ta làm như sau :

Code Snippet

Terminal Code

Copy code
      
PermitRootLogin no
      
    


5. Tắt chức năng đăng nhập của file ~/.rhosts

Đây là tính năng hỗ trợ đăng nhập “rlogin ” qua port 22, hình thức đăng nhập này đã cũ và tồn tại nhiều rủi ro bảo mật. Nếu thông tin host và user được chỉ định cấu hình theo format cụ thể trong file ~/.rhosts thì các user trong file này sẽ được phép đăng nhập vào hệ thống Linux mà không cần phải cung cấp thông tin mật khẩu. Vậy nên hãy tắt chức năng hỗ trợ đăng nhập qua RSH.

Code Snippet

Terminal Code

Copy code
      
IgnoreRhosts yes
RhostsRSAAuthentication no
      
    



6. Cấu hình thời gian ngắt kết nối SSH nếu user không hoạt động

Bạn có thể quy định thời gian timeout (tính bằng giây) mà một kết nối SSH đến server Linux không nhận được bất kì hoạt động tương tác nào trên terminal SSH. Lúc này nếu quá thời gian quy định thì SSH Server sẽ tự ngắt kết nối SSH từ các user không tương tác SSH.

Code Snippet

Terminal Code

Copy code
      
ClientAliveInterval 300
ClientAliveCountMax 3
      
    


7. Sử dụng mật khẩu phức tạp và độ khó cao

Sử dụng mật khẩu mạnh và phức tạp là 1 cách bảo vệ tốt cho server của bạn.
Mật khẩu không nên để ngày tháng năm sinh hay tên miền, mật khẩu mạnh thường bao gồm 8 ký tự trở lên có in thường in hoa và kí tự đặc biệt, số và ngẫu nhiên thành các ký tự không có nghĩa.

8. Cấu hình thời gian timeout khi user không đăng nhập thành công

Khi mà 1 user đăng nhập SSH, nếu không chỉ định thông tin user từ đầu thì chúng ta sẽ gặp 1 prompt hiện ra yêu cầu nhập thông tin user. Sau đó là phần nhập mật khẩu nếu user đó xài phương thức đăng nhập mật khẩu. Thì ở phần này, chúng ta sẽ quy định thời gian mà 1 kết nối SSH đợi cho hoạt động đăng nhập user thành công (ví dụ 120 giây), nếu không thành công thì ngắt kết nối SSH tới server.

Code Snippet

Terminal Code

Copy code
      
LoginGraceTime 120
      
    


9. Tắt log đăng nhập lần gần cuối

Log đăng nhập SSH lần gần cuối xuất hiện khi bạn đã đăng nhập SSH thành công vào hệ thống Linux.

Code Snippet

Terminal Code

Copy code
      
# ssh user@192.168.1.123
Last login: Tue May 30 10:48:03 2017 from xxx.xxx.xxx.xxx
      
    

Vậy nếu bạn muốn tắt dòng log đó, thì chỉ cần thay đổi nội dung cấu hình ở mục “PrintLastLog

Code Snippet

Terminal Code

Copy code
      
PrintLastLog no
      
    


10. Sử dụng chứng thực SSH Key, tắt chứng thực mật khẩu

Phần cấu hình này rất là được khuyến cáo sử dụng trong việc kết nối bảo mật SSH đến hệ thống Linux VPS/Cloud Server. Mặc định mỗi VPS/Cloud Server bạn sẽ đăng nhập vào bằng username root hoặc user thường và mật khẩu root mà nhà cung cấp đã gửi cho bạn lúc thuê VPS, tuy nhiên việc sử dụng mật khẩu luôn có 2 nguy cơ lớn là:

  • Bạn sẽ mất hoàn toàn hệ thống VPS/Cloud Server nếu để lộ mật khẩu.
  • Các kẻ xấu có thể sử dụng phương thức tấn công Brute Force để dò tìm mật khẩu.

Do đó, khuyến khích các bạn làm quen với SSH Key để đăng nhập vào VPS/Cloud Server, cũng như sử dụng nó để xác thực các kết nối từ bên ngoài vào cho an toàn hơn. Vậy hãy tắt cấu hình chứng thực mật khẩu và đảm bảo bật chứng thực SSH Key.

Code Snippet

Terminal Code

Copy code
      
PubkeyAuthentication yes
PasswordAuthentication no
      
    


11. Cho phép/từ chối kết nối SSH từ 1 user hoặc 1 group

Mặc định SSH Server cho phép tất cả các user có tồn tại trên hệ thống Linux đăng nhập SSH vào server. Nhưng đôi khi chúng ta cũng có nhu cầu chặn không cho đăng nhập SSH đối với 1 số user nhất định hoặc 1 nhóm user cụ thể trên Linux. Vậy để làm được điều này ta chỉ cần sử dụng 1 số cú pháp như phía dưới để cấu hình thêm mới vào file “/etc/ssh/sshd_config”
+ Cho phép user hoặc group user được phép đăng nhập SSH

Code Snippet

Terminal Code

Copy code
      
AllowUsers user1 user2
AllowGroups group1
      
    


+ Không cho phép user hoặc group user được phép đăng nhập SSH

Code Snippet

Terminal Code

Copy code
      
DenyUsers user3 user4
DenyGroups guest
      
    


12. Chế độ “StrictModes”

Với chế độ cấu hình “StrictModes” thì ta sẽ chỉ định dịch vụ SSH phải kiểm tra thông tin quyền (permission) của thư mục $HOME user, thư mục “.ssh” và file “authorized_keys” chứa key SSH nếu bạn sử dụng SSH Key. Nếu bạn không xử dụng chế độ này (option “no”) thì dịch vụ SSH sẽ không kiểm tra các cấu hình quyền khi bạn đăng nhập vào VPS/Cloud Server. Vì vậy bạn cần chú ý cấu hình đúng các phân quyền (permission) cho thư mục/key dùng để đăng nhập SSH.

Code Snippet

Terminal Code

Copy code
      
StrictModes yes
      
    


13. Số lần tối đa đăng nhập sai

Như chúng ta thường biết hoạt động dò tìm mật khẩu hay còn gọi tấn công Brute Force vào 1 dịch vụ SSH khá là nguy hiểm nếu mật khẩu bạn quá đơn giản. Vậy thì ta nên giới hạn số lần mà 1 user có thể được nhập mật khẩu sai khi cố đăng nhập SSH vào hệ thống Linux. Hãy cấu hình phần dưới với giá trị bạn mong muốn. Nếu quá số lần quy định thì SSH Server sẽ ngắt kết nối của user.

Code Snippet

Terminal Code

Copy code
      
MaxAuthTries 3
      
    


14. Google Authenticator

Phương thức này sử dụng bảo mật 2 lớp, thông qua mật khẩu và mã code từ app xác thực của google. Về nguyên lý hoạt động như sau: SSH trên server sẽ cài thêm service “google-authenticator” để đồng bộ với app trên smart phone. Mỗi phút sẽ có một mã code được tạo ra trên smart phone. Người dùng đăng nhập SSH thông qua mật khẩu sau đó nhập mã xác thực trên smart phone thì mới có thể đăng nhập.

Cách này có khả năng an toàn hơn vì dễ quản lý và phân quyền cho người dùng.

Code Snippet

Terminal Code

Copy code
      
sudo apt-get install libpam-google-authenticator
      
    

Tiếp theo, chạy lệnh sau để cấu hình Google Authenticator cho người dùng SSH:

Code Snippet

Terminal Code

Copy code
      
google-authenticator
      
    

Trong quá trình cấu hình, bạn sẽ được yêu cầu trả lời một số câu hỏi và thực hiện các cài đặt bảo mật, chẳng hạn như tạo mã QR code hoặc hiển thị mã xác thực.

Sau khi hoàn tất cấu hình, Google Authenticator sẽ cung cấp cho bạn một mã khôi phục. Lưu ý mã này vì bạn sẽ cần nó nếu bạn mất điện thoại hoặc không thể truy cập vào mã xác thực của mình.

Sử dụng trình chỉnh sửa văn bản để mở tệp cấu hình SSH. Trên Ubuntu/Debian, tệp cấu hình thường là /etc/ssh/sshd_config. Trên CentOS/Fedora, tệp cấu hình thường là /etc/ssh/sshd_config.

Code Snippet

Terminal Code

Copy code
      
sudo nano /etc/ssh/sshd_config
      
    

Tìm và sửa các dòng sau trong tệp cấu hình:

Code Snippet

Terminal Code

Copy code
      
ChallengeResponseAuthentication yes
UsePAM yes
      
    


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

Code Snippet

Terminal Code

Copy code
      
sudo service ssh restart
      
    

Sử dụng Google Authenticator cho SSH:

  1. Mở ứng dụng Google Authenticator trên điện thoại di động của bạn và quét mã QR code được hiển thị trong quá trình cấu hình.

  2. Bây giờ, khi bạn đăng nhập vào máy chủ SSH, bạn sẽ được yêu cầu nhập mã xác thực từ ứng dụng Google Authenticator.

  3. Nhập mã xác thực hiện tại từ ứng dụng Google Authenticator vào Terminal hoặc Command Prompt.


# SSH
Đăng nhập để viết bình luận