Bảo mật kết nối SSH bằng cách trao đổi khóa

Bài này mình sẽ hướng dẫn thêm một cách nữa để gia tăng bảo mật cho kết nối SSH, bằng cách tạo Khoá chung – Public key và Khoá riêng – Private key hay còn gọi ngắn gọn là SSH Key.

1. Tìm hiểu SSH Keys Authentication

Mô hình hoạt đông của SSH Key

 

1.1 Các thành phần của SSH Key

SSH Key hoạt động dạng Server – Client, kết nối được tạo bởi quá trình bắt tay giữa SSH Server và SSH Client.

Như hình bên trên các bạn nhận thấy SSH Key gồm 3 thành phần.

1.2 Cách làm việc của SSH Key

Quá trình hình thành kết nối SSH sử dụng Key sẽ trải qua nhiều lớp xác thực khác nhau. Đầu tiên, khi SSH Client khởi tạo kết nối bạn phải nhập vào Passphrase để kiểm tra xem Private Key & Public Key có phải là một cặp hay không.

Tiếp theo chúng sẽ được so sánh với nhau theo thuật toán riêng xem có khớp hay không. Nếu ok người dùng phải nhập đúng tài khoản được cấp trên SSH Server tương ứng với cặp khóa này. Khi đó kết nối mới được khởi tạo để bắt đầu phiên làm việc.

2. Tạo Private Key và Public Key

Trong bài mình sẽ tạo cặp khóa SSH trên Client. Chúng ta có thể tạo cặp khóa này trên cả Windows và Linux bằng cách sử dụng những phần mềm khác nhau.

Windows: ta dùng công cụ puttygen để tạo khóa, download tại đây
Linux: dùng ssh-keygen tạo khóa, công cụ này có sẵn rồi bạn chỉ sử dụng thôi.

2.1 PUTTYGEN – Tạo SSH Key trên Windows.

Chạy puttygen bạn sẽ thấy giao diện như hình bên dưới.

Chọn thuật toán mã hóa, mình thường chọn SSH-2 RSA, tiếp theo chọn độ dài chuỗi mã hóa mình chọn 2048 dài quá cũng giảm tốc độ truyền dữ liệu.

Sau đó dùng chuột rê quanh vùng trắng ở phía dưới đây là ma trận tạo khóa, sau đó ấn Generate để khởi tạo.

Và click chọn như hình bên dưới.

2.2 SSH-Keygen -Tạo SSH Key trên Linux

Giớ đến hướng dẫn tạo khóa trên Linux, mình thực hiện trên Ubuntu và CentOS các distro khác bạn nghiên cứu nhé.

Trên cửa sổ terminal gõ lệnh ssh-keygen -t rsa -b 2048 trong đó:

Nó sẽ hỏi bạn tạo passphrase, nhập vào passphrase muốn dùng. Quá trình tạo SSH Key trên Linux hoàn tất ta sẽ được hai file.

3. Cách sử dụng PUBLIC KEY.

Như đã nói ở trên Privete Key thì giữ lại ở Client (máy trạm), còn Public Key phải được đẩy lên Server (máy chủ).

Vấn đề bây giờ là vứt Public Key vào đâu trên server ?

Theo mô hình ở trên, mặc định Public Key có tên và đường dẫn là 

/home/abc/.ssh/authorized_keys trên server.

Khi chuyển Public Key lên server bạn phải đổi tên nó thành authorized_keys không muốn đổi tên thì copy nội dung file rồi paste vào file authorized_keys có sẵn là được.

Nếu ở gần máy chủ thì việc thêm Public Key chỉ cần một cái USB là xong, nhưng khi đặt máy chủ ở Datacenter ra vào mất nhiều thời gian, hoặc thuê VPS, Dedicated Server‎ mãi tận USA thì chỉ còn cách remote từ xa thôi.

3.1 Coppy PUBLIC KEY từ windows client vào server

Trên Windows thì rất đơn giản, bạn dùng WinSCP tạo kết nối SFTP sau đó copy Public Key vào server rồi đổi tên file thành authorized_keys là xong.

3.2 Coppy PUBLIC KEY từ linux client vào server

SSH Client là linux thì hơi khó phải dùng lệnh hoàn toàn.

Đầu tiên mình cần tạo thư mục chứa Public Key trên Server.

[abcclient@srv4 ~]$ ssh abc@192.168.0.100 mkdir -p .ssh

Trên đây mình gộp 2 lệnh lại cho gọn, trong đó:

Bước tiếp theo mình sẽ tạo authorized_keys cho server bằng chuỗi lệnh:

[abc@srv4 ~]$ cat .ssh/id_rsa.pub | ssh abc@192.168.0.100 'cat >> .ssh/authorized_keys'

Ý nghĩa:

Tiếp sau sẽ dùng chmod phân quyền 700 cho folder .ssh & 640 cho file authorized_keys

[abcclient@srv4 ~]$ ssh abcserver@192.168.0.118 'chmod 700 .ssh; chmod 640 .ssh/authorized_keys'
Enter passphrase for key '/home/abcclient/.ssh/id_rsa':

Đến đây kể như hoàn tất Client đã có Private Key, trên Server đã có Public Key nhưng kết nối vẫn xác  thực theo Password Authentication.

Thức ra chỗ này mình muốn các bạn làm quen với lệnh linux, chứ bạn hoàn toàn có thể dùng các công cụ copy file/folder đơn giản hơn như SCP và RSYNC.

Kế tiếp chúng ta cần phải cấu hình server để vô hiệu hóa xác thực bằng mật khẩu và cho phép xác thực bằng SSH Key.

4. Cấu hình SSH KEY trên server

Các bạn tìm đến file /etc/ssh/sshd_config hiệu chỉnh thông số như sau.

ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no 

Chắc chắn bạn đã truy cập SSH bằng khóa thành công trước khi disable PasswordAuthentication nếu không bạn sẽ không thể truy cập được server nữa.

Thay đổi thông số xong, trên Windows bạn sử dụng PuTTy để thử đăng nhập bằng SSH Key xem sao.

Chọn Auth để chuyển sang phần cài đặt sử dụng Key, sau đó Browse… chọn Private Key, nhấn Open tạo kết nối.

Nếu kết nối thành công thì bạn mới khởi động lại dịch vụ ssh nhé.

Còn test SSH Key trên Linux Client thì đơn giản hơn chỉ cần đăng nhập bằng user abcclient rồi gõ lệnh.

ssh abcserver@192.168.0.100

SSH sẽ tự biết lấy private key trong /home/abcclient/.ssh/id_rsa trên Client để so sánh tạo kết nối với Server.