Saturday, January 18, 2025

[Git] Phần 12 – Các xác thực sshkey với Github.

-

1. Tổng quan.

SSH key (Secure Shell key) là một cách để xác thực người dùng với máy chủ mà không cần mật khẩu. Nó hoạt động dựa trên cặp khóa công khai và khóa riêng tư. Khóa công khai được lưu trên máy chủ và khóa riêng tư được lưu trên máy tính của bạn. Khi bạn cố gắng kết nối với máy chủ, nó sẽ sử dụng khóa công khai để mã hóa một thông điệp và gửi nó cho bạn. Máy tính của bạn sẽ giải mã thông điệp này bằng khóa riêng tư. Nếu quá trình giải mã thành công, máy chủ sẽ biết rằng bạn là người có khóa riêng tư phù hợp và cho phép bạn truy cập.

Trong GitHub, bạn có thể sử dụng SSH keys để xác thực với GitHub mà không cần nhập mật khẩu mỗi lần bạn đẩy hoặc kéo từ kho lưu trữ. Mỗi SSH key bạn thêm vào tài khoản GitHub của mình phải là duy nhất. Tuy nhiên, bạn có thể thêm nhiều SSH keys vào tài khoản GitHub của mình, ví dụ, một cho mỗi máy tính bạn sử dụng để truy cập GitHub.

Lưu ý rằng bạn không thể sử dụng cùng một public SSH key cho nhiều tài khoản GitHub. GitHub sử dụng SSH keys để xác định người dùng đang tương tác với dịch vụ, do đó mỗi key phải là duy nhất cho mỗi tài khoản. Nếu bạn cố gắng thêm cùng một public SSH key vào một tài khoản khác, GitHub sẽ từ chối và thông báo rằng key đã được sử dụng.

2. Thực hành.

2.1. Tạo cặp khóa sshkey.

Khi bạn tạo một cặp khóa SSH bằng lệnh ssh-keygen, bạn sẽ nhận được hai file: id_rsa và id_rsa.pub.

  • id_rsa: Đây là khóa riêng tư. Bạn nên giữ nó an toàn và không chia sẻ nó với bất kỳ ai. Nếu ai đó có được khóa riêng tư của bạn, họ có thể truy cập vào các hệ thống mà khóa này được sử dụng để xác thực. Bạn sẽ sử dụng khóa riêng tư này để xác thực với máy chủ hoặc dịch vụ như GitHub.
  • id_rsa.pub: Đây là khóa công khai. Bạn có thể chia sẻ nó một cách an toàn với bất kỳ ai. Nó thường được thêm vào máy chủ hoặc dịch vụ (như GitHub) để xác thực khóa riêng tư tương ứng. Khi bạn cố gắng kết nối với máy chủ hoặc dịch vụ, nó sẽ sử dụng khóa công khai này để mã hóa một thông điệp mà chỉ khóa riêng tư tương ứng mới có thể giải mã.

Lệnh ssh-keygen -t rsa -b 2048 được sử dụng để tạo một cặp khóa SSH mới.

shell> ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hoanghd/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/hoanghd/.ssh/id_rsa
Your public key has been saved in /Users/hoanghd/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:qWXvLy0g57350qOyv3OTp0dMN1ROn548knVq8WWHWM0 hoanghd@hoanghds-MacBook-Air.local
The key's randomart image is:
+---[RSA 2048]----+
|              .o+|
|             o =E|
|            . +oB|
|         .    ***|
|        S    =o*o|
|      .+o.   .+ .|
|      .+ o.o o   |
|        o.*.B o  |
|        .+B%+*   |
+----[SHA256]-----+
  • ssh-keygen: Đây là công cụ được sử dụng để tạo, quản lý và chuyển đổi các khóa chứng thực. Nó tạo ra các cặp khóa công khai và riêng tư cho xác thực SSH.
  • -t rsa: Tùy chọn này chỉ định loại thuật toán mà khóa sẽ sử dụng. Trong trường hợp này, rsa là loại thuật toán.
  • -b 2048: Tùy chọn này chỉ định độ dài của khóa. 2048 là số lượng bit trong khóa. Độ dài khóa 2048 bit là một lựa chọn tốt cho hầu hết các mục đích bởi vì nó cung cấp một mức độ bảo mật tốt và không quá chậm.

Kết quả sau khi chạy lệnh ssh-keygen thành công, bạn sẽ có 2 file id_rsa (private key) và id_rsa.pub (public key) được lưu tại thư mục mặc định là ~/.ssh/.

shell> ls -al | grep id_rsa
-rw-------@  1 hoanghd  staff  1856 Feb 13 21:46 id_rsa
-rw-r--r--@  1 hoanghd  staff   416 Feb 13 21:46 id_rsa.pub

Hoặc bạn có thể sử dụng lệnh ssh-keygen với tham số -f để chỉ định đường dẫn lưu file sshkey ssh-keygen -t rsa -b 2048 -N "" -f <đường dẫn> -q. Lệnh ssh-keygen này mình thêm các tham số sau:

  • -N "": Tùy chọn này đặt mật khẩu cho khóa riêng tư. Trong trường hợp này, chuỗi trống "" nghĩa là không có mật khẩu nào được đặt, nghĩa là bạn sẽ không cần phải nhập mật khẩu mỗi khi sử dụng khóa.
  • -f /Users/hoanghd/Desktop/id_rsa: Tùy chọn này chỉ định vị trí mà cặp khóa sẽ được lưu. Trong trường hợp này, cặp khóa sẽ được lưu trong thư mục Desktop của người dùng hoanghd với tên id_rsa (cho khóa riêng tư) và id_rsa.pub (cho khóa công khai).
  • -q: Tùy chọn này làm cho quá trình tạo khóa yên lặng, nghĩa là nó không in ra bất kỳ thông điệp nào trong quá trình tạo khóa.

Ví dụ:

shell> ssh-keygen -t rsa -b 2048 -N "" -f /Users/hoanghd/Desktop/id_rsa -q
shell> ls -al /Users/hoanghd/Desktop/ | grep id_rsa
-rw-------@  1 hoanghd  staff   1843 Feb 13 21:52 id_rsa
-rw-r--r--@  1 hoanghd  staff    416 Feb 13 21:52 id_rsa.pub

Phân quyền 600 cho 2 file trên.

shell> chmod 600 id_rsa id_rsa.pub
shell> ls -al | grep id_rsa
-rw-------@  1 hoanghd  staff  1856 Feb 13 21:46 id_rsa
-rw-------@  1 hoanghd  staff   416 Feb 13 21:46 id_rsa.pub

Phân quyền 600 cho các file id_rsa và id_rsa.pub đảm bảo rằng chỉ người dùng hiện tại mới có quyền đọc và ghi vào các file này, và không ai khác (bao gồm các nhóm hoặc người dùng khác) có thể truy cập vào chúng. Điều này quan trọng vì:

  • id_rsa: Đây là khóa riêng tư. Nếu ai đó có quyền truy cập vào file này, họ có thể sử dụng nó để xác thực như bạn với bất kỳ dịch vụ nào mà bạn sử dụng khóa này. Do đó, bạn cần giữ nó an toàn.
  • id_rsa.pub: Đây là khóa công khai. Mặc dù nó có thể được chia sẻ một cách an toàn, nhưng việc giữ nó chỉ có thể truy cập bởi người dùng hiện tại cũng giúp ngăn chặn bất kỳ thay đổi không mong muốn nào đối với nó.

Phân quyền 600 (trong hệ thống Unix-like) có nghĩa là người dùng hiện tại có quyền đọc (4) và ghi (2), nhưng không có quyền thực thi (1). Các nhóm và người dùng khác không có bất kỳ quyền nào.

Đây là nội dung private key, bạn giữ nguyên nó trong server.

shell> cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAQEA2fv2Yd5sl/wDTxT7npoMdZXoyPcMG50eY2bqH/x1j8hISEiK/inO
I6SBhdKnNid8v4eXaZIfDJidq8c3L+J9msE75rTHMaEjtoHnbGNYPdbGAYRfQzvQ5gXon6
BNB3+NQ+i3q8g+1X7MkOv5r8Qz+GxjaojmHc1cF4S1caj1UPkoyt460X85Io8fCwxy0xvw
ZF5mt9Mr7IMZSCSf/hpYkWjELiIBxZME3/RcY87nxkS9YxJRYWfDxT9rU/y3hpZdHJvISy
mhhi3viUqb+zP1J4AXbfX796SJzXSY6966Q1ZtqJoV3WdpMFyWybs0QR6D0ZSP2BNc4fkP
5ncIbcifxwAAA+AQj+2lEI/tpQAAAAdzc2gtcnNhAAABAQDZ+/Zh3myX/ANPFPuemgx1le
jI9wwbnR5jZuof/HWPyEhISIr+Kc4jpIGF0qc2J3y/h5dpkh8MmJ2rxzcv4n2awTvmtMcx
oSO2gedsY1g91sYBhF9DO9DmBeifoE0Hf41D6LeryD7VfsyQ6/mvxDP4bGNqiOYdzVwXhL
VxqPVQ+SjK3jrRfzkijx8LDHLTG/BkXma30yvsgxlIJJ/+GliRaMQuIgHFkwTf9FxjzufG
RL1jElFhZ8PFP2tT/LeGll0cm8hLKaGGLe+JSpv7M/UngBdt9fv3pInNdJjr3rpDVm2omh
XdZ2kwXJbJuzRBHoPRlI/YE1zh+Q/mdwhtyJ/HAAAAAwEAAQAAAQEAkrBRvs50+VnnyCHw
qWw1EjPNMN++0B5NQssQpnG3kwhOTAY1MpBjXezoFGwLhg/QjPrr02k3Z7yT7fLjml+p8q
gybTAeE7HCXKDSYUgBK6wKFx9DE/V+wCwdvL2c2HznTVmfsAPS9MydULDbl4JLDtOxmxGA
+XEmldUCXPg8DT5AQLwFo3tSGrJm9FjK+6DY8nqYRFYU7ET43q702Qlg9ZL3j7TacX0jA8
FmYJRrER1TrFkQLQLoAC69wWHmDWQ6SQ7TIDbbWwC5a1VDwPGiwv9aANqFmDvDOSuHguLK
KlJAZqt7v98w6R1GqqE0F4P+Y7kNoyTGeGcuvN4hRyf3wQAAAIEApJWhyuiX0UqNzDruDo
COAxK0xVdCwZFJ3glW4yE/SWNf9244hkU6K28v+e4C3tvfSCybFt09xmXMXWQkIWN211GR
4y8hyuj91X8Hdtx7CZOLZK8z57IS2epLzUoU48jtXZZnVbRUAH4xHFCgHRt5ZG1sU27NY9
7MgRvfBlp4L+4AAACBAPJZnbOQw0QG9wNLL0jI2124VSN1WWQqFW/u79rcm+feSh2XMvQV
dtCEgPaG+RvqfqV7MTuK6jLRop/Ofp12iNx/THM5fyZ32t6BNL+F6r2BP/R7gWx7i1XePD
CzDiRW9+7oFbKItP+YHWKIMbqxqQTyIftZ5Igceul26ymyr0jxAAAAgQDmQwWJ3i0PItXl
WtcG1nale7VtMv+PcKPw0XgtX0Q4B0btz0WlwhWDudJT3jw6gsj6xJgGJDWg0L632rU9Bd
unPke0LeCDeT8/Ks4npr7tZEX7W5Bxm/hZ7UEEcqm2Cku93gR2Bps2VlPM8a0lgPhJyNLx
NG/zZuam2/NMPD80NwAAACJob2FuZ2hkQGhvYW5naGRzLU1hY0Jvb2stQWlyLmxvY2FsAQ
IDBAUGBw==
-----END OPENSSH PRIVATE KEY-----

Nội dung public key, bạn hãy sao chép nội dung này để khai báo nó trên Github.

cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZ+/Zh3myX/ANPFPuemgx1lejI9wwbnR5jZuof/HWPyEhISIr+Kc4jpIGF0qc2J3y/h5dpkh8MmJ2rxzcv4n2awTvmtMcxoSO2gedsY1g91sYBhF9DO9DmBeifoE0Hf41D6LeryD7VfsyQ6/mvxDP4bGNqiOYdzVwXhLVxqPVQ+SjK3jrRfzkijx8LDHLTG/BkXma30yvsgxlIJJ/+GliRaMQuIgHFkwTf9FxjzufGRL1jElFhZ8PFP2tT/LeGll0cm8hLKaGGLe+JSpv7M/UngBdt9fv3pInNdJjr3rpDVm2omhXdZ2kwXJbJuzRBHoPRlI/YE1zh+Q/mdwhtyJ/H hoanghd@hoanghds-MacBook-Air.local

2.2. Đưa public key vào Github.

Bạn vào logo tài khoản Github của bạn.

Vào settings.

Bấm vào SSH and GPG keys -> New SSH Key.

Đặt tên cho SSH Key và chèn public key trong file id_rsa.pub mà chúng ta đã sao chép ở phần trên sau đó bấm Add SSH Key.

Và kết quả chúng ta đã thêm Public key vào Github thành công.

2.3. Kiểm tra xác thực.

Để kiểm tra xem SSH Key của chúng ta thêm có xác thực thành công được hay không. Bạn hãy tạo một Repository mới.

Đặt tên cho Repository và chọn chế độ Private .

Sao chép đoạn lệnh gợi ý ở dưới để tạo một Repository ở Local và push nó lên Github thông qua SSH (nhớ chọn xác thực với remote bằng SSH nhé).

Đầu tiên mình sẽ di chuyển về Desktop.

cd /Users/hoanghd/Desktop/

Chạy các lệnh gợi ý đã copy ở trên.

echo "# demo-sshkey" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:hoanghd16490/demo-sshkey.git
git push -u origin main

Đây là quá trình chạy lệnh của mình.

shell> echo "# demo-sshkey" >> README.md
shell> git init
Initialized empty Git repository in /Users/hoanghd/Desktop/.git/

shell> git add README.md

shell> git commit -m "first commit"
[main (root-commit) 486368f] first commit
 1 file changed, 1 insertion(+)

shell> git branch -M main
shell> git remote add origin git@github.com:hoanghd16490/demo-sshkey.git

Do là lần đầu Local Repository kết nối với Remote Repository là Github nên sẽ có bước hỏi Are you sure you want to continue connecting (yes/no/[fingerprint])?. Bạn hãy xác nhận yes để đồng ý kết nối nhé.

shell> git push -u origin main
The authenticity of host 'github.com (20.205.243.166)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 218 bytes | 218.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:hoanghd16490/demo-sshkey.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

Và đây là kết quả chúng ta đã push thành công Repository Demo lên Github qua SSH và xác thực bằng SSH Key.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories