Thứ hai, 20/10/2014 | 00:00 GMT+7

Cách cấu hình xác thực dựa trên khóa SSH trên server Linux

SSH, hay shell an toàn, là một giao thức được mã hóa dùng để quản trị và giao tiếp với các server . Khi làm việc với một server Linux, rất có thể, bạn sẽ dành phần lớn thời gian trong một phiên terminal được kết nối với server của bạn thông qua SSH.

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 . Khóa SSH cung cấp một cách dễ dàng nhưng cực kỳ an toàn để đăng nhập vào server của bạn. Vì lý do này, đây là phương pháp ta đề xuất cho tất cả user .

Các phím SSH hoạt động như thế nào?

Server SSH có thể xác thực cá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 an toàn nhất.

Mặc dù password được gửi đến server một cách an toàn, nhưng chúng thường không phức tạp hoặc đủ dài để có thể chống lại những kẻ tấn công liên tục, lặp đi lặp lại. Sức mạnh xử lý hiện đại kết hợp với các tập lệnh tự động khiến cho việc ép buộc một account được bảo vệ bằng password là rất khả thi. Mặc dù có các phương pháp bổ sung bảo mật khác ( fail2ban , v.v.), SSH key 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 .

Khóa riêng tư được khách hàng giữ lại và phải được giữ bí mật tuyệt đối. Bất kỳ sự xâm phạm nào của private key sẽ cho phép kẻ tấn công đăng nhập vào các server được cấu hình với public key liên quan mà không cần xác thực bổ sung. Để phòng ngừa bổ sung, khóa có thể được mã hóa trên đĩa bằng passphrase (password bảo vệ) .

Khóa công khai liên quan có thể được chia sẻ tự do mà không có bất kỳ hậu quả tiêu cực nào. Khóa công khai được dùng để mã hóa các tin nhắn mà chỉ private key mới có thể giải mã. Thuộc tính này được sử dụng như một cách xác thực bằng cặp khóa.

Khóa công khai được tải lên server từ xa mà bạn muốn có thể đă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 cố gắng xác thực bằng SSH key , server có thể kiểm tra client xem họ có sở hữu private key hay không. Nếu client có thể chứng minh rằng nó sở hữu private key , một phiên shell sẽ được tạo ra hoặc lệnh được yêu cầu được thực thi.

Cách tạo SSH key

Bước đầu tiên để cấu hình xác thực SSH key cho server của bạn 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 , có trong bộ công cụ OpenSSH tiêu chuẩn. 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 phím 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 của bạn. Khóa riêng tư 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 đó ngay bây giờ, 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 bạn chọn overrides 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 sẽ được yêu cầu nhập passphrase (password bảo vệ) cho khóa. Đây là một passphrase (password bảo vệ) 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 (password bảo vệ) . Một số lợi thế là:

  • Khóa SSH riêng tư (phần có thể được bảo vệ bằng passphrase (password bảo vệ) ), không bao giờ bị lộ trên mạng. Passphrase (password bảo vệ) chỉ được sử dụng để giải mã khóa trên máy local . Điều này nghĩa là việc ép buộc thô bạo dựa trên mạng sẽ không thể thực hiện được đối với passphrase (password bảo vệ) .
  • Khóa riêng tư được giữ trong một folder hạn chế. Máy khách SSH sẽ không nhận ra các private key không được lưu giữ trong các folder hạn chế. Bản thân khóa cũng phải có các quyền hạn chế (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 của bạn hoặc account root . Nếu bạn đang ở vị trí này, passphrase (password bảo vệ) 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ẽ giúp bạn có 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 đối với 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 (password bảo vệ) đóng role như một lớp bảo vệ bổ sung trong trường hợp các điều kiện này bị xâm phạm.

Passphrase (password bảo vệ) là một bổ sung tùy chọn. Nếu bạn nhập một, bạn sẽ phải cung cấp nó mỗi khi bạn sử dụng khóa này (trừ khi bạn chạy phần mềm tác nhân SSH lưu trữ khóa được giải mã). Ta khuyên bạn nên sử dụng passphrase (password bảo vệ) , nhưng nếu bạn không muốn đặt passphrase (password bảo vệ) , bạn có thể chỉ cần 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 của bạn để bạn có thể sử dụng xác thực SSH key để đăng nhập.

Cách Nhúng Khóa Công khai của bạn khi Tạo Server của bạn

Nếu bạn đang khởi động server DigitalOcean mới, bạn có thể tự động nhúng public key SSH của bạn vào account root của server mới.

Ở cuối trang tạo Server, có một tùy chọn để thêm SSH key vào server của bạn:

Khóa SSH nhúng

Nếu bạn đã thêm file public key vào account DigitalOcean của bạn , bạn sẽ thấy file đó ở đây dưới dạng tùy chọn có thể chọn (có hai khóa hiện có trong ví dụ trên: “Khóa công việc” và “Khóa chính”). Để nhúng một khóa hiện có, chỉ cần nhấp vào nó và nó sẽ nổi bật. Bạn có thể nhúng nhiều khóa trên một server :

Lựa chọn SSH key

Nếu bạn chưa có SSH key công khai được tải lên account của bạn hoặc nếu bạn muốn thêm khóa mới vào account của bạn , hãy nhấp vào nút “+ Thêm SSH key ”. Điều này sẽ mở rộng thành dấu nhắc :

Dấu nhắc chính SSH

Trong hộp “Nội dung SSH key ”, hãy dán nội dung của public key SSH của bạn. Giả sử bạn đã tạo khóa của bạn bằng phương pháp trên, bạn có thể lấy nội dung public key trên máy tính local của bạn bằng lệnh :

cat ~/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNqqi1mHLnryb1FdbePrSZQdmXRZxGZbo0gTfglysq6KMNUNY2VhzmYN9JYW39yNtjhVxqfW6ewc+eHiL+IRRM1P5ecDAaL3V0ou6ecSurU+t9DR4114mzNJ5SqNxMgiJzbXdhR+j55GjfXdk0FyzxM3a5qpVcGZEXiAzGzhHytUV51+YGnuLGaZ37nebh3UlYC+KJev4MYIVww0tWmY+9GniRSQlgLLUQZ+FcBUjaqhwqVqsHe4F/woW1IHe7mfm63GXyBavVc+llrEzRbMO111MogZUcoWDI9w7UIm8ZOTnhJsk7jhJzG2GpSXZHmly/a/buFaaFnmfZ4MYPkgJD username@example.com 

Dán toàn bộ giá trị này vào hộp lớn hơn. Trong hộp “ Comment (tùy chọn)”, bạn có thể chọn nhãn cho khóa. Tên này sẽ được hiển thị dưới dạng tên khóa trong giao diện DigitalOcean:

Khóa mới SSH

Khi bạn tạo Server của bạn , các SSH key công khai mà bạn đã chọn sẽ được đặt trong file ~/.ssh/authorized_keys của account user root . Điều này sẽ cho phép bạn đăng nhập vào server từ máy tính bằng private key của bạn .

Cách sao chép public key vào server của bạn

Nếu bạn đã có sẵn một server và không nhúng khóa khi tạo, bạn vẫ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 của bạn .

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. Các phương pháp sau đều mang lại kết quả cuối cùng như nhau. Phương pháp dễ nhất, tự động nhất là phương pháp đầu tiên và các phương pháp sau mỗi phương pháp yêu cầu các bước thủ công bổ sung nếu bạn không thể sử dụng các phương pháp trước đó.

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ó 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 của bạn .

Để sử dụng trình , bạn chỉ cần chỉ định server lưu trữ 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 chỉ nghĩa là máy tính local của bạn không nhận ra server từ xa. Điều này 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ị 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 của bạn , 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 ta đang sử dụng và sau đó xuất nội dung mà ta đã chuyển vào một file có tên gọi là authorized_keys trong folder này.

Ta sẽ sử dụng biểu tượng >> để thêm vào nội dung thay vì overrides 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 chỉ nghĩa là máy tính local của bạn không nhận ra server từ xa. Điều này 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 sẽ được yêu cầu 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 cuối file authorized_keys id_rsa.pub khóa của account user từ xa. Tiếp tục đến phần tiếp theo nếu điều này thành công.

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

Nếu bạn không có sẵn quyền truy cập SSH dựa trên password vào server của bạn , 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ính 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ó . Ví dụ: nếu server của bạn là DigitalOcean Server, bạn có thể đăng nhập bằng console web trong console :

Quyền truy cập console  DigitalOcean

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 với server của bạn bằng SSH key

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

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 chỉ 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 cung cấp passphrase (password bảo vệ) cho private key của bạn , bạn sẽ được đăng nhập ngay lập tức. Nếu bạn đã cung cấp passphrase (password bảo vệ) cho private key khi tạo khóa, bạn cần nhập ngay. Sau đó, một phiên shell mới sẽ được tạo cho bạn với account trên hệ thống từ xa.

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 của bạn

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 của bạn . Tuy nhiên, cơ chế xác thực dựa trên password của bạn vẫn hoạt động, nghĩa là server của bạn 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 tốt hơn là bạn đã cấu hình xác thực dựa trên SSH key cho account trên server này 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 , do đó, đảm bảo bạn vẫn có thể có quyền truy cập quản trị là điều cần thiết.

Sau 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 account 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 . Điều này có thể được comment . Bỏ comment 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 của bạn bằng password account :

PasswordAuthentication no 

Lưu file khi bạn hoàn tất. Để thực sự áp dụng các thay đổi mà ta vừa thực hiện, bạn 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ỉ phản hồi các SSH key .

Kết luận

Đến đây bạn sẽ có xác thực dựa trên SSH key được cấu hình và chạy trên server của bạn , cho phép bạn đăng nhập mà không cần cung cấp password account . Từ đây, bạn có thể đi nhiều hướng. Nếu bạn muốn tìm hiểu thêm về cách làm việc với SSH, hãy xem hướng dẫn cơ bản về SSH của ta .


Tags:

Các tin liên quan

Cách bảo vệ server của bạn trước lỗ hổng POODLE SSLv3
2014-10-15
Cách sử dụng cấu hình cloud để thiết lập server ban đầu của bạn
2014-10-13
Cách bảo vệ server của bạn trước lỗ hổng bảo mật do Shellshock Bash
2014-09-25
Cách cài đặt server Percona mới hoặc thay thế MySQL
2014-09-18
Cách cài đặt puppet để quản lý cơ sở hạ tầng server của bạn
2014-08-15
Cách cấu hình BIND làm server DNS Mạng riêng trên Ubuntu 14.04
2014-08-12
Cách cấu hình BIND làm server DNS Mạng riêng trên Ubuntu 14.04
2014-08-12
Thiết lập server ban đầu với CentOS 7
2014-07-21
Cách cài đặt Linux, Apache, MySQL, PHP (LAMP) trên CentOS 7
2014-07-21
Cách sử dụng NSD, một server DNS chỉ ủy quyền, trên Ubuntu 14.04
2014-07-03