Cách thiết lập SSH keys trên Ubuntu 18.04

2 năm trước

Giới thiệu

SSH, hoặc được gọi là Secure Shell, là một giao thức được mã hóa được sử dụng để quản lý và giao tiếp với các server. Khi làm việc với một Ubuntu server, rất có thể là bạn sẽ dành phần lớn thời gian trong phiên kết nối tới server thông qua SSH.

Trong hướng dẫn này, chúng ta sẽ tập trung vào việc thiết lập các SSH key cho cài đặt vani Ubuntu 18.04. SSH key cung cấp cách đăng nhập dễ dàng, an toàn vào máy chủ của bạn và được khuyến nghị cho tất cả user.

Bước 1 — Tạo cặp RSA key

Bước đầu tiên là tạo một cặp key trên máy khách (thường là máy tính của bạn):

ssh-keygen 

Theo mặc định ssh-keygen sẽ tạo một cặp key RSA 2048 bit, đủ an toàn cho hầu hết các trường hợp sử dụng (bạn có thể tùy ý chuyển cờ --b 4096 để tạo key 4096 bit lớn hơn).

Sau khi nhập lệnh, bạn sẽ thấy kết quả sau:

Output
Generating public/private rsa key pair. 
Enter file in which to save the key (/your_home/.ssh/id_rsa): 

Nhấn enter để lưu cặp key vào thư mục phụ .ssh/ trong thư mục chính hoặc chỉ định đường dẫn thay thế.

Nếu trước đó đã tạo cặp SSH key, bạn có thể thấy lời nhắc sau:

Output
/home/your_home/.ssh/id_rsa already exists. 
Overwrite (y/n)? 

Nếu chọn ghi đè key trên đĩa, bạn sẽ không thể xác thực bằng cách sử dụng key trước nữa. Hãy cẩn thận khi chọn có, vì đây là quá trình phá hoại không thể đảo ngược được.

Sau đó, bạn sẽ thấy lời nhắc sau:

Output
Enter passphrase (empty for no passphrase): 

Tại đây, bạn có thể tùy ý nhập cụm mật khẩu bảo mật được khuyến nghị cao. Cụm mật khẩu bổ sung thêm một lớp bảo mật để ngăn user không được phép đăng nhập. 

Sau đó, bạn sẽ thấy kết quả sau:

Output
Your identification has been saved in /your_home/.ssh/id_rsa. 
Your public key has been saved in /your_home/.ssh/id_rsa.pub.
The key fingerprint is: 
a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_host 
The key's randomart image is: 
+--[ RSA 2048]----+ 
| ..o | 
| E o= . | 
| o. o | 
| .. | 
| ..S | 
| o o. | 
| =o.+. | 
|. =++.. | 
|o=++. | 
+-----------------+ 

Bây giờ bạn có public và private key có thể sử dụng để xác thực. Bước tiếp theo là đặt public key trên server của bạn để có thể sử dụng xác thực dựa trên SSH key để đăng nhập.

 

Bước 2 — Sao chép Public key vào Ubuntu Server

Cách nhanh nhất để sao chép public key của bạn vào Ubuntu server là sử dụng một tiện ích được gọi là ssh-copy-id. Do tính đơn giản của nó, phương pháp này được khuyến khích cao nếu có. Nếu không có ssh-copy-id sẵn trên máy khách, bạn có thể sử dụng một trong hai phương thức thay thế được cung cấp trong phần này (sao chép qua SSH dựa trên mật khẩu hoặc sao chép key theo cách thủ công).

Sao chép Public key bằng  ssh-copy-id

Công cụ ssh-copy-id được bao gồm theo mặc định trong nhiều hệ điều hành, vì vậy bạn có thể có nó trên hệ thống cục bộ của bạn. Để phương thức này hoạt động, bạn phải có quyền truy cập SSH dựa trên mật khẩu vào server của mình.

Để sử dụng tiện ích, bạn chỉ cần chỉ định máy chủ từ xa muốn kết nối và tài khoản user mà bạn có quyền truy cập SSH mật khẩu. Đây là tài khoản mà SSH public key của bạn sẽ được sao chép.

Cú pháp là:

ssh-copy-id username@remote_host

Bạn có thể thấy thông báo sau:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established. 
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. 
Are you sure you want to continue connecting (yes/no)? yes

Điều này có nghĩa rằng máy tính cục bộ không nhận ra máy chủ từ xa. Điều này sẽ xảy ra lần đầu kết nối với một máy chủ lưu trữ mới. Nhập "yes" và nhấn ENTER để tiếp tục.

Tiếp theo, tiện ích sẽ quét tài khoản cục bộ cho key id_rsa.pub đã tạo trước đó. Khi tìm thấy key, nó sẽ nhắc bạn nhập mật khẩu của tài khoản user từ xa:

Output
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s),to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keysusername@203.0.113.1's password: 

Gõ mật khẩu (đánh máy sẽ không được hiển thị vì mục đích bảo mật) và nhấn ENTER. Tiện ích sẽ kết nối với tài khoản trên máy chủ từ xa bằng mật khẩu bạn đã cung cấp. Sau đó nó sẽ sao chép nội dung của key ~/.ssh/id_rsa.pub vào một tệp trong thư mục ~/.ssh của tài khoản ở xa có tên  authorized_keys

Bạn sẽ thấy kết quả sau:

Output
Number of key(s) added: 1 
Now try logging into the machine, with: "ssh 'username@203.0.113.1'" 
and check to make sure that only the key(s) you wanted were added. 

Tại thời điểm này, key id_rsa.pub được tải lên tài khoản từ xa. Bạn có thể tiếp tục sang Bước 3.

Sao chép Public key bằng SSH

Nếu không có ssh-copy-id, nhưng có quyền truy cập SSH dựa trên mật khẩu vào tài khoản trên server của mình, bạn có thể tải lên các key bằng phương thức SSH thông thường.

Chúng ta có thể làm điều này bằng cách sử dụng lệnh cat để đọc nội dung của public SSH key trên máy tính cục bộ và đường ống thông qua kết nối SSH tới máy chủ từ xa.

Mặt khác, chúng ta có thể đảm bảo rằng thư mục ~/.ssh tồn tại và có các quyền chính xác trong tài khoản đang sử dụng.

Sau đó có thể xuất nội dung đã chuyển vào một tệp có tên authorized_keys trong thư mục này. Chúng ta sẽ sử dụng biểu tượng chuyển hướng >> để nối thêm nội dung thay vì ghi đè lên nội dung đó. Điều này cho phép thêm các key mà không bỏ các key đã thêm trước đó.

Lệnh đầy đủ trông như sau:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys" 

Bạn có thể thấy thông báo sau:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. 
Are you sure you want to continue connecting (yes/no)? yes

Điều này có nghĩa rằng máy tính cục bộ không nhận ra máy chủ từ xa, xảy ra lần đầu kết nối với một máy chủ lưu trữ mới. Nhập "yes" và nhấn ENTER để tiếp tục.

Sau đó, bạn sẽ được nhắc nhập mật khẩu tài khoản user từ xa:

Outputusername@203.0.113.1's password: 

Sau khi nhập mật khẩu, nội dung của key id_rsa.pub sẽ được sao chép vào cuối tệp   authorized_keys của tài khoản user từ xa. Tiếp tục sang Bước 3 nếu thành công.

Sao chép Public key theo cách thủ công

Nếu không có quyền truy cập SSH dựa trên mật khẩu vào server của mình, bạn sẽ phải hoàn tất quy trình trên theo cách thủ công.

Chúng ta sẽ tự thêm nội dung của tệp id_rsa.pub vào tệp ~/.ssh/authorized_keys trên máy từ xa của bạn.

Để hiển thị nội dung của key id_rsa.pub, hãy nhập nội dung này vào máy tính cục bộ của bạn:

cat ~/.ssh/id_rsa.pub 

Bạn sẽ thấy nội dung của khóa trông giống như sau:

Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test 

Truy cập máy chủ từ xa bằng bất kỳ phương pháp bạn có sẵn.

Khi có quyền truy cập vào tài khoản trên máy chủ từ xa, bạn nên đảm bảo thư mục ~/.ssh tồn tại. Lệnh này sẽ tạo thư mục nếu cần hoặc không cần làm gì nếu nó đã tồn tại:

mkdir -p ~/.ssh 

Bây giờ, bạn có thể tạo hoặc sửa đổi tệp authorized_keys trong thư mục này. Bạn có thể thêm nội dung của tệp id_rsa.pub vào cuối tệp authorized_keys, bằng cách sử dụng lệnh sau:

echo public_key_string >> ~/.ssh/authorized_keys 

Trong lệnh trên, thay thế public_key_string bằng đầu ra từ lệnh cat ~/.ssh/id_rsa.pub đã thực hiện trên hệ thống cục bộ. Nó sẽ bắt đầu với ssh-rsa AAAA....

Cuối cùng, đảm bảo rằng thư mục ~/.ssh và authorized_keys có tập hợp quyền phù hợp:

chmod -R go= ~/.ssh 

Điều này đệ quy loại bỏ tất cả các quyền "group" và "other" cho thư mục ~/.ssh/.

Nếu đang sử dụng tài khoản root để thiết lập key cho tài khoản user, điều quan trọng là thư mục   ~/.ssh thuộc về user chứ không phải root:

chown -R sammy:sammy ~/.ssh 

Trong hướng dẫn này, user được đặt tên là sammy nhưng bạn nên thay thế tên user thích hợp vào lệnh trên.

Bây giờ chúng ta có thể thử xác thực không mật khẩu với Ubuntu server.

 

Bước 3 — Xác thực với Ubuntu Server bằng cách sử dụng các SSH keys

Nếu đã hoàn tất thành công một trong các quy trình trên, bạn sẽ có thể đăng nhập vào máy chủ từ xa mà không cần mật khẩu của tài khoản từ xa.

Quá trình cơ bản là như nhau:

ssh username@remote_host

Nếu đây là lần đầu kết nối với máy chủ lưu trữ này (nếu đã sử dụng phương pháp cuối cùng ở trên),bạn có thể thấy một cái gì đó như thế này:

Output
The authenticity of host '203.0.113.1 (203.0.113.1)' can't be established. 
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe. 
Are you sure you want to continue connecting (yes/no)? yes

Điều này có nghĩa rằng máy tính cục bộ không nhận ra máy chủ từ xa. Nhập "yes" và nhấn ENTER để tiếp tục.

Nếu không cung cấp cụm mật khẩu cho key riêng, bạn sẽ được đăng nhập ngay lập tức. Nếu đã cung cấp cụm mật khẩu cho key riêng, bạn sẽ được nhắc nhập mật khẩu ngay bây giờ (lưu ý rằng tổ hợp phím sẽ không hiển thị trong phiên đầu cuối để bảo mật). Sau khi xác thực, một phiên trình bao mới sẽ mở ra với tài khoản được cấu hình trên Ubuntu server.

Nếu xác thực dựa trên key đã thành công, hãy tiếp tục tìm hiểu cách bảo mật hệ thống hơn nữa bằng cách tắt xác thực mật khẩu.

 

Bước 4 — Tắt xác thực mật khẩu trên Server của bạn

Nếu có thể đăng nhập vào tài khoản bằng SSH mà không cần mật khẩu, bạn đã định cấu hình thành công xác thực dựa trên SSH key cho tài khoản của mình. Tuy nhiên, cơ chế xác thực dựa trên mật khẩu của bạn vẫn hoạt động, có nghĩa là server vẫn tiếp xúc với các cuộc tấn công bạo lực.

Trước khi hoàn tất các bước trong phần này, hãy đảm bảo có xác thực dựa trên SSH key được định cấu hình cho tài khoản root trên server này hoặc tốt hơn là có xác thực dựa trên SSH key được định cấu hình cho tài khoản non-root có quyền sudo. Bước này sẽ khóa thông tin đăng nhập dựa trên mật khẩu, do đó việc đảm bảo rằng bạn vẫn có thể nhận quyền truy cập quản trị là rất quan trọng.

Khi bạn đã xác nhận rằng tài khoản từ xa có các đặc quyền quản trị, hãy đăng nhập vào máy chủ từ xa bằng các SSH key, dưới dạng root hoặc với một tài khoản có đặc quyền sudo. Sau đó, mở tệp cấu hình của SSH daemon:

sudo nano /etc/ssh/sshd_config 

Bên trong tệp, tìm kiếm chỉ thị có tên là PasswordAuthentication. Điều này có thể được nhận xét. Bỏ ghi chú dòng và đặt giá trị thành "no". Điều này sẽ vô hiệu hóa khả năng đăng nhập thông qua SSH bằng mật khẩu tài khoản:

/etc/ssh/sshd_config
...
PasswordAuthentication no
...

Lưu và đóng tệp khi hoàn tất bằng cách nhấn CTRL + X, rồi nhấn Y để xác nhận lưu tệp và cuối cùng nhấn ENTER để thoát khỏi nano. Để thực hiện những thay đổi này, cần phải khởi động lại dịch vụ  sshd:

sudo systemctl restart ssh 

Để đề phòng, hãy mở một cửa sổ dòng lệnh mới và kiểm tra xem dịch vụ SSH có hoạt động chính xác không trước khi đóng phiên này:

ssh username@remote_host

Khi đã xác minh dịch vụ SSH, bạn có thể đóng tất cả các phiên server hiện tại một cách an toàn.

SSH daemon trên Ubuntu server bây giờ chỉ đáp ứng với các SSH key. Xác thực dựa trên mật khẩu đã được vô hiệu hoá thành công.

 

Kết luận

Giờ đây, bạn đã có xác thực dựa trên SSH key được định cấu hình trên server, cho phép bạn đăng nhập mà không cần cung cấp mật khẩu tài khoản.