Thứ hai, 28/09/2020 | 11:30 GMT+7

Tổng quan sử dụng SSH, làm việc với SSH Client - Server

SSH là một giao thức an toàn dùng làm phương tiện để kết nối với các server Linux từ xa. Sau khi kết nối SSH, tất cả các lệnh sẽ được gửi đến server và được thực thi ở đó. Trong hướng dẫn này, ta sẽ trình bày một số cách kết nối phổ biến với SSH, có thể được sử dụng như tài liệu tham khảo nhanh khi bạn cần cách kết nối hoặc cấu hình server theo các cách khác nhau.

Cách sử dụng Hướng dẫn này

  • Hãy đọc phần Tổng quan về SSH trước nếu bạn chưa quen với SSH nói chung.
  • Các hướng dẫn dưới đây chia thành các phần, và Hầu hết độc lập với nhau, bạn có thể áp dụng từng phần.
  • Copy paste các dòng lệnh đã cho, thay thế các giá trị được highlighted bằng các giá trị của riêng bạn.

Tổng quan về SSH

Cách phổ biến nhất để kết nối với server Linux từ xa là thông qua SSH. SSH là viết tắt của Secure Shell và cung cấp một cách an toàn và bảo mật để thực hiện các lệnh, thực hiện thay đổi và cấu hình dịch vụ từ xa. Khi bạn kết nối thông qua SSH, bạn đăng nhập bằng tài khoản tồn tại trên server.

Cách hoạt động của SSH

Khi kết nối qua SSH, bạn sẽ được đưa vào một phiên shell, đây là một giao diện lệnh dựa trên text, có thể tương tác với server. Trong suốt thời gian phiên SSH , bất kỳ lệnh nào bạn nhập vào thiết bị đầu cuối cục bộ đều được gửi qua đường hầm (tunnel) SSH được mã hóa và được thực thi trên server .

Kết nối SSH được triển khai bằng mô hình client-server. Điều này có nghĩa là để kết nối SSH được thiết lập, máy tính từ xa phải chạy một phần mềm được gọi là daemon SSH. Phần mềm này lắng nghe các kết nối trên một cổng mạng cụ thể (thường là cổng 22), xác thực các yêu cầu kết nối và tạo ra môi trường thích hợp nếu người dùng cung cấp thông tin đăng nhập chính xác.

Máy tính của người dùng phải có một công cụ SSH. Đây là một phần mềm có thể giao tiếp bằng giao thức SSH (ví dụ putty) và cung cấp thông tin về server lưu trữ từ xa để kết nối, tên người dùng để sử dụng và thông tin đăng nhập để xác thực. Client cũng có thể cấu hình chi tiết về kiểu kết nối cần thiết lập. 

Cách SSH xác thực người dùng

Client thường xác thực bằng mật khẩu, kém an toàn và không được khuyến khích so với khóa SSH là rất an toàn.

Mật khẩu đăng nhập được mã hóa và cách này dễ hiểu cho người dùng mới. Tuy nhiên, các bot tự động và người dùng tấn công sẽ thường xuyên cố gắng xác thực các tài khoản cho phép đăng nhập dựa trên dò mật khẩu. Vì lý do này, chúng tôi khuyên bạn nên thiết lập xác thực dựa trên khóa SSH.

Khóa SSH là một tập hợp các khóa mật mã phù hợp có thể được sử dụng để xác thực. Mỗi bộ chứa một Khóa Công khai và Khóa private (Từ đây ta gọi là Public Key và Private Key). Public Key có thể được chia sẻ tự do mà không cần quan tâm, trong khi khóa riêng phải được bảo vệ cẩn thận và không bao giờ được tiết lộ cho bất kỳ ai.

Để xác thực bằng khóa SSH, người dùng phải có cặp khóa SSH trên máy tính của họ. Trên server, public key phải được sao chép vào file trong thư mục chính của người dùng tại ~/.ssh/authorized_keys . File này chứa danh sách các public key, một khóa trên mỗi dòng.

Khi một client kết nối với server, muốn sử dụng xác thực khóa SSH, nó sẽ thông báo cho server biết public key nào cần sử dụng. Sau đó, server sẽ kiểm tra file authorized_keys của nó để tìm public key, tạo một chuỗi ngẫu nhiên và mã hóa nó bằng public key. Thông điệp được mã hóa này chỉ có thể được giải mã bằng Private key tương ứng. Server sẽ gửi thông báo được mã hóa này đến client để kiểm tra xem client có thực sự có Private key được liên kết hay không.

Khi nhận được thông báo này, client sẽ giải mã nó bằng cách sử dụng private key và kết hợp chuỗi ngẫu nhiên được cấp với ID phiên đã giao dịch trước đó. Sau đó, nó tạo ra một băm MD5 có giá trị này và truyền nó trở lại server. Server đã có thông báo root và ID phiên, vì vậy nó có thể so sánh mã băm MD5 được tạo bởi các giá trị đó và xác định rằng client phải có private key.

Bây giờ bạn đã biết cách hoạt động của SSH, chúng ta có thể bắt đầu thảo luận một số ví dụ để chứng minh các cách làm việc khác nhau với SSH

Tạo và làm việc với khóa SSH

Phần này sẽ trình bày cách tạo khóa SSH trên client và phân phối public key cho các server sẽ sử dụng key đó.

Tạo cặp khóa SSH

Tạo cặp public key và private key SSH mới trên máy tính là bước đầu tiên để xác thực với server mà không cần mật khẩu. 

Một số thuật toán mật mã có thể được sử dụng để tạo khóa SSH, bao gồm RSA, DSA và ECDSA. Các khóa RSA thường được ưu tiên mặc định.

Để tạo một cặp khóa RSA trên máy tính cục bộ , hãy nhập:
(Với Window thì OpenSSH là bộ cài cho các lệnh này, còn với linux thì là bộ cài OpenSSL)

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

Lời nhắc này cho phép bạn chọn nơi lưu trữ Private key RSA. Nhấn ENTER để để cài đặt này làm mặc định, sẽ lưu trữ chúng trong .ssh ẩn .ssh trong .ssh của người dùng . Để vị trí mặc định được chọn sẽ cho phép ứng dụng SSH tự động tìm thấy các khóa.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Lời nhắc tiếp theo cho phép bạn nhập mật khẩu có độ dài tùy ý để bảo mật Private key . Theo mặc định, bạn sẽ phải nhập bất kỳ mật khẩu nào bạn đặt ở đây mỗi khi bạn sử dụng Private key, như một biện pháp bảo mật bổ sung. Vui lòng nhấn ENTER để trống nếu bạn không muốn có mật khẩu. Nhưng nếu chỉ Enter, thì nguy cơ là sẽ cho phép bất kỳ ai giành được quyền kiểm soát private key đăng nhập vào server.

Nếu bạn chọn nhập mật khẩu thì đây là một biện pháp phòng ngừa an ninh an toàn cho khóa.

Output
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       +         |
|      o S   .    |
|     o   . * +   |
|      o + = O .  |
|       + = = +   |
|      ....Eo+    |
+-----------------+

Quy trình này đã tạo một cặp khóa RSA SSH, nằm trong .ssh ẩn .ssh trong .ssh của người dùng . Các file này là:

  • ~/.ssh/id_rsa : Private key. KHÔNG CHIA SẺ TẬP TIN NÀY!
  • ~/.ssh/id_rsa.pub : Public Key được liên kết, có thể được chia sẻ tự do không vấn đề gì.

Tạo một cặp khóa SSH với số lượng bit lớn hơn

Các khóa SSH là 2048 bit theo mặc định, được coi là đủ tốt để bảo mật, nhưng bạn có thể chỉ định số lượng bit lớn hơn cho một khóa mạnh hơn.

Bằng cách thêm  -b với số bit bạn muốn. Hầu hết các server hỗ trợ các khóa có độ dài ít nhất là 4096 bit. Các khóa dài hơn có thể không được chấp nhận cho mục đích bảo vệ DDOS:

  • ssh-keygen -b 4096

Nếu trước đó bạn đã tạo một khóa khác, bạn sẽ được hỏi có muốn ghi đè khóa trước đó của mình không:

Overwrite (y/n)?

Nếu bạn chọn “có”, khóa trước đó sẽ bị ghi đè và bạn sẽ không thể đăng nhập vào server bằng khóa đó nữa. Do đó, hãy nhớ ghi đè các khóa một cách thận trọng.

Xóa hoặc thay đổi mật khẩu trên Private key

Nếu bạn đã tạo mật khẩu cho Private key của mình và muốn thay đổi hoặc xóa nó, bạn có thể thực hiện dễ dàng.

Lưu ý : Để thay đổi hoặc xóa mật khẩu, bạn phải biết mật khẩu ban đầu. Nếu bạn đã mất mật khẩu cho khóa, thì không có quyền truy đòi và bạn sẽ phải tạo một cặp khóa mới.

Để thay đổi hoặc xóa mật khẩu, chỉ cần nhập:

  • ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):

Bạn có thể nhập vị trí file muốn sửa hoặc ENTER để dùng file mặc định trên:

Enter old passphrase:

Nhập mật khẩu cũ mà bạn muốn thay đổi. Sau đó nhập mật khẩu mới:

Enter new passphrase (empty for no passphrase):
Enter same passphrase again:

Tại đây, hãy nhập mật khẩu mới hoặc nhấn ENTER để xóa mật khẩu.

Hiển thị FingerPrint (Dấu vân tay) Khóa SSH

Mỗi cặp khóa SSH chia sẻ một “fingerprint” mật mã duy nhất có thể được sử dụng để nhận dạng duy nhất các khóa. Điều này có thể hữu ích trong nhiều tình huống.

Để tìm ra fingerprint của khóa SSH, hãy nhập:

  • ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):

Bạn có thể nhấn ENTER nếu đó là vị trí chính xác của file, nếu không, hãy nhập vị trí đã sửa đổi. Bạn sẽ được cung cấp một chuỗi chứa độ dài bit của khóa, vân tay, tài khoản và server lưu trữ mà nó được tạo và thuật toán được sử dụng:

Output
4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e  demo@test (RSA)

Sao chép Khóa SSH Public vào Server có SSH-Copy-ID

Để sao chép public key vào server, cho phép bạn xác thực mà không cần mật khẩu, có thể thực hiện một số cách.

Nếu bạn hiện có quyền truy cập SSH dựa trên mật khẩu được định cấu hình cho server của mình và đã cài đặt tiện ích ssh-copy-id thì đơn giản. Công cụ ssh-copy-id được bao gồm trong OpenSSH của bản phân phối Linux, vì vậy thường đã cài đặt theo mặc định.

Nếu bạn có tùy chọn trên, bạn có thể dễ dàng chuyển public key của mình bằng cách nhập:

  • ssh-copy-id username@remote_host

Thao tác này sẽ nhắc bạn nhập mật khẩu của tài khoản người dùng trên hệ thống từ xa (remote_host):

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

Sau khi gõ vào mật khẩu, nội dung ~/.ssh/id_rsa.pub chính sẽ được gắn vào phần cuối của tài khoản người dùng của ~/.ssh/authorized_keys file:

Output
Number of key(s) added: 1

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

Bây giờ bạn có thể đăng nhập vào tài khoản đó mà không cần mật khẩu:

  • ssh username@remote_host

Sao chép khóa SSH Public  vào một server mà không có SSH-Copy-ID

Nếu bạn không có sẵn tiện ích ssh-copy-id , nhưng vẫn có quyền truy cập SSH dựa trên mật khẩu vào server, bạn có thể sao chép nội dung public key của mình theo một cách khác.

Bạn có thể xuất nội dung của khóa và chuyển nó vào lệnh ssh . Về phía điều khiển từ xa, bạn có thể đảm bảo rằng ~/.ssh tồn tại, sau đó nối nội dung đường ống vào file ~/.ssh/authorized_keys :

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

Bạn sẽ được yêu cầu cung cấp mật khẩu cho tài khoản từ xa:

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
demo@111.111.11.111's password:

Sau khi nhập mật khẩu, khóa sẽ được sao chép, cho phép bạn đăng nhập mà không cần mật khẩu:

  • ssh username@remote_IP_host

Hướng dẫn kết nối cơ bản

Phần sau sẽ trình bày một số kiến thức cơ bản về cách kết nối với server bằng SSH.

Kết nối với server

Để kết nối với một server và mở một phiên shell ở đó trên máy Linux của bạn, sử dụng lệnh ssh .

Lệnh đơn giản nhất là khi tên người dùng trên máy cục bộ giống với tên người dùng trên server, khi đó bạn có thể kết nối bằng cách sử dụng:

  • ssh remote_host

Nếu tên người dùng khác trên server remote, cần chuyển tên người dùng từ xa như sau:

  • ssh username@remote_host

Lần đầu tiên kết nối với một server mới, bạn sẽ thấy một thông báo 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

Nhập yes để chấp nhận tính xác thực của server.

Nếu bạn đang sử dụng xác thực bằng mật khẩu, bạn sẽ được nhắc nhập mật khẩu cho tài khoản tại đây. Nếu bạn đang sử dụng khóa SSH, bạn sẽ được nhắc nhập mật khẩu của Private key nếu mật khẩu được đặt, nếu không, bạn sẽ được đăng nhập tự động.

Chạy một lệnh trên server

Để chạy một lệnh duy nhất trên server thay vì tạo phiên shell, bạn có thể thêm lệnh sau thông tin kết nối, như sau:

  • ssh username@remote_host command_to_run

Thao tác này sẽ kết nối với server, xác thực bằng thông tin đăng nhập và thực hiện lệnh bạn đã chỉ định. Kết nối sẽ ngay lập tức đóng ngay sau đó.

Đăng nhập vào server bằng cổng khác

Theo mặc định, daemon SSH trên server chạy trên cổng 22. Nếu server SSH đang nghe trên một cổng khác (điều này được trình bày trong phần sau), bạn sẽ phải chỉ định số cổng khi kết nối với client.

Có thể thực hiện việc này bằng cách chỉ định số cổng với tùy chọn -p :

  • ssh -p port_num username@remote_host

Để tránh phải thực hiện việc này mỗi khi đăng nhập vào server, bạn có thể tạo hoặc chỉnh sửa file cấu hình trong ~/.ssh trong thư mục chính của máy tính của bạn.

Chỉnh sửa hoặc tạo file ngay bây giờ bằng cách nhập:

  • nano ~/.ssh/config

Tại đây, bạn có thể đặt các tùy chọn cấu hình server lưu trữ cụ thể. Để chỉ định cổng mới, hãy sử dụng định dạng như sau:

~/.ssh/config
Host remote_alias
    HostName remote_host
    Port port_num

Điều này sẽ cho phép bạn đăng nhập mà không cần chỉ định số cổng cụ thể trên dòng lệnh.

Thêm các khóa SSH vào SSH Agent để tránh nhập mật khẩu

Nếu dùng mật khẩu SSH, bạn sẽ nhập mật khẩu để kết nối với server.

Để tránh lặp lại điều này nhiều lần, bạn có thể dùng phần mềm SSH nào đó, lưu trữ Private key sau khi bạn nhập mật khẩu lần đầu tiên, cho phép bạn kết nối trong tương lai mà không cần nhập lại mật khẩu.

Điều này cũng quan trọng nếu bạn cần chuyển tiếp thông tin đăng nhập SSH của mình (sẽ nói ở phần sau).

Để khởi động SSH Agent, hãy nhập thông tin sau vào dòng lệnh console :

  • eval $(ssh-agent)
Output
Agent pid 10891

Thao tác này sẽ khởi động chương trình và chạy nó trong background. Bây giờ, bạn cần thêm Private key của mình vào Agent để nó có thể quản lý khóa :

  • ssh-add
Enter passphrase for /home/demo/.ssh/id_rsa:
Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa)

Bạn sẽ nhập mật khẩu của mình (nếu mật khẩu được đặt). Sau đó, file danh tính được thêm vào Agent, cho phép bạn sử dụng khóa của mình để đăng nhập mà không cần phải nhập lại mật khẩu lần nữa.

Chuyển tiếp thông tin đăng nhập SSH để sử dụng trên server

Nếu bạn muốn có thể kết nối mà không cần mật khẩu với một server từ bên trong server khác, bạn sẽ cần chuyển tiếp thông tin khóa SSH của mình. Điều này sẽ cho phép bạn xác thực với một server khác thông qua server mà bạn được kết nối, sử dụng thông tin đăng nhập trên máy cục bộ .

Để bắt đầu, bạn phải khởi động Agent SSH và khóa SSH được thêm vào Agent (xem phần trước). Sau khi hoàn tất, bạn cần kết nối với server đầu tiên của mình bằng tùy chọn -A . Điều này chuyển tiếp thông tin đăng nhập đến server cho phiên này:

  • ssh -A username@remote_host

Từ đây, bạn có thể SSH vào bất kỳ server nào khác mà khóa SSH được phép truy cập. Bạn sẽ kết nối như thể khóa SSH private được đặt trên server này.

Tùy chọn cấu hình phía server

Phần này chứa một số tùy chọn cấu hình phía server phổ biến có thể định hình cách server phản hồi và loại kết nối nào được phép.

Tắt xác thực mật khẩu

Nếu các khóa SSH đã được cấu hình, kiểm tra và hoạt động bình thường, bạn nên tắt xác thực mật khẩu. Điều này sẽ ngăn người dùng đăng nhập bằng SSH bằng mật khẩu, nhằm an toàn hơn.

Để thực hiện việc này, hãy kết nối với server và mở file /etc/ssh/sshd_config với đặc quyền root hoặc sudo:

  • sudo nano /etc/ssh/sshd_config

Bên trong file, hãy tìm kiếm lệnh PasswordAuthentication . Bỏ ghi chú # trước dòng này nếu có, đặt thành no để tắt đăng nhập mật khẩu:

/etc/ssh/sshd_config
PasswordAuthentication no

Sau khi bạn đã thực hiện thay đổi, hãy lưu và đóng file. Để thực hiện các thay đổi, nên khởi động lại dịch vụ SSH.

Trên Ubuntu / Debian:

  • sudo service ssh restart

Trên CentOS / Fedora:

  • sudo service sshd restart

Bây giờ, tất cả các tài khoản trên hệ thống sẽ không thể đăng nhập bằng SSH bằng mật khẩu.

Thay đổi cổng SSH Daemon

Bạn nên thay đổi cổng mặc định mà SSH, giúp tránh, giảm số lần thử xác thực server từ các bot tự động thực hiện, chúng nhằm tấn công dò mật khẩu.

Để thay đổi cổng mà daemon SSH nghe trên đó (mặc định là port 22), bạn cần đăng nhập vào server của mình, mở file sshd_config với đặc quyền root, bằng cách đăng nhập với root hoặc bằng cách sử dụng sudo :

  • sudo nano /etc/ssh/sshd_config

Sau đó bạn có thể thay đổi cổng mà SSH chạy bằng cách tìm thông số Port 22 và sửa đổi nó để phản ánh cổng bạn muốn sử dụng. Ví dụ: để thay đổi cổng thành 4444 , hãy nhập vào file :

/etc/ssh/sshd_config
#Port 22
Port 4444

Lưu file, để thực hiện các thay đổi, bạn khởi động lại daemon SSH.

Trên Ubuntu/Debian:

  • sudo service ssh restart

Trên CentOS/Fedora:

  • sudo service sshd restart

Sau khi daemon khởi động lại, bạn sẽ cần phải xác thực bằng cách chỉ định số cổng (xem phần kết nối SSH trước).

Giới hạn người dùng kết nối SSH

Để giới hạn rõ ràng các tài khoản người dùng có thể đăng nhập thông qua SSH, bạn có thể thực hiện một số cách tiếp cận khác nhau, mỗi cách đều cần chỉnh sửa file cấu hình daemon SSH.

Trên server, hãy mở file này với đặc quyền root hoặc sudo:

  • sudo nano /etc/ssh/sshd_config

Cách đầu tiên để chỉ định các tài khoản được phép đăng nhập là sử dụng AllowUsers . Tìm kiếm dòng AllowUsers trong file. Nếu không tồn tại, hãy tạo dòng đó. Sau dòng đó, hãy liệt kê các tài khoản người dùng được phép đăng nhập thông qua SSH:

/etc/ssh/sshd_config
AllowUsers user1 user2

Lưu tập tin. Khởi động lại daemon để thực hiện các thay đổi.

Trên Ubuntu / Debian:

  • sudo service ssh restart

Trên CentOS / Fedora:

  • sudo service sshd restart

Nếu cần quản lý nhóm, bạn có thể sử dụng lệnh AllowGroups thay thế. Chỉ cần thêm một nhóm duy nhất sẽ được phép truy cập SSH (ta sẽ tạo nhóm này và thêm thành viên sau):

/etc/ssh/sshd_config
AllowGroups sshmembers

Lưu và đóng tập tin.

Bây giờ, bạn có thể tạo một nhóm hệ thống (không có thư mục chính) khớp với nhóm bạn đã chỉ định:

  • sudo groupadd -r sshmembers

Thêm tài khoản người dùng nào bạn cần vào nhóm này:

  • sudo usermod -a -G sshmembers user1
  • sudo usermod -a -G sshmembers user2

Khởi động lại daemon SSH để thực hiện các thay đổi .

Trên Ubuntu/Debian:

  • sudo service ssh restart

Trên CentOS/Fedora:

  • sudo service sshd restart

Tắt đăng nhập root

Bạn nên tắt hoàn toàn đăng nhập root thông qua SSH sau khi đã thiết lập tài khoản người dùng SSH có đặc quyền sudo .

Để thực hiện việc này, hãy mở file cấu hình bằng root hoặc sudo trên server .

  • sudo nano /etc/ssh/sshd_config

Tìm dòng PermitRootLogin . Nếu nó được comment # ở đầu, xóa comment # đi. Thay đổi giá trị thành “no”:

/etc/ssh/sshd_config
PermitRootLogin no

Lưu và đóng tập tin. Để thực hiện các thay đổi , hãy khởi động lại daemon SSH.

Trên Ubuntu / Debian:

  • sudo service ssh restart

Trên CentOS / Fedora:

  • sudo service sshd restart

Cho phép quyền truy cập root cho các lệnh cụ thể

Có một số trường hợp bạn có thể cần vô hiệu hóa quyền truy cập root nói chung, nhưng hãy bật nó để cho phép một số ứng dụng chạy chính xác.

Điều này có thể được thực hiện thông qua file authorized_keys của người dùng root, file này chứa các khóa SSH được phép sử dụng tài khoản.

Thêm khóa từ máy tính cục bộ mà bạn muốn sử dụng cho quá trình này (chúng tôi khuyên bạn nên tạo khóa mới cho mỗi quy trình tự động) vào file authorized_keys của người dùng root trên server. Ta dùng lệnh ssh-copy-id ở đây, nhưng bạn có thể sử dụng bất kỳ phương pháp sao chép khóa nào mà ta đã thảo luận:

  • ssh-copy-id root@remote_host

Bây giờ, đăng nhập vào server. Ta sẽ cần điều chỉnh mục nhập trong file authorized_keys quyền_key, vì vậy hãy mở mục nhập đó bằng quyền truy cập root hoặc sudo:

  • sudo nano /root/.ssh/authorized_keys

Ở đầu dòng có khóa bạn đã tải lên, hãy thêm command= list xác định lệnh mà khóa này hợp lệ. Điều này phải bao gồm đường dẫn đầy đủ đến file thực thi, cùng với các đối số:

/root/.ssh/authorized_keys
command="/path/to/command arg1 arg2" ssh-rsa ...

Lưu và đóng file khi hoàn tất.

Bây giờ, hãy mở file sshd_config với đặc quyền root hoặc sudo:

  • sudo nano /etc/ssh/sshd_config

Tìm chỉ thị PermitRootLogin và thay đổi giá trị thành forced-commands-only . Điều này sẽ chỉ cho phép đăng nhập khóa SSH sử dụng root khi một lệnh đã được chỉ định cho khóa:

/etc/ssh/sshd_config
PermitRootLogin forced-commands-only

Lưu và đóng tập tin. Khởi động lại daemon SSH để thực hiện các thay đổi .

Trên Ubuntu / Debian:

  • sudo service ssh restart

Trên CentOS / Fedora:

  • sudo service sshd restart

Chuyển tiếp Ứng dụng Đồ họa cho Client

Daemon SSH có thể được cấu hình để tự động chuyển tiếp hiển thị các ứng dụng X trên server đến client. Để điều này hoạt động chính xác, client phải có công cụ đồ họa.

Để bật chức năng này, hãy đăng nhập vào server và chỉnh sửa file sshd_config dưới dạng thư mục root hoặc với các đặc quyền sudo:

  • sudo nano /etc/ssh/sshd_config

Tìm kiếm lệnh X11Forwarding . Nếu nó được comment #, hãy bỏ #. Tạo nó chưa có, và đặt giá trị thành “yes”:

/etc/ssh/sshd_config
X11Forwarding yes

Lưu và đóng tập tin. Khởi động lại daemon SSH để thực hiện những thay đổi này.

Trên Ubuntu / Debian:

  • sudo service ssh restart

Trên CentOS / Fedora:

  • sudo service sshd restart

Để kết nối với server và chuyển tiếp màn hình của ứng dụng, bạn phải chuyển tùy chọn -X từ client khi kết nối:

  • ssh -X username@remote_host

Các ứng dụng đồ họa được khởi động trên server thông qua phiên này sẽ được hiển thị trên máy tính cục bộ. Hiệu suất có thể hơi chậm, nhưng nó rất hữu ích khi cần.

Tùy chọn cấu hình phía client

Trong phần tiếp theo, ta sẽ tập trung vào một số điều chỉnh có thể thực hiện ở phía client.

Xác định thông tin kết nối cho server

Trên máy tính của bạn (linux), bạn có thể xác định các cấu hình riêng lẻ cho một số hoặc tất cả server mà bạn kết nối. Các file này có thể được lưu trữ trong file ~/.ssh/config , được client SSH đọc mỗi khi nó được gọi.

Tạo hoặc mở file này trong trình soạn thảo văn bản trên máy tính bạn (linux) :

  • nano ~/.ssh/config

Bên trong, bạn có thể xác định các tùy chọn cấu hình riêng lẻ bằng cách giới thiệu từng tùy chọn với từ khóa Host , sau đó là bí danh. Bạn có thể xác định bất kỳ lệnh nào được tìm thấy trong hướng dẫn ssh_config :

  • man ssh_config

Một cấu hình ví dụ sẽ là:

~/.ssh/config
Host testhost
    HostName your_domain
    Port 4444
    User demo

Sau đó bạn có thể kết nối với your_domain trên cổng 4444 sử dụng tên người dùng demo bằng cách gõ:

  • ssh testhost

Bạn cũng có thể sử dụng các ký tự đại diện để khớp với nhiều server. Hãy nhớ rằng các config sau có thể thể ghi đè các config trước. Do đó, bạn nên đặt các config chung nhất của mình lên đầu. Ví dụ: bạn có thể đặt mặc định tất cả các kết nối để không cho phép chuyển tiếp X, với ghi đè cho your_domain trong file :

~/.ssh/config
Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

Lưu và đóng file khi bạn hoàn tất.

Giữ kết nối luôn tồn tại để tránh timeout

Nếu bị ngắt kết nối khỏi các phiên SSH, có thể do kết nối đã hết thời gian chờ.

Bạn có thể cấu hình client để gửi một gói đến server thường xuyên để tránh tình huống này:

Trên máy tính cục bộ, bạn có thể định cấu hình điều này cho mọi kết nối bằng cách chỉnh sửa file ~/.ssh/config:

  • nano ~/.ssh/config

Đặt dòng ServerAliveInterval thành “120” để gửi một gói đến server hai phút một lần. Điều này đủ để thông báo cho server không đóng kết nối:

~/.ssh/config
Host *
    ServerAliveInterval 120

Lưu và đóng file khi bạn hoàn tất.

Tắt kiểm tra server

Theo mặc định, khi nào bạn kết nối với server mới, bạn sẽ được hiển thị fingerprint khóa server của SSH daemon từ xa.

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 được định cấu hình để bạn có thể xác minh tính xác thực của server lưu trữ mà bạn kết nối và phát hiện các trường hợp mà người dùng tấn công có thể đang cố gắng giả dạng server (ví dụ kiểu Man in middle).

Trong một số trường hợp nhất định, bạn có thể cần tắt tính năng này. Lưu ý : Đây có thể là một rủi ro bảo mật, vì vậy hãy đảm bảo rằng bạn biết mình đang làm gì nếu bạn thiết lập hệ thống của mình như thế này.

Để thực hiện thay đổi, hãy mở file ~/.ssh/config trên máy tính cục bộ :

  • nano ~/.ssh/config

Đặt chỉ thị Kiểm tra StrictHostKeyChecking thành no để tự động thêm server mới vào file known_hosts . Đặt UserKnownHostsFile thành /dev/null để không cảnh báo về các server mới:

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Bạn có thể cho phép kiểm tra từng trường hợp cụ thể, bằng cách thay đổi các tùy chọn đó cho các server cần thiết. Mặc định cho Kiểm tra StrictHostKeyCheckingask :

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Host testhost
    HostName your_domain
    StrictHostKeyChecking ask
    UserKnownHostsFile /home/demo/.ssh/known_hosts

Ghép kênh SSH qua một kết nối TCP đơn

Có những tình huống mà việc thiết lập một kết nối TCP mới có thể mất nhiều thời gian hơn bạn muốn. Nếu bạn đang thực hiện nhiều kết nối với cùng một máy, bạn có thể tận dụng lợi thế của việc ghép kênh. Nghĩa là một kênh TCP trên máy của bạn có thể kết nối nhiều giao dịch SSH với các Server trên kênh đó.

Ghép kênh SSH sử dụng lại cùng một kết nối TCP cho nhiều phiên SSH. Điều này loại bỏ một số công việc cần thiết để thiết lập một phiên mới, có thể đẩy nhanh tốc độ. Giới hạn số lượng kết nối cũng có thể hữu ích vì những lý do khác.

Để thiết lập ghép kênh, bạn có thể thiết lập thủ công các kết nối hoặc bạn có thể định cấu hình ứng dụng khách của mình để tự động sử dụng ghép kênh khi có sẵn. Ta sẽ mô tả tùy chọn thứ hai ở đây.

Để định cấu hình ghép kênh, hãy chỉnh sửa file cấu hình client SSH trên máy bạn:

  • nano ~/.ssh/config

Nếu bạn chưa có định nghĩa server ký tự đại diện ở đầu file, hãy thêm một định nghĩa (dưới dạng Host * ). Ta sẽ thiết lập các giá trị ControlMaster , ControlPathControlPersist để thiết lập cấu hình ghép kênh.

ControlMaster nên được đặt thành “auto” để có thể tự động cho phép ghép kênh nếu có thể. ControlPath sẽ thiết lập đường dẫn đến socket điều khiển. Phiên đầu tiên sẽ tạo socket này và các phiên tiếp theo sẽ có thể tìm thấy nó vì nó được gắn nhãn bởi tên người dùng, server và cổng.

Đặt tùy chọn ControlPersist thành 1 sẽ cho phép kết nối chính ban đầu được chạy nền. 1 chỉ định rằng kết nối TCP sẽ tự động kết thúc một giây sau khi phiên SSH cuối cùng bị đóng:

/.ssh/config
Host *
    ControlMaster auto
    ControlPath ~/.ssh/multiplex/%r@%h:%p
    ControlPersist 1

Lưu và đóng file khi bạn hoàn tất. Bây giờ, chúng ta cần thực sự tạo thư mục mà chúng ta đã chỉ định trong đường dẫn điều khiển:

  • mkdir ~/.ssh/multiplex

Giờ đây, bất kỳ phiên nào được thiết lập với cùng một máy sẽ cố gắng sử dụng kết nối TCP và socket hiện có. Khi phiên cuối cùng tồn tại, kết nối sẽ bị ngắt sau một giây.

Nếu vì lý do nào đó, bạn cần tạm thời bỏ qua cấu hình ghép kênh, bạn có thể chuyển cờ -Snone :

  • ssh -S none username@remote_host

Thiết lập đường hầm (tunnel) SSH

Tạo đường hầm (tunnel) cho lưu lượng truy cập thông qua tunnel SSH an toàn, là một cách hay để giải quyết các luật của firewall. Nó cũng là một cách tốt để mã hóa giao dịch mạng không được mã hóa.

Định cấu hình đường hầm (tunnel) cục bộ tới server

Kết nối SSH có thể được sử dụng để tạo đường hầm (tunnel) truyền dữ liệu. SSH Server sẽ là trung gian truyền dữ liệu giữa Máy tính cục bộ và server Bên ngoài, đây gọi là cơ chế Tunnel (đường hầm)

Kết nối cục bộ là truy cập Từ máy tính cục bộ đến qua server . Đầu tiên, kết nối SSH được thiết lập từ máy tính cục bộ tới server. Tiếp đó, trên server, một kết nối được thực hiện với một địa chỉ bên ngoài (hoặc nội bộ) do người dùng cung cấp, và lưu lượng truy cập đến vị trí Bên ngoài này được truyền trở lại máy tính cục bộ, trên một cổng được chỉ định.

Một cách sử dụng phổ biến là truy cập web từ server cục bộ ra bên ngoài.

Để thiết lập một tunnel tới server, bạn cần sử dụng tham số -L khi kết nối và cung cấp ba thông tin bổ sung:

  • Cổng cục bộ nơi bạn muốn truy cập vào kết nối đường hầm (tunnel).
  • Server mà bạn muốn server từ xa của mình kết nối.
  • Cổng mà bạn muốn server của mình kết nối.

Theo thứ tự ở trên (phân tách bằng dấu hai chấm), làm đối số cho cờ -L . Chúng tôi cũng sẽ sử dụng cờ -f , cờ này làm SSH đi vào nền trước khi thực thi và cờ -N , không mở shell hoặc thực thi chương trình ở phía từ xa.

Ví dụ: để kết nối với your_domain trên cổng 80 trên server , làm cho kết nối khả dụng trên máy cục bộ trên cổng 8888, bạn có thể nhập:

  • ssh -f -N -L 8888:your_domain:80 username@remote_host

Bây giờ, nếu bạn trỏ trình duyệt web cục bộ của mình đến 127.0.0.1:8888 , bạn sẽ thấy bất kỳ nội dung nào ở your_domain trên cổng 80 .

Hướng dẫn chung hơn về cú pháp là:

  • ssh -L your_port:site_or_IP_to_access:site_port username@host

Vì kết nối ở chế độ nền, bạn sẽ phải tìm PID của nó để loại bỏ nó. Bạn có thể làm như vậy bằng cách tìm kiếm cổng mà bạn đã chuyển tiếp:

  • ps aux | grep 8888
Output
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -L 8888:your_domain:80 username@remote_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Sau đó, bạn có thể kết thúc quá trình bằng cách nhắm mục tiêu PID, là số trong cột thứ hai của dòng khớp với lệnh SSH :

  • kill 5965

Một tùy chọn khác là bắt đầu kết nối mà không có cờ -f . Điều này sẽ giữ kết nối ở phía trước, ngăn bạn sử dụng cửa sổ đầu cuối trong suốt thời gian chuyển tiếp. Lợi ích của việc này là bạn có thể dễ dàng tiêu diệt đường hầm (tunnel) bằng cách gõ CTRL-C .

Định cấu hình đường hầm (tunnel) từ xa tới server

Kết nối SSH có thể được sử dụng để tạo đường hầm (tunnel) lưu lượng truy cập từ các cổng trên server cục bộ đến các cổng trên server.

Trong một đường hầm (tunnel) từ xa, một kết nối được thực hiện với server. Trong quá trình tạo đường hầm (tunnel), một cổng từ xa được chỉ định. Cổng này, trên server, sau đó sẽ được kết nối với server lưu trữ và kết hợp cổng được kết nối từ máy tính cục bộ. Điều này sẽ cho phép máy tính từ xa truy cập vào một server thông qua máy tính cục bộ .

Điều này có thể hữu ích nếu bạn cần cho phép truy cập vào mạng nội bộ bị khóa với các kết nối bên ngoài. Nếu firewall cho phép các kết nối ngoài mạng, điều này sẽ cho phép bạn kết nối với một máy từ xa và lưu lượng đường hầm (tunnel) từ máy đó đến một vị trí trong mạng nội bộ.

Để thiết lập một đường hầm (tunnel) từ xa tới server , bạn cần sử dụng tham số -R khi kết nối và bạn phải cung cấp ba phần thông tin bổ sung:

  • Cổng mà server có thể truy cập vào kết nối đường hầm (tunnel).
  • Server lưu trữ mà bạn muốn máy tính cục bộ của mình kết nối.
  • Cổng mà bạn muốn máy tính cục bộ của mình kết nối.

Chúng được đưa ra, theo thứ tự ở trên (phân tách bằng dấu hai chấm), làm đối số cho cờ -R . Chúng tôi cũng sẽ sử dụng cờ -f , cờ này khiến SSH đi vào nền trước khi thực thi, và cờ -N , không mở shell hoặc thực thi chương trình ở phía từ xa.

Ví dụ: để kết nối với your_domain cổng 80 từ server, đi qua cổng 8888 trên server, bạn có thể nhập:

  • ssh -f -N -R 8888:your_domain:80 username@remote_host

Bây giờ, trên máy bạn, mở trình duyệt web tới 127.0.0.1:8888 sẽ cho phép bạn xem bất kỳ nội dung nào tại your_domain trên cổng 80 .

Hướng dẫn chung về cú pháp là:

  • ssh -R remote_port:site_or_IP_to_access:site_port username@host

Muốn ngắt tunnel, vì kết nối ở chế độ nền, bạn sẽ phải tìm PID của nó để kill. Có thể tìm bằng khách tìm kiếm cổng đã chuyển tiếp:

  • ps aux | grep 8888
Output
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -R 8888:your_domain:80 username@remote_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Với PID thấy trên, bạn có thể kết thúc quá trình bằng kill PID:

  • kill 5965

Một tùy chọn khác là bắt đầu kết nối mà không có cờ -f , sẽ giữ kết nối ở dòng lệnh console hiện tại (mà không vào chế độ nền - background). Lợi ích của việc này là bạn có thể dễ dàng dừng tunnel bằng cách gõ CTRL-C .

Dấu hình đường hầm (tunnel) động tới server

Kết nối SSH có thể được sử dụng để tạo đường hầm (tunnel) truy cập từ các cổng trên server cục bộ đến các cổng trên server.

Đường hầm (tunnel) động tương tự như đường hầm (tunnel) cục bộ ở chỗ nó cho phép máy tính cục bộ kết nối với các tài nguyên khác thông qua một server. Một đường hầm (tunnel) động thực hiện điều này bằng cách chỉ định một cổng cục bộ duy nhất. Các ứng dụng muốn tận dụng cổng này để đào đường hầm (tunnel) phải có khả năng giao tiếp bằng giao thức SOCKS để các gói tin có thể được chuyển hướng chính xác ở phía bên kia của đường hầm (tunnel).

Lưu lượng được chuyển đến cổng cục bộ này sẽ được gửi đến server. Từ đó, giao thức SOCKS sẽ được diễn giải để thiết lập kết nối đến vị trí mong muốn. Thiết lập này cho phép ứng dụng hỗ trợ SOCKS kết nối với bất kỳ đâu thông qua server mà không cần nhiều đường hầm (tunnel) tĩnh.

Để thiết lập kết nối, chúng ta sẽ chuyển cờ -D cùng với cổng cục bộ nơi chúng ta muốn truy cập vào đường hầm (tunnel). Ta cũng sẽ sử dụng cờ -f , cờ này khiến SSH đi vào nền trước khi thực thi và cờ -N , không mở shell hoặc thực thi chương trình ở phía từ xa.

Ví dụ, để thiết lập một đường hầm (tunnel) trên cổng 7777 , bạn có thể nhập:

  • ssh -f -N -D 7777 username@remote_host

Từ đây, bạn có thể bắt đầu trỏ ứng dụng nhận biết SOCKS của mình (như trình duyệt web) tới cổng bạn đã chọn. Ứng dụng sẽ gửi thông tin của nó vào một socket được liên kết với cổng.

Phương pháp chuyển hướng lưu lượng đến cổng SOCKS sẽ khác nhau tùy theo ứng dụng. Ví dụ, trong Firefox, vị trí chung là Tùy chọn> Nâng cao> Cài đặt> Cấu hình proxy thủ công. Trong Chrome, bạn có thể khởi động ứng dụng với bộ --proxy-server= . Bạn sẽ muốn sử dụng giao diện localhost và cổng bạn đã chuyển tiếp.

Muốn dừng tunnel, vì kết nối ở chế độ nền, bạn sẽ phải tìm PID của nó để dừng nó. Bạn có thể làm như vậy bằng cách tìm kiếm cổng mà bạn đã chuyển tiếp:

  • ps aux | grep 8888
Output
1001      5965  0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -D 7777 username@remote_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

Và kill tiến trình với PID tìm được :

  • kill 5965

Tùy chọn khác là bắt đầu kết nối mà không có cờ -f . Điều này sẽ giữ kết nối ở ngay dòng lệnh hiện tại. Lợi ích của việc này là ta có thể dễ dàng dừng tunnel bằng cách gõ CTRL-C .

Kết luận

Các hướng dẫn trên bao gồm phần lớn thông tin mà hầu hết chúng ta cần về SSH. Nếu bạn có các thủ thuật khác hoặc muốn chia sẻ các cấu hình và phương pháp yêu thích của mình, hãy sử dụng các bình luận bên dưới đây.


Tags: SSH

Các tin trước

Cách cài đặt SSH Key trên Centos 8, đăng nhập không cần password! 2020-09-27

Cài đặt bảo mật cơ bản cho Centos 8 2020-09-27

Lập lịch với Crontab trên Centos 8 2020-09-27

Bảo mật Apache với Lets Encrypt trên Centos 8 2020-09-19

Tạo chứng chỉ số tự ký trên Apache Centos 8 (self-signed-ssl-certificate) 2020-09-19

Tối ưu SQL với Index, FullText Search 2020-08-10

Bảo mật Apache với Lets Encrypt 2020-08-06

Cài đặt Node.js trên Ubuntu 18.04 2020-08-06

Thực hành bài LAB Toàn tập Select SQL Query 2020-08-05

Cài đặt XAMPP Trên Hệ điều hành Windows 2020-08-05