SSH Essentials: Hướng dẫn kết nối và quản lý SSH Keys trên Linux

SSH Essentials

SSH là giao thức bảo mật được sử dụng làm phương tiện chính để kết nối từ xa tới các máy chủ Linux. Nó cung cấp giao diện dựa trên văn bản bằng cách khởi tạo một shell từ xa. Sau khi kết nối, tất cả các lệnh bạn gõ trên terminal cục bộ sẽ được gửi đến máy chủ từ xa và thực thi ở đó.

Trong hướng dẫn dạng cheat sheet này, chúng ta sẽ trình bày một số cách kết nối với SSH để đạt được mục tiêu của bạn. Hướng dẫn này có thể được sử dụng như một tài liệu tham khảo nhanh khi bạn cần biết cách kết nối hoặc cấu hình máy chủ theo các cách khác nhau.

Triển khai ứng dụng frontend của bạn từ GitHub bằng DataOnline App Platform. Hãy để DataOnline lo việc mở rộng ứng dụng của bạn.

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

  • Đọc phần Tổng Quan về SSH trước nếu bạn chưa quen với SSH hoặc mới bắt đầu.
  • Sử dụng các phần tiếp theo phù hợp với mục tiêu của bạn. Hầu hết các phần không phụ thuộc lẫn nhau, vì vậy bạn có thể dùng chúng một cách độc lập.
  • Sử dụng mục “Contents” ở bên trái (với màn hình rộng) hoặc chức năng tìm kiếm của trình duyệt để định vị phần cần thiết.
  • Copy và dán các ví dụ dòng lệnh được đưa ra, thay thế các giá trị được đánh dấu bằng 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 một máy chủ 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 để thực thi lệnh, thay đổi cấu hình và quản lý dịch vụ từ xa. Khi bạn kết nối qua SSH, bạn đăng nhập bằng một tài khoản tồn tại trên máy chủ từ xa.

Cách SSH hoạt động

Khi kết nối qua SSH, bạn sẽ được đưa vào một phiên shell – giao diện dựa trên văn bản cho phép bạn tương tác với máy chủ. Trong suốt phiên SSH, tất cả các lệnh bạn gõ trên terminal cục bộ sẽ được gửi qua một kênh mã hóa và thực thi trên máy chủ.

Kết nối SSH được triển khai theo mô hình client-server. Điều này có nghĩa là để thiết lập kết nối SSH, máy chủ từ xa phải chạy phần mềm gọi là SSH daemon. 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ể, xác thực các yêu cầu kết nối và khởi tạo môi trường thích hợp nếu người dùng cung cấp thông tin xác thực đúng.

Máy tính của người dùng phải có một SSH client – phần mềm biết cách giao tiếp theo giao thức SSH, cho phép bạn cung cấp thông tin về máy chủ từ xa, tên người dùng cũng như các thông tin xác thực cần thiết. Client cũng có thể chỉ định một số chi tiết về loại kết nối mà bạn muốn thiết lập .

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

Các client thường xác thực bằng cách sử dụng mật khẩu (ít an toàn và không được khuyến nghị) hoặc SSH keys, vốn an toàn hơn nhiều.

  • Đăng nhập bằng mật khẩu được mã hóa và dễ hiểu đối với người mới, nhưng các bot tự động và kẻ xâm nhập thường cố gắng đăng nhập nhiều lần bằng mật khẩu, dẫn đến nguy cơ bị tấn công.
  • Vì lý do này, chúng tôi khuyến nghị luôn sử dụng xác thực dựa trên SSH key cho hầu hết các cấu hình.

SSH keys là một cặp khóa mật mã, gồm một public key và một private key. Public key có thể được chia sẻ tự do, trong khi private key phải được bảo vệ cẩn thận và không bao giờ được tiết lộ. Để xác thực bằng SSH keys, người dùng cần có cặp khóa SSH trên máy cục bộ và trên máy chủ từ xa, public key phải được sao chép vào tệp ~/.ssh/authorized_keys (một danh sách các public key được phép đăng nhập vào tài khoản đó) .

Khi một client kết nối và yêu cầu sử dụng xác thực bằng SSH key, nó thông báo cho máy chủ về ý định này và chỉ định public key nào sẽ được sử dụng. Máy chủ sẽ kiểm tra tệp authorized_keys để tìm public key, tạo một chuỗi ngẫu nhiên và mã hóa chuỗi đó 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. Máy chủ sau đó gửi thông điệp đã mã hóa cho client để kiểm tra xem client có thực sự sở hữu private key hay không. Khi nhận được thông điệp, client giải mã bằng private key, kết hợp chuỗi ngẫu nhiên với session ID đã đàm phán trước đó, tạo ra một giá trị MD5 và gửi lại máy chủ. Máy chủ so sánh giá trị MD5 này với giá trị mong đợi để xác định rằng client có private key chính xác.

SSH Key Pair

Sinh và sử dụng SSH Keys

Sinh cặp SSH Key

Sinh một cặp public và private key trên máy tính cục bộ là bước đầu tiên để xác thực với máy chủ từ xa mà không cần mật khẩu. Trừ khi có lý do đặc biệt, bạn nên luôn xác thực bằng SSH keys.

Có nhiều thuật toán mật mã có thể dùng để sinh SSH keys (RSA, DSA, ECDSA…); RSA thường được ưu tiên và là loại khóa mặc định.
Để sinh cặp khóa RSA trên máy cục bộ, gõ:

ssh-keygen

Khi chạy lệnh, bạn sẽ thấy thông báo:

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

Nhấn ENTER để chấp nhận vị trí mặc định (thư mục ẩn .ssh trong thư mục home).
Sau đó, bạn sẽ được yêu cầu nhập passphrase (có thể để trống nếu không muốn):

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

Nếu bạn nhập passphrase, không có ký tự nào hiển thị vì lý do bảo mật.
Sau khi hoàn tất, bạn sẽ nhận được thông báo:

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+    |
+-----------------+
  • ~/.ssh/id_rsa: Đây là private key. KHÔNG CHIA SẺ TỆP NÀY!
  • ~/.ssh/id_rsa.pub: Đây là public key, có thể chia sẻ tự do.

Lưu ý: Bạn có thể tham khảo hướng dẫn “Tạo SSH keys với OpenSSH trên macOS hoặc Windows Subsystem” nếu cần thêm.

Sinh SSH Key với số Bit lớn hơn

SSH keys mặc định có 2048 bit, được xem là đủ an toàn. Tuy nhiên, bạn có thể chỉ định số bit lớn hơn (ví dụ 4096 bit) để tăng cường bảo mật:

ssh-keygen -b 4096

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

Overwrite (y/n)?

Nếu chọn “yes”, khóa cũ sẽ bị ghi đè và bạn sẽ không thể đăng nhập với khóa đó nữa. Hãy cẩn thận khi ghi đè.

Xóa hoặc thay đổi Passphrase của Private Key

Nếu bạn đã tạo một passphrase cho private key của mình và muốn thay đổi hoặc loại bỏ nó, bạn có thể làm điều đó một cách dễ dàng.

Lưu ý: Để thay đổi hoặc loại bỏ passphrase, bạn phải biết passphrase ban đầu. Nếu bạn mất passphrase của key, sẽ không có cách khắc phục nào và bạn sẽ phải tạo một cặp key mới.

Để thay đổi hoặc loại bỏ passphrase, chỉ cần gõ:

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

Bạn có thể nhập vị trí của key mà bạn muốn thay đổi hoặc nhấn ENTER để chấp nhận giá trị mặc định.

Enter old passphrase:

Nhập passphrase cũ mà bạn muốn thay đổi. Sau đó, bạn sẽ được yêu cầu nhập passphrase mới:

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

Tại đây, nhập passphrase mới của bạn hoặc nhấn ENTER để loại bỏ passphrase.

Hiển thị dấu vân tay (Fingerprint) của SSH Key

Mỗi cặp SSH key có “dấu vân tay” duy nhất. Để xem dấu vân tay, sử dụng:

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

Khi được hỏi vị trí của khóa, nhấn ENTER nếu đúng (ví dụ: /root/.ssh/id_rsa), bạn sẽ nhận được chuỗi thông tin gồm số bit, dấu vân tay, tài khoản & host và thuật toán sử dụng:

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

Sao chép Public SSH Key lên máy chủ sử dụng ssh-copy-id

Nếu máy chủ cho phép đăng nhập bằng mật khẩu và tiện ích ssh-copy-id có sẵn, gõ:

ssh-copy-id username@remote_host

Lệnh này sẽ yêu cầu bạn nhập mật khẩu của tài khoản trên máy chủ từ xa. Quá trình sẽ tự động thêm nội dung của tệp ~/.ssh/id_rsa.pub vào tệp ~/.ssh/authorized_keys và hiển thị:

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:

Bây giờ, bạn có thể đăng nhập mà không cần mật khẩu.

Sao chép Public Key không dùng SSH-Copy-Id

Nếu không có ssh-copy-id, bạn có thể dùng lệnh:

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

Lệnh này sẽ yêu cầu bạn nhập mật khẩu cho tài khoản trên máy chủ từ xa. Sau khi nhập mật khẩu, public key của bạn sẽ được thêm vào cuối tệp authorized_keys.

Bạn sẽ được yêu cầu nhậ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, key của bạn 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

Sao chép Public Key thủ công

Nếu bạn không có quyền truy cập đăng nhập bằng mật khẩu, hãy mở tệp public key bằng:

cat ~/.ssh/id_rsa.pub
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

Sao chép toàn bộ nội dung được hiển thị và dán vào tệp ~/.ssh/authorized_keys trên máy chủ từ xa (có thể qua giao diện web console của DataOnline). Trước tiên, tạo thư mục nếu chưa có:

mkdir -p ~/.ssh

Sau đó, thêm nội dung:

echo public_key_string >> ~/.ssh/authorized_keys

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

Kết nốI đến máy chủ từ xa

Để kết nối và mở một phiên shell, gõ:

ssh remote_host

Nếu tên người dùng khác giữa máy cục bộ và máy chủ, dùng:

ssh username@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

Lần đầu kết nối, bạn sẽ thấy thông báo xác thực host. Nhập “yes” để chấp nhận. Nếu đăng nhập bằng mật khẩu, nhập mật khẩu; nếu dùng SSH keys, bạn có thể được yêu cầu nhập passphrase (nếu có).

Chạy một lệnh trên máy chủ từ xa

Để chạy một lệnh duy nhất thay vì mở shell, gõ:

ssh username@remote_host command_to_run

Lệnh sẽ kết nối, xác thực và thực thi lệnh, sau đó đóng kết nối.

Đăng nhập với cổng khác

Mặc định, SSH sử dụng cổng 22. Nếu máy chủ sử dụng cổng khác, chỉ định cổng bằng tham số -p:

ssh -p port_num username@remote_host

Để không phải nhập cổng mỗi lần, bạn có thể chỉnh sửa tệp ~/.ssh/config:

nano ~/.ssh/config

Sau đó, chỉ cần gõ ssh remote_alias để kết nối.

Host remote_alias
    HostName remote_host
    Port port_num

Thêm SSH Keys vào SSH Agent

Nếu private key của bạn có passphrase, bạn sẽ được yêu cầu nhập mỗi lần kết nối. Để tránh lặp đi lặp lại, hãy khởi chạy SSH agent:

eval $(ssh-agent)

Ví dụ:

Agent pid 10891

Sau đó, thêm private key vào agent:

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

Nhập passphrase khi được yêu cầu. Sau đó, bạn có thể đăng nhập mà không cần nhập lại passphrase.

Chuyển tiếp thông tin xác thực SSH của bạn để sử dụng trên một máy chủ

Để đăng nhập vào một máy chủ từ máy chủ khác mà không cần mật khẩu, sử dụng tùy chọn -A khi kết nối:

ssh -A username@remote_host

Sau đó, bạn có thể đăng nhập đến bất kỳ máy chủ nào mà SSH key của bạn được ủy quyền, như thể private key của bạn đang ở trên máy chủ đó.

Các tùy chọn cấu hình phía máy chủ

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

Vô hiệu hóa xác thực bằng mật khẩu

Nếu bạn đã cấu hình, kiểm tra và xác nhận SSH keys hoạt động tốt, thì tốt nhất là nên vô hiệu hóa xác thực bằng mật khẩu. Việc này sẽ ngăn chặn bất kỳ người dùng nào đăng nhập SSH bằng mật khẩu.

Để thực hiện, hãy kết nối đến máy chủ từ xa và mở tệp cấu hình /etc/ssh/sshd_config với quyền root hoặc sudo:

sudo nano /etc/ssh/sshd_config

Bên trong tệp, tìm chỉ thị PasswordAuthentication. Nếu nó bị chú thích (có dấu #), hãy bỏ chú thích và đặt giá trị thành no để vô hiệu hóa đăng nhập bằng mật khẩu:

PasswordAuthentication no

Sau khi thay đổi, lưu và đóng tệp. Để áp dụng thay đổi, bạn cầ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

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

Thay đổi cổng mà SSH Daemon chạy

Một số quản trị viên gợi ý thay đổi cổng mặc định mà SSH chạy (mặc định là cổng 22). Việc này có thể giúp giảm số lượng nỗ lực xác thực mà máy chủ phải chịu từ các bot tự động.

Để thay đổi cổng mà SSH daemon lắng nghe, bạn cần đăng nhập vào máy chủ từ xa. Mở tệp sshd_config trên máy chủ với quyền root hoặc sudo:

sudo nano /etc/ssh/sshd_config

Khi đã vào tệp, bạn có thể thay đổi cổng bằng cách tìm dòng quy định cổng 22 và sửa đổi nó thành cổng bạn mong muốn. Ví dụ, để đổi sang cổng 4444, bạn ghi vào tệp:

#Port 22
Port 4444

Lưu và đóng tệp khi hoàn tất. Để áp dụng thay đổi, khởi động lại SSH daemon.

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 cần xác thực bằng cách chỉ định số cổng (như đã trình bày ở phần trước).

Giới hạn các tài khoản có thể kết nốI qua SSH

Để giới hạn rõ ràng các tài khoản được phép đăng nhập qua SSH, bạn có thể sử dụng một vài cách, tất cả đều liên quan đến việc chỉnh sửa tệp cấu hình của SSH daemon.

Trên máy chủ từ xa, mở tệp với quyền root hoặc sudo:

sudo nano /etc/ssh/sshd_config

Phương pháp đầu tiên là sử dụng chỉ thị AllowUsers. Tìm chỉ thị này trong tệp (nếu chưa có, bạn có thể tạo mới ở bất cứ đâu), sau đó liệt kê các tài khoản được phép đăng nhập qua SSH, ví dụ:

AllowUsers user1 user2

Lưu và đóng tệp. Sau đó khởi động lại daemon để thay đổi có hiệu lực.

Trên Ubuntu/Debian:

sudo service ssh restart

Trên CentOS/Fedora:

sudo service sshd restart

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

AllowGroups sshmembers

Lưu và đóng tệp.

Sau đó, tạo một nhóm hệ thống (không có thư mục home) trùng với tên nhóm đã chỉ định:

sudo groupadd -r sshmembers

Hãy đảm bảo thêm các tài khoản cần thiết vào nhóm này:

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

Cuối cùng, khởi động lại SSH daemon.

Trên Ubuntu/Debian:

sudo service ssh restart

Trên CentOS/Fedora:

sudo service sshd restart

Vô hiệu hóa đăng nhập Root

Thông thường, sau khi bạn đã thiết lập tài khoản người dùng SSH có quyền sudo, nên vô hiệu hóa hoàn toàn đăng nhập root qua SSH.

Để thực hiện, mở tệp cấu hình SSH daemon với quyền root hoặc sudo:

sudo nano /etc/ssh/sshd_config

Tìm chỉ thị PermitRootLogin. Nếu dòng này bị chú thích, hãy bỏ chú thích và thay đổi giá trị thành “no”:

PermitRootLogin no

Lưu và đóng tệp. Khởi động lại SSH daemon để áp dụng thay đổi.

Trên Ubuntu/Debian:

sudo service ssh restart

Trên CentOS/Fedora:

sudo service sshd restart

Cho phép đăng nhập root cho một số lệnh cụ thể

Có một số trường hợp bạn có thể muốn vô hiệu hóa đăng nhập root chung chung, nhưng cho phép root sử dụng cho một số lệnh nhất định (ví dụ như quy trình backup).

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

Thêm SSH key từ máy cục bộ mà bạn muốn dùng cho quy trình này vào tệp authorized_keys của root trên máy chủ. (Chúng tôi khuyến nghị tạo một key mới cho mỗi quy trình tự động.) Ví dụ, sử dụng lệnh ssh-copy-id:

ssh-copy-id root@remote_host

Sau đó, đăng nhập vào máy chủ từ xa và mở tệp authorized_keys của root với quyền root hoặc sudo:

sudo nano /root/.ssh/authorized_keys

Ở đầu dòng chứa key bạn vừa sao chép, thêm tùy chọn command= xác định lệnh mà key đó được phép thực hiện. Tùy chọn này phải bao gồm đường dẫn đầy đủ đến executable cùng với các tham số cần thiết:

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

Lưu và đóng tệp.

Tiếp theo, mở tệp cấu hình SSH daemon:

sudo nano /etc/ssh/sshd_config

Tìm chỉ thị PermitRootLogin và thay đổi thành:

PermitRootLogin forced-commands-only

Lưu và đóng tệp, sau đó khởi động lại SSH daemon.

Trên Ubuntu/Debian:

sudo service ssh restart

Trên CentOS/Fedora:

sudo service sshd restart

Chuyển tiếp hiển thị ứng dụng X tới máy Client

SSH daemon có thể được cấu hình để tự động chuyển tiếp hiển thị của các ứng dụng X từ máy chủ đến máy client. Để chức năng này hoạt động đúng, máy client phải có hệ thống X Windows được cấu hình và kích hoạt.

Để kích hoạt, đăng nhập vào máy chủ từ xa và mở tệp sshd_config với quyền root hoặc sudo:

sudo nano /etc/ssh/sshd_config

Tìm chỉ thị X11Forwarding. Nếu dòng này bị chú thích, bỏ chú thích (hoặc tạo mới nếu cần) và đặt giá trị thành “yes”:

X11Forwarding yes

Lưu và đóng tệp. Khởi động lại SSH daemon để áp dụng thay đổi.

Trên Ubuntu/Debian:

sudo service ssh restart

Trên CentOS/Fedora:

sudo service sshd restart

Để kết nối và chuyển tiếp hiển thị ứng dụng, hãy dùng tùy chọn -X khi kết nối:

ssh -X username@remote_host

Các ứng dụng đồ họa được khởi chạy trên máy chủ trong phiên này sẽ hiển thị trên máy client, mặc dù hiệu năng có thể hơi chậm trong một số trường hợp.

Các tùy chọn cấu hình phía Client

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

Định nghĩa thông tin kết nối riêng cho máy chủ

Trên máy tính cục bộ của bạn, bạn có thể định nghĩa các cấu hình riêng cho một số hoặc tất cả các máy chủ mà bạn kết nối. Các cấu hình này có thể được lưu trong tệp ~/.ssh/config, tệp này sẽ được SSH client đọc mỗi khi nó được gọi.

Tạo hoặc mở tệp này trong trình soạn thảo văn bản trên máy cục bộ của bạn:

nano ~/.ssh/config

Bên trong, bạn có thể định nghĩa các tùy chọn cấu hình riêng bằng cách bắt đầu mỗi mục với từ khóa Host, theo sau là một bí danh. Phía dưới (được thụt lề), bạn có thể định nghĩa bất kỳ chỉ thị nào được liệt kê trong trang hướng dẫn man ssh_config:

man ssh_config

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

Host testhost
    HostName your_domain
    Port 4444
    User demo

Bạn có thể kết nối đến your_domain qua cổng 4444 với tài khoản demo chỉ bằng cách gõ:

ssh testhost

Bạn cũng có thể sử dụng ký tự đại diện (wildcards) để khớp với nhiều máy chủ. Lưu ý rằng các cấu hình sau có thể ghi đè cấu hình trước đó, vì vậy bạn nên đặt các cấu hình chung nhất ở đầu tệp. Ví dụ, bạn có thể đặt mặc định cho tất cả các kết nối là không cho phép chuyển tiếp X (X forwarding), rồi đặt một ngoại lệ cho your_domain như sau:

Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

Sau khi hoàn tất, lưu và đóng tệp.

Giữ kết nối không bị ngắt (Timeout)

Nếu bạn thấy rằng phiên SSH của mình bị ngắt trước khi bạn muốn, có thể do kết nối bị timeout.

Bạn có thể cấu hình SSH client gửi một gói tin đến máy chủ định kỳ để tránh tình trạng này:

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

nano ~/.ssh/config

Nếu tệp chưa có, hãy định nghĩa một phần áp dụng cho tất cả các host ở đầu tệp và đặt tham số ServerAliveInterval thành “120” (nghĩa là gửi gói tin mỗi 2 phút). Điều này đủ để thông báo cho máy chủ không đóng kết nối:

Host *
    ServerAliveInterval 120

Sau đó, lưu và đóng tệp.

Vô hiệu hóa kiểm tra Host Key

Theo mặc định, mỗi khi bạn kết nối tới một máy chủ mới, SSH client sẽ hiển thị dấu vân tay (fingerprint) của SSH daemon từ xa, giúp bạn xác minh tính xác thực của host và nhận diện các trường hợp kẻ xấu có thể cố gắng giả mạo máy chủ.

Ví dụ:

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

Trong một số trường hợp, bạn có thể muốn vô hiệu hóa chức năng này. Lưu ý: Điều này có thể gây rủi ro bảo mật lớn, vì vậy hãy chắc chắn rằng bạn hiểu rõ những gì mình làm.

Để thay đổi, mở tệp ~/.ssh/config trên máy cục bộ:

nano ~/.ssh/config

Nếu tệp chưa có, hãy định nghĩa một phần áp dụng cho tất cả các host ở đầu tệp và đặt chỉ thị StrictHostKeyChecking thành no để tự động thêm host mới vào tệp known_hosts. Đồng thời, đặt UserKnownHostsFile thành /dev/null để không cảnh báo khi host mới hoặc thay đổi:

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Bạn có thể kích hoạt lại chức năng này theo từng trường hợp bằng cách đảo ngược các tùy chọn cho các host cụ thể. Mặc định, StrictHostKeyCheckingask.

Ví dụ:

Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

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

Multiplexing SSH qua một kết nối TCP

Có những trường hợp thiết lập một kết nối TCP mới mất nhiều thời gian hơn bạn mong muốn. Nếu bạn thường kết nối nhiều lần tới cùng một máy chủ, bạn có thể tận dụng tính năng multiplexing.

SSH multiplexing tái sử dụng cùng một kết nối TCP cho nhiều phiên SSH, giúp giảm bớt công việc thiết lập phiên mới và có thể tăng tốc quá trình kết nối. Giới hạn số lượng kết nối cũng có thể hữu ích cho các lý do khác.

Để thiết lập multiplexing, bạn có thể cấu hình SSH client tự động sử dụng multiplexing khi có thể. Ví dụ, mở tệp cấu hình:

nano ~/.ssh/config

Nếu tệp chưa có định nghĩa cho tất cả các host, hãy thêm:

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

Tham số:

  • ControlMaster auto: Tự động cho phép multiplexing.
  • ControlPath: Xác định đường dẫn cho socket điều khiển, được đặt theo tên người dùng, host và cổng.
  • ControlPersist 1: Cho phép kết nối master chuyển sang background và tự động kết thúc sau 1 giây khi phiên SSH cuối cùng đóng.

Sau khi lưu và đóng tệp, bạn cần tạo thư mục được chỉ định trong ControlPath:

mkdir ~/.ssh/multiplex

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

Nếu bạn cần tạm thời bỏ qua cấu hình multiplexing, hãy dùng tham số -S none:

ssh -S none username@remote_host
Thiết lập Tunnels SSH

Việc chuyển tiếp lưu lượng khác qua một Tunnels SSH bảo mật là một cách tuyệt vời để vượt qua các thiết lập tường lửa hạn chế. Nó cũng là cách tuyệt vời để mã hóa lưu lượng mạng vốn không được mã hóa.

Cấu hình chuyển tiếp cục bộ đến máy chủ

Các kết nối SSH có thể được sử dụng để chuyển tiếp lưu lượng từ các cổng trên máy cục bộ đến các cổng trên máy chủ từ xa.

Một kết nối cục bộ cho phép bạn truy cập đến một vị trí mạng từ máy tính cục bộ của bạn thông qua máy chủ từ xa. Đầu tiên, một kết nối SSH được thiết lập đến máy chủ từ xa. Trên máy chủ đó, một kết nối sẽ được thực hiện đến một địa chỉ mạng bên ngoài (hoặc nội bộ) do người dùng cung cấp và lưu lượng đến địa chỉ đó sẽ được chuyển tiếp về máy cục bộ của bạn qua một cổng xác định.

Điều này thường được sử dụng để chuyển tiếp đến một môi trường mạng ít hạn chế hơn bằng cách vượt qua tường lửa. Một ứng dụng phổ biến khác là truy cập giao diện web “chỉ localhost” từ một vị trí từ xa.

Để thiết lập một Tunnels cục bộ đến máy chủ từ xa, bạn cần sử dụng tham số -L khi kết nối và cung cấp thêm ba thông tin bổ sung:

  • Cổng cục bộ nơi bạn muốn truy cập Tunnels.
  • Host mà bạn muốn máy chủ từ xa kết nối đến.
  • Cổng mà bạn muốn máy chủ từ xa kết nối đến.

Những tham số này được cung cấp, theo thứ tự trên (các giá trị cách nhau bởi dấu hai chấm), dưới dạng các đối số cho tham số -L. Chúng ta cũng sẽ sử dụng tham số -f để cho phép SSH chạy nền trước khi thực thi, và tham số -N để không mở một shell hay thực thi một chương trình nào trên phía máy chủ từ xa.

Ví dụ, để kết nối đến your_domain trên cổng 80 của máy chủ từ xa và chuyển tiếp kết nối đó đến cổng 8888 trên máy cục bộ, bạn có thể gõ:

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

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

Một hướng dẫn tổng quát 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 đang chạy nền, bạn sẽ cần tìm PID của tiến trình để dừng nó. Bạn có thể làm điều đó bằng cách tìm kiếm theo cổng 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

Bạn có thể dừng tiến trình bằng cách sử dụng lệnh:

kill 5965

Một lựa chọn khác là khởi chạy kết nối mà không sử dụng tham số -f. Điều này sẽ giữ kết nối ở foreground, ngăn bạn sử dụng cửa sổ terminal trong suốt thời gian chuyển tiếp. Lợi ích của cách này là bạn có thể dễ dàng dừng Tunnels bằng cách nhấn CTRL-C.

Cấu hình chuyển tiếp từ xa đến máy chủ

Các kết nối SSH cũng có thể được sử dụng để chuyển tiếp lưu lượng từ các cổng trên máy cục bộ đến các cổng trên máy chủ từ xa.

Trong một Tunnels từ xa, một kết nối được thực hiện đến một máy chủ từ xa. Trong quá trình tạo Tunnels, một cổng từ xa được chỉ định. Cổng này trên máy chủ từ xa sẽ được chuyển tiếp đến một cổng và host mà máy tính cục bộ của bạn kết nối đến. Điều này cho phép máy tính từ xa truy cập đến một host thông qua máy cục bộ của bạn.

Điều này hữu ích nếu bạn cần cho phép truy cập đến một mạng nội bộ mà các kết nối từ bên ngoài bị hạn chế. Nếu tường lửa cho phép các kết nối ra ngoài, bạn có thể kết nối tới một máy chủ từ xa và chuyển tiếp lưu lượng từ máy đó đến một vị trí trên mạng nội bộ.

Để thiết lập một Tunnels từ xa đến máy chủ từ xa, bạn cần sử dụng tham số -R khi kết nối và cung cấp ba thông tin bổ sung:

  • Cổng trên máy chủ từ xa nơi lưu lượng sẽ được truy cập.
  • Host mà bạn muốn máy tính cục bộ của bạn kết nối đến.
  • Cổng mà bạn muốn máy tính cục bộ kết nối đến.

Những tham số này được cung cấp, theo thứ tự trên (các giá trị cách nhau bởi dấu hai chấm), dưới dạng các đối số cho tham số -R. Chúng ta cũng sẽ sử dụng tham số -f để chạy SSH ở chế độ nền và tham số -N để không mở shell hay thực thi chương trình nào trên phía máy chủ từ xa.

Ví dụ, để kết nối đến your_domain trên cổng 80 của máy cục bộ và chuyển tiếp kết nối đó đến cổng 8888 trên máy chủ từ xa, bạn có thể gõ:

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

Bây giờ, trên máy chủ từ xa, nếu bạn mở trình duyệt web và truy cập đến 127.0.0.1:8888, bạn sẽ thấy nội dung của your_domain trên cổng 80.

Hướng dẫn tổng quát về cú pháp:

ssh -R remote_port:site_or_IP_to_access:site_port username@host

Vì kết nối đang chạy nền, bạn sẽ cần tìm PID của tiến trình để dừng nó. Bạn có thể làm điều đó bằng cách:

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

Sau đó, dừng tiến trình bằng cách sử dụng lệnh:

kill 5965

Một lựa chọn khác là khởi chạy kết nối mà không sử dụng tham số -f, giúp giữ kết nối ở foreground để bạn có thể dễ dàng dừng Tunnels bằng CTRL-C.

Cấu hình chuyển tiếp động (Dynamic Tunneling) đến máy chủ

Các kết nối SSH cũng có thể được sử dụng để chuyển tiếp lưu lượng từ các cổng trên máy cục bộ đến máy chủ từ xa thông qua một tunnel động.

Một Tunnels động tương tự như Tunnels cục bộ, nhưng nó cho phép máy cục bộ kết nối đến các nguồn khác thông qua máy chủ từ xa chỉ bằng cách chỉ định một cổng cục bộ duy nhất. Các ứng dụng muốn sử dụng cổng này để chuyển tiếp phải có khả năng giao tiếp theo giao thức SOCKS để các gói tin được chuyển hướng chính xác ở phía bên kia Tunnels.

Lưu lượng được chuyển đến cổng cục bộ này sẽ được gửi tới máy chủ từ xa. Từ đó, giao thức SOCKS sẽ được giải thích để thiết lập kết nối đến vị trí đích mong muốn. Cách thiết lập này cho phép các ứng dụng hỗ trợ SOCKS kết nối đến nhiều địa chỉ qua máy chủ từ xa mà không cần tạo nhiều Tunnels tĩnh.

Để thiết lập kết nối, chúng ta sẽ sử dụng tham số -D cùng với cổng cục bộ mà bạn muốn sử dụng cho Tunnels. Chúng ta cũng sẽ dùng tham số -f để SSH chạy nền trước khi thực thi và tham số -N để không mở shell hay thực thi chương trình nào trên phía máy chủ từ xa.

Ví dụ, để thiết lập một Tunnels động trên cổng 7777, bạn có thể gõ:

ssh -f -N -D 7777 username@remote_host

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

Cách định hướng lưu lượng đến cổng SOCKS sẽ khác nhau tùy theo ứng dụng. Ví dụ, trong Firefox, bạn có thể vào Preferences > Advanced > Settings > Manual proxy configurations. Trong Chrome, bạn có thể khởi chạy ứng dụng với tham số –proxy-server= được thiết lập, sử dụng giao diện localhost và cổng đã chuyển tiếp.

Vì Tunnels đang chạy nền, bạn sẽ cần tìm PID của tiến trình để dừng nó. Bạn có thể tìm kiếm theo cổng đã chuyển tiếp bằng lệnh:

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

Sau đó, dừng tiến trình bằng lệnh:

kill 5965

Một lựa chọn khác là khởi chạy kết nối mà không sử dụng tham số -f để giữ kết nối ở foreground, giúp bạn dễ dàng dừng Tunnels bằng cách nhấn CTRL-C.

Sử dụng mã Escape SSH để điều khiển kết nối

Ngay cả sau khi đã thiết lập một phiên SSH, bạn vẫn có thể điều khiển kết nối từ bên trong terminal. Chúng ta có thể làm điều này thông qua cái gọi là mã escape SSH, cho phép bạn tương tác với phần mềm SSH cục bộ ngay trong phiên làm việc.

Ép ngắt kết nối từ phía Client (Cách thoát phiên bị treo hoặc đóng băng)

Một trong những tính năng hữu ích nhất của OpenSSH mà thường không được chú ý là khả năng điều khiển một số khía cạnh của phiên làm việc từ bên trong.

Những lệnh này được thực thi bằng cách bắt đầu với ký tự điều khiển ~ trong một phiên SSH. Các lệnh điều khiển chỉ được hiểu nếu chúng là điều đầu tiên được gõ sau một dòng mới, vì vậy hãy luôn nhấn ENTER một hoặc hai lần trước khi sử dụng.

Một trong những lệnh hữu ích nhất là khả năng khởi tạo việc ngắt kết nối từ phía client. Thông thường, kết nối SSH sẽ bị đóng bởi máy chủ, nhưng điều này có thể trở nên bất tiện nếu máy chủ gặp sự cố hoặc kết nối bị đứt. Bằng cách sử dụng ngắt kết nối phía client, bạn có thể đóng kết nối một cách gọn gàng từ phía client.

Để đóng kết nối từ phía client, sử dụng ký tự điều khiển ~ kèm theo dấu chấm. Nếu kết nối của bạn gặp sự cố, có thể bạn sẽ rơi vào một phiên terminal dường như bị treo. Hãy gõ lệnh ngay cả khi không có phản hồi để thực hiện việc ngắt kết nối phía client:

[ENTER]
~.

Kết nối sẽ ngay lập tức đóng lại, đưa bạn trở về phiên shell cục bộ.

Đưa phiên SSH vào Background

Một trong những tính năng hữu ích khác của OpenSSH là khả năng điều khiển một số khía cạnh của phiên kết nối từ bên trong.

Những lệnh này cũng được thực thi bắt đầu với ký tự điều khiển ~ trong phiên SSH. Chúng chỉ được hiểu nếu là điều đầu tiên được gõ sau một dòng mới, vì vậy luôn nhấn ENTER một hoặc hai lần trước khi sử dụng.

Một khả năng mà tính năng này mang lại là đưa phiên SSH vào background. Để thực hiện điều này, bạn cần nhập ký tự điều khiển ~ sau đó thực hiện phím tắt truyền thống để đưa tác vụ sang background (CTRL-z):

[ENTER]
~[CTRL-z]

Lệnh này sẽ đưa phiên kết nối vào background, trả bạn về terminal cục bộ. Để quay trở lại phiên SSH, bạn có thể sử dụng các cơ chế điều khiển tác vụ tiêu chuẩn.

Bạn có thể kích hoạt lại ngay tác vụ background gần nhất bằng lệnh:

fg

Nếu có nhiều tác vụ background, bạn có thể xem danh sách các tác vụ bằng lệnh:

jobs

Output

[1]+  Stopped                 ssh username@some_host
[2]   Stopped                 ssh username@another_host

Sau đó, bạn có thể đưa bất kỳ tác vụ nào vào foreground bằng cách sử dụng chỉ số ở cột đầu tiên kèm theo dấu phần trăm, ví dụ:

fg %2

Thay đổI tùy chọn chuyển tiếp cổng trong một phiên SSH đang hoạt động

Một trong những tính năng hữu ích khác của OpenSSH là khả năng điều chỉnh các thiết lập chuyển tiếp port ngay trong phiên SSH.

Những lệnh này cũng được thực hiện bằng cách bắt đầu với ký tự điều khiển ~ trong phiên SSH. Chúng chỉ được hiểu nếu là điều đầu tiên được gõ sau một dòng mới, vì vậy hãy nhấn ENTER một hoặc hai lần trước khi sử dụng.

Một điều mà tính năng này cho phép là người dùng có thể thay đổi cấu hình chuyển tiếp port sau khi kết nối đã được thiết lập. Điều này cho phép bạn tạo hoặc hủy bỏ các quy tắc chuyển tiếp port “on-the-fly”.

Các khả năng này là một phần của giao diện dòng lệnh SSH, có thể truy cập trong phiên làm việc bằng cách sử dụng ký tự điều khiển ~ và phím “C”:

[ENTER]
~C
ssh>

Bạn sẽ được đưa vào prompt của SSH, với một tập hợp các lệnh hợp lệ rất giới hạn. Để xem các tùy chọn hiện có, bạn có thể gõ -h từ prompt này. Nếu không có gì được trả về, có thể bạn cần tăng mức độ chi tiết của đầu ra SSH bằng cách sử dụng ~v vài lần:

[ENTER]
~v
~v
~v
~C
-h

Các lệnh có sẵn bao gồm:

Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward

Như bạn thấy, bạn có thể dễ dàng thực hiện bất kỳ tùy chọn chuyển tiếp nào bằng cách sử dụng các tham số thích hợp (tham khảo phần chuyển tiếp để biết thêm thông tin). Bạn cũng có thể hủy bỏ một Tunnels bằng lệnh “kill” kèm chữ “K” trước chữ cái chỉ loại chuyển tiếp. Ví dụ, để hủy chuyển tiếp cục bộ (-L), bạn có thể sử dụng lệnh -KL. Bạn chỉ cần cung cấp số cổng cho lệnh này.

Ví dụ, để thiết lập một chuyển tiếp cổng cục bộ, bạn có thể gõ:

[ENTER]
~C
-L 8888:127.0.0.1:80

Cổng 8888 trên máy cục bộ của bạn bây giờ sẽ có khả năng giao tiếp với máy chủ web trên host mà bạn đang kết nối. Khi bạn hoàn tất, bạn có thể hủy bỏ chuyển tiếp đó bằng cách gõ:

[ENTER]
~C
-KL 8888

Kết luận

Những hướng dẫn trên nên bao gồm phần lớn các thông tin mà hầu hết người dùng cần về SSH trong công việc hàng ngày. Nếu bạn có mẹo khác hoặc muốn chia sẻ các cấu hình, phương pháp yêu thích của mình, hãy thoải mái để lại bình luận bên dưới nhé

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *