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

Như đã biết, mặc định SSH dùng mật khẩu để xác thực người dùng trong một phiên kết nối giữa client và server, khả năng bảo mật không cao tiểm ẩn nhiều rủi rõ, đặc biệt khi làm việc với hệ thống LAMP Stack hay LEMP Stack bài này sẽ hướng dẫn thêm một cách nữa để gia tăng bảo mật bằng cách tạo khóa chung và khóa riêng - SSH Key.

Tham khảo trước: Cấu hình SSH Server cơ bản

1. Tìm hiểu SSH Keys Authentication

SSH Key Authentication

 

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

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

  • Private Key: có dạng file chứa chuỗi mã hóa được lưu trên Client, bạn cần bảo mật file này cẩn thận nó còn dùng để lấy lại Public Key.
  • Public Key: cũng là dạng file chứa chuỗi mã hóa được lưu trên Server.
  • Passphrase: là mật khẩu dùng để nhận diện Public Key và Private Key khi tạo kết nối SSH, cũng được dùng để lấy lại Public Key.

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

Để tạo kênh kết nối an toàn bạn phải qua nhiều lớp bảo mật khác nhau.

Đầu tiên khi 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. 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 tương ứng với cặp khóa này, lúc đó kết nối sẽ được khởi tạo để bắt đầu phiên làm việc.

2. Tạo Private Key và Public Key

  • 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.

Mở puttygen

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

Tạo Pbulic key và Private key

  • Passpharase (1): bạn đặt mật khẩu tùy thích miễn không quên là được.
  • Save public key (2): lưu Public Key ra file, bạn muốn ssh đến server nào thì vứt nó vào server đó.
  • Save private key (3): lưu Private Key ra file có đuôi mở rộng là .ppk

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 đó:

  • -t rsa: chỉ định thuật toán mã hóa là RSA
  • -b 2048: độ dài chuỗi mã hóa là 2048 bit

Tạo SSH Key trên linux

Nó sẽ hỏi bạn tạo passphrase, nhập vào passphrase của bạn tiếp đó sẽ tạo ra hai file.

  • id_rsa: đây là file Private Key
  • id_rsa.pub: đây là file Public Key

Mặc định mỗi user trên Linux có một Home Directory (profile) khi đăng nhập bằng user nào để tạo SSH Key thì cặp khóa sinh ra sẽ nằm trong thư mục .ssh của Home Directory, dấu chấm . đằng trước chỉ định .ssh là thư mục ẩn.

Nếu muốn dùng Private Key (id_rsa) trên Windows bạn tham khảo thêm cách Convert Private Key sang ppk.

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 ?

Mặc định trên server Public Key có tên và đường dẫn là /home/thuyserver/.ssh/authorized_keys.

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 Public Key paste vào file authorized_keys 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 chẳng hạn thì chỉ còn cách remote từ xa thôi, vậy làm sao đây ?

3.1 Copy Public Key từ Windows Client vào Server

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

3.2 Copy Public Key từ Linux Client vào Server

Trên giao diện dòng lệnh Linux Client bạn làm như sau. Đầu tiên mình cần tạo thư mục chứa Public Key trên server.

[thuyclient@srv4 ~]$ ssh [email protected] mkdir -p .ssh

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

  • ssh [email protected]: là tạo kết nối ssh đến server có IP là 192.168.0.100 với tài khoản thuyserver.
  • mkdir -p .ssh: dùng -p ép tạo thư mục .ssh trên server nếu chưa có.

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

[thuyclient@srv4 ~]$ cat .ssh/id_rsa.pub | ssh [email protected] 'cat >> .ssh/authorized_keys'
  • cat .ssh/id_rsa.pub (1): xuất nội dung file id_rsa.pub (Public Key) trên client ra màn hình.
  • ssh [email protected] : sau đó kết nối đến SSH Server có IP 192.168.0.100 với user thuyserver.
  • 'cat >> .ssh/authorized_keys': lệnh này tạo file authorized_keys trên server và copy kết quả của (1) vào authorized_keys.

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

[thuyclient@srv4 ~]$ ssh [email protected] 'chmod 700 .ssh; chmod 640 .ssh/authorized_keys'
Enter passphrase for key '/home/thuyclient/.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.

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 (khóa riêng và khóa công khai).

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.

Trên Windows bạn sử dụng PuTTy đăng nhập bằng SSH Key xem sao.

Hướng dẫn sử dụng SSH Key

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.

auth

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

Còn trên Linux Client thì đơn giản hơn chỉ cần gõ ssh, linux sẽ biết lấy private key trong folder .ssh để so sánh tạo kết nối.

5. Tổng kết

Đến đây bạn đã cấu hình SSH Keys Authentication trên Linux xong đây là cách bảo mật rất hiệu quả, bài tới mình sẽ hướng dẫn sử dụng SFTP truyền dữ liệu và một số cấu hình giúp gia tăng bảo mật cho SSH.

Chúc bạn thành công !

4 Comments

  1. admin May 17, 2016 Reply
  2. Diệp Lưu May 16, 2016 Reply
    • admin May 16, 2016 Reply
      • Diệp Lưu May 17, 2016 Reply

Leave a Reply