Trang chủ / Chuyên đề / Cấu hình xác thực bằng ssh-key trên server Linux
Thứ hai, 20/10/2014 | 00:00 GMT+7

Cấu hình xác thực bằng ssh-key trên server Linux

SSH, hoặc shell an toàn, là một giao thức được mã hóa được sử dụng để quản trị và giao tiếp với các server. Mặc dù có một số cách khác nhau để đăng nhập vào server SSH, nhưng trong hướng dẫn này, ta sẽ tập trung vào việc cài đặt SSH key . SSH key cung cấp một cách dễ dàng nhưng cực kỳ an toàn để đăng nhập vào server. Vì lý do này, đây là phương pháp nên dùng cho các user.

SSH hoạt động như thế nào?

Server SSH có thể xác thực client bằng nhiều phương pháp khác nhau. Cơ bản nhất trong số này là xác thực bằng password, dễ sử dụng, nhưng không phải là an toàn nhất.

Mặc dù có các phương pháp bổ sung bảo mật khác ( fail2ban , v.v.), nhưng SSH key (khóa-SSH) chứng tỏ là một sự thay thế tin cậy và an toàn.

Cặp SSH key là hai khóa bảo mật bằng mật mã được dùng để xác thực client với server SSH. Mỗi cặp khóa bao gồm một public key và một private key.

Private key được khách hàng giữ lại và phải được giữ bí mật tuyệt đối. Để phòng ngừa bổ sung, khóa có thể được mã hóa trên đĩa bằng passphrase .

Public key liên quan có thể được chia sẻ tự do mà không có rủi do gì, vì đây là cơ chế của mã hóa, chỉ bảo mật private key, còn public key là để chia sẻ như tên của nó. Public key được dùng để mã hóa các tin nhắn mà chỉ private key mới có thể giải mã.

Public key được tải lên server từ xa mà bạn muốn đăng nhập bằng SSH. Khóa được thêm vào một file đặc biệt trong account user mà bạn sẽ đăng nhập có tên ~/.ssh/authorized_keys .

Khi client tiến hành xác thực bằng SSH key , server sẽ  kiểm tra client xem họ có sở hữu private key hay không. Nếu client có thể chứng minh sở hữu private key, một phiên shell sẽ được tạo ra để sẵn sàng chạy lệnh. 

Cách tạo SSH key

Bước đầu tiên để cấu hình xác thực SSH key cho server là tạo một cặp SSH key trên máy tính local của bạn.

Để làm điều này, ta có thể sử dụng một tiện ích đặc biệt có tên ssh-keygen, bao gồm trong bộ công cụ OpenSSH. Theo mặc định, điều này sẽ tạo một cặp khóa RSA 2048 bit, phù hợp với hầu hết các mục đích sử dụng.

Trên máy tính local của bạn, tạo cặp SSH key bằng lệnh:

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):

Tiện ích sẽ nhắc bạn chọn vị trí cho các khóa sẽ được tạo. Theo mặc định, các khóa sẽ được lưu trữ trong ~/.ssh trong thư ~/.ssh của user. Private key sẽ được gọi là id_rsa và public key được liên kết sẽ được gọi là id_rsa.pub .

Thông thường, tốt nhất là bạn nên sử dụng vị trí mặc định ở giai đoạn này. Làm như vậy sẽ cho phép ứng dụng SSH của bạn tự động tìm thấy các SSH key của bạn khi cố gắng xác thực. Nếu bạn muốn chọn một đường dẫn không chuẩn, hãy nhập đường dẫn đó, nếu không, hãy nhấn ENTER để chấp nhận đường dẫn mặc định.

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

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

Nếu chọn ghi đè khóa trên đĩa, bạn sẽ không thể xác thực bằng khóa trước đó nữa. Hãy rất cẩn thận khi chọn có, vì đây là một quá trình không phục hồi được.

Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again: 

Tiếp theo, bạn cần nhập passphrase (password-bảo-vệ) cho khóa. Đây là passphrase tùy chọn được dùng để mã hóa file private key trên đĩa.

Bạn có thể tự hỏi SSH key mang lại lợi ích gì nếu bạn vẫn cần nhập passphrase. Một số lợi thế là:

  • SSH key phần khóa private (phần có thể được bảo vệ bằng passphrase ), không bao giờ bị lộ trên mạng. Passphrase chỉ được sử dụng để giải mã khóa trên máy local.
  • Private key được giữ trong một folder hạn chế quyền truy cập. Client SSH sẽ không nhận ra các private key không được lưu giữ trong các folder hạn chế quyền truy cập. Bản thân khóa cũng phải có các quyền chỉ đọc và ghi cho chủ sở hữu. Điều này nghĩa là những user khác trên hệ thống không thể rình mò.
  • Bất kỳ kẻ tấn công nào muốn bẻ khóa password SSH key riêng tư đều phải có quyền truy cập vào hệ thống. Điều này nghĩa là họ đã có quyền truy cập vào account user hoặc account root. Nếu bạn đang ở vị trí này, passphrase có thể ngăn kẻ tấn công đăng nhập ngay vào các server khác của bạn. Điều này hy vọng sẽ cung cấp cho bạn thời gian để tạo và triển khai cặp SSH key mới và xóa quyền truy cập khỏi khóa bị xâm phạm.

Vì private key không bao giờ được tiếp xúc với mạng và được bảo vệ thông qua quyền file, nên không bao giờ bất kỳ ai khác ngoài bạn (và user root) có thể truy cập file này. Passphrase đóng role như một lớp bảo vệ cuối cùng trong trường hợp các điều kiện này bị xâm phạm.

Passphrase là một bổ sung tùy chọn. Nếu bạn nhập, bạn sẽ phải cung cấp nó mỗi khi bạn sử dụng khóa này. Bạn nên sử dụng passphrase nếu cần bảo mật cao nhất, nhưng nếu bạn không muốn đặt passphrase thì nhấn ENTER để bỏ qua dấu nhắc này.

Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.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=++.            |
+-----------------+

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

Cách sao chép public key vào server

Nếu bạn đã có sẵn một server, bạn có thể tải lên public key của bạn và sử dụng nó để xác thực với server.

Phương pháp bạn sử dụng phụ thuộc phần lớn vào các công cụ bạn có và chi tiết về cấu hình hiện tại của bạn.

Sao chép public key của bạn bằng SSH-Copy-ID

Cách dễ nhất để sao chép public key của bạn vào một server hiện có là sử dụng trình có tên ssh-copy-id . Vì tính đơn giản của nó, phương pháp này được khuyến khích nếu có.

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

Để sử dụng trình, bạn chỉ cần chỉ định server từ xa mà bạn muốn kết nối và account user mà bạn có quyền truy cập SSH bằng password. Đây là account mà SSH key công khai 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 một thông báo như thế này:

The authenticity of host '111.111.11.111 (111.111.11.111)' 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 nghĩa là máy tính local của bạn không nhận ra server từ xa, sẽ xảy ra lần đầu tiên bạn kết nối với server mới. Gõ “yes” và nhấn ENTER để tiếp tục.

Tiếp theo, tiện ích sẽ quét account local của bạn để tìm khóa id_rsa.pub mà ta đã tạo trước đó. Khi tìm thấy key, nó sẽ nhắc bạn nhập password của account user từ xa:

/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 keys
username@111.111.11.111's password:

Nhập password (nhập của bạn sẽ không được hiển thị ra vì mục đích bảo mật) và nhấn ENTER. Tiện ích sẽ kết nối với account trên server từ xa bằng password bạn đã cung cấp. Sau đó, nó sẽ sao chép nội dung của khóa ~/.ssh/id_rsa.pub vào một file trong ~/.ssh trang chủ ~/.ssh của account từ xa có tên là authorized_keys .

Bạn sẽ thấy kết quả giống như sau:

Number of key(s) added: 1

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

Đến đây, khóa id_rsa.pub của bạn đã được tải lên account từ xa. Bạn có thể tiếp tục vào phần tiếp theo.

Sao chép public key của bạn bằng SSH

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

Ta có thể thực hiện việc này bằng cách xuất nội dung của SSH key công khai trên máy tính local của bạn và chuyển nó qua kết nối SSH tới server từ xa. Mặt khác, ta có thể đảm bảo ~/.ssh tồn tại trong account mà ta đang sử dụng và sau đó xuất nội dung ta đã chuyển vào một file được gọi là authorized_keys trong folder này.

Ta sẽ sử dụng biểu tượng >> để thêm vào (append) nội dung thay vì ghi đè lên. Điều này sẽ cho phép ta thêm các khóa mà không phải hủy các khóa đã thêm trước đó.

Lệnh đầy đủ sẽ giống như sau:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Bạn có thể thấy một thông báo như thế này:

The authenticity of host '111.111.11.111 (111.111.11.111)' 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 nghĩa là máy tính local của bạn không nhận ra server từ xa, sẽ xảy ra lần đầu tiên bạn kết nối với server mới. Gõ “yes” và nhấn ENTER để tiếp tục.

Sau đó, bạn cần với password của account mà bạn đang cố gắng kết nối:

username@111.111.11.111's password:

Sau khi nhập password, nội dung của khóa id_rsa.pub của bạn sẽ được sao chép vào phần cuối của file authorized_keys id_rsa.pub account của user từ xa.

Sao chép public key của bạn theo cách thủ công

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

Nội dung của file id_rsa.pub của bạn sẽ phải được thêm vào file tại ~/.ssh/authorized_keys trên máy từ xa của bạn bằng cách nào đó.

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

cat ~/.ssh/id_rsa.pub

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

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 server từ xa của bạn bằng bất kỳ phương pháp nào bạn có.

Khi bạn có quyền truy cập vào account của bạn trên server từ xa, bạn nên đảm bảo ~/.ssh được tạo. Lệnh này sẽ tạo folder nếu cần hoặc không 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 các authorized_keys file trong folder này. Bạn có thể thêm nội dung của file id_rsa.pub của bạn vào cuối file authorized_keys , tạo nó nếu cần bằng cách sử dụng:

echo public_key_string >> ~/.ssh/authorized_keys

Trong lệnh trên, thay thế public_key_string bằng kết quả từ lệnh cat ~/.ssh/id_rsa.pub mà bạn đã thực thi trên hệ thống local của bạn. Nó phải bắt đầu bằng ssh-rsa AAAA...

Nếu điều này hiệu quả, bạn có thể chuyển sang thử xác thực mà không cần password.

Xác thực server bằng SSH key

Nếu bạn đã hoàn thành một trong các quy trình tạo pubic key trên, bạn có thể đăng nhập vào server từ xa mà không cần password.

Quy trình cơ bản giống nhau:

ssh username@remote_host

Nếu đây là lần đầu tiên bạn kết nối với server này (nếu bạn đã sử dụng phương pháp cuối cùng ở trên), bạn có thể thấy thông tin như sau:

The authenticity of host '111.111.11.111 (111.111.11.111)' 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 nghĩa là máy tính local của bạn không nhận ra server từ xa. Gõ “yes” và sau đó nhấn ENTER để tiếp tục.

Nếu bạn không dùng passphrase cho private key của bạn (ở bước tạo private key ban đầu), bạn sẽ được đăng nhập ngay lập tức. Nếu bạn đã cung cấp passphrase cho private key khi tạo khóa, bạn cần nhập passphrase đó để đăng nhập. Sau đó, một phiên shell mới sẽ được tạo ra để làm việc.

Nếu thành công, hãy tiếp tục tìm hiểu cách khóa server.

Tắt xác thực password trên server

Nếu bạn có thể đăng nhập vào account của bạn bằng SSH mà không cần password, bạn đã cấu hình thành công xác thực dựa trên SSH key cho account. Tuy nhiên, cơ chế xác thực dựa trên password của bạn vẫn đang hoạt động, nghĩa là server vẫn bị tấn công brute-force.

Trước khi hoàn tất các bước trong phần này, hãy đảm bảo bạn đã cấu hình xác thực dựa trên SSH key cho account root trên server này hoặc account thường với quyền truy cập sudo . Bước này sẽ khóa các đăng nhập dựa trên password.

Khi các điều kiện trên là đúng, hãy đăng nhập vào server từ xa của bạn bằng các SSH key , với quyền là user root hoặc bằng account có quyền sudo . Mở file cấu hình SSH daemon:

sudo nano /etc/ssh/sshd_config

Bên trong file, hãy tìm kiếm một lệnh có tên là PasswordAuthentication . Bỏ comment nếu có và đặt giá trị thành “no”. Điều này sẽ vô hiệu hóa khả năng đăng nhập qua SSH bằng password account:

PasswordAuthentication no

Lưu file khi bạn hoàn tất. Để áp dụng các thay đổi mà ta vừa thực hiện, ta phải khởi động lại dịch vụ.

Trên máy Ubuntu hoặc Debian, bạn có thể ra lệnh này:

sudo service ssh restart

Trên máy CentOS / Fedora, daemon được gọi là sshd :

sudo service sshd restart

Sau khi hoàn thành bước này, bạn đã chuyển đổi thành công daemon SSH của bạn để chỉ đăng nhập qua SSH key .

Kết luận

Chúc mừng, bạn đã được cấu hình xác thực dựa trên SSH key và chạy trên server, cho phép bạn đăng nhập mà không cần cung cấp password. Thật là tiện lợi đúng không!


Tags:

Các tin trước

Toàn tập làm việc với Openssl và chứng chỉ số 2014-09-12

Cài đặt Nginx trên CentOS 7 2014-07-22

Cài đặt Linux Apache MySQL PHP (LAMP) On CentOS 7 2014-07-21

Cài đặt Bảo mật cơ bản cho CentOS 7 2014-07-21

Cài đặt và sử dụng yum repositories trên Centos-6 vps 2013-10-01

Sử dụng SSH để kết nối tới Remote Server trong Ubuntu 2013-09-10

Backup postgresql databases trên Ubuntu vps 2013-08-28

Sử dụng Cron để tự động hóa các công việc việc trên server 2013-08-23

Bảo mật postgresql trên Ubuntu vps 2013-08-22

Sử dụng sftp-to-securely-transfer-files với remote-server 2013-08-13