SSH key là gì và dùng để làm gì?

Là một cặp key được dùng để mã hóa bất đối xứng, gồm có public keyprivate key. Tuy vậy, SSH key không dùng để mã hóa nội dung nào cả, mà chỉ dùng để xác minh quyền truy cập. Trong đó có những tác vụ yêu cầu quyền truy cập thường dùng như:

  • Xác minh quyền SSH vào server
  • Xác minh quyền truy cập git repo

Quy trình xác minh RSA key

Nếu bạn thắc mắc tại sao lại dùng SSH key mà không dùng mật khẩu? Đơn giản vì mật khẩu không bảo mật và không tiện dụng bằng SSH key.

Nhược điểm của mật khẩu:

  1. Dễ bị lộ, bị nhìn thấy
  2. Dễ bị tấn công bằng brute force
  3. Gây khó chịu khi phải nhớ mật khẩu dài hoặc nhập quá nhiều lần
  4. Quên mật khẩu là thôi xong  🙄

Cách tạo ra SSH key

Sau khi gõ lệnh trên thì bạn có thể follow instruction của nó. Chỉ có 2 điều cần chú ý:

1. Tên của cặp key

Nếu account của bạn chưa có cặp key nào, khi tạo mới bạn có thể để tên defaut là id_rsa và id_rsa.pub. Nếu bạn đã có một cặp key rồi thì hãy đổi tên đi, vì nó sẽ ghi đè cặp key có sẵn của bạn.

Điền tên hoặc đường dẫn khác nếu không muốn bị ghi đè lên ssh key có sẵn

2. Passphrase

Bạn có muốn dùng SSH key mà vẫn phải nhớ mật khẩu không? Trong trường hợp bạn nhập passphrase, thì dù người khác có copy được cặp key của bạn cũng không thể dùng được vì phải biết mật khẩu nữa. Riêng tôi thì không cần phải bảo mật đến vậy cho nên để passphrase là empty luôn  :mrgreen:

Màn hình terminal sau khi generate ssh key

Nội dung của private key sẽ tương tự như thế này:

Còn đây là nội dung của public key:

 

Dùng SSH key để đăng nhập vào server

Thêm public key vào authorized_key trên server

Nếu trên server chưa có file authorized_keys thì phải tạo nó đã:

Sau đó bạn mở file ~/.ssh/authorized_keys bằng editor gì tùy thích, vim hay nano gì đó cũng được.  Copy toàn bộ nội dung của file public key vào, nếu muốn thêm nhiều public key thì mỗi key một dòng.

SSH dùng private key

Ví dụ bạn muốn đăng nhập bằng tài khoản root tới server có ip là 192.168.10.10, cổng 10022, đường dẫn tới private key là ~/.ssh/id_rsa_test:

Nếu bạn gặp lỗi này:

Thì hãy chmod lại file private key thành 400(tức là quyền chỉ đọc cho người sở hữu). Thực ra set quyền thành 600 vẫn được, nhưng tôi không nghĩ chúng ta cần phải sửa nội dung của file này. Cho nên quyền 400 là đủ rồi.

Lệnh trên dùng cho cả file PEM luôn nhé.

 

Dùng SSH key để push lên git repo

Tương tự SSH tới server, bạn cũng phải cung cấp public key cho git repo để chúng có thể xác minh quyền truy cập.

Với Github, truy cập https://github.com/settings/ssh/new và paste nội dung của public key vào ô Key, sau đó nhấn Add SSH Key.

Màn hình add new key của github

Quan trọng là khi clone bạn phải dùng link ssh, nếu dùng link https thì Github vẫn hỏi username/password như bình thường.

Clone dùng link SSH

Với Gitlab cũng tương tự, truy cập https://gitlab.com/profile/keys:

Màn hình add new key của gitlab

Clone dùng link ssh

Đối với những dự án có sẵn, mà link repo hiện tại là https thì bạn chỉ cần đổi link là được:

Nhớ cd vào thư mục project trước nhé.

Lưu trữ vào dùng lại

Chúng ta nên lưu trữ ssh key ở đâu đó để khi chuyển máy hoặc cài lại OS thì dùng lại, đỡ phải setup lại các bước trên. Bản thân tôi lưu trữ trên Drive với bảo mật 2 lớp, chắc cũng khá là an toàn rồi.

Vấn đề là khi tải ssh key từ trên Drive về không phải dùng được ngay. Bạn phải add lại:

Bước 1: copy ssh key vào thư mục ~/.ssh.

Bước 2: Dùng lệnh ssh-add để thêm ssh key vào system.

Nếu nó hỏi passphrase thì nhập passphrase và chọn automatic unlock để lần sau không phải nhập nữa nhé.

Lưu ý

  1. Public keyprivate key đúng như tên gọi của nó, bạn có thể share public key nhưng private key thì không.
  2. Có thể không lưu trữ public key vì bạn có thể generate public key từ chính private key.
  3. Chmod 400 cho tất cả các private key là an toàn nhất.
  4. Sau khi config ssh bằng key, đổi mật khẩu user trên server thật dài hoặc disable luôn chức năng đăng nhập bằng mật khẩu để chống brute force.
  5. Nên test login và backup private key trước khi disable chức năng đăng nhập bằng mật khẩu để phòng trường hợp làm mất private key.