Một trong những công cụ quan trọng mà quản trị viên hệ thống (system administrator) cần thành thạo chính là SSH.
SSH (viết tắt của Secure Shell) là một giao thức được sử dụng để đăng nhập an toàn vào các hệ thống từ xa. Đây là cách phổ biến nhất để truy cập vào các máy chủ Linux từ xa.
Trong hướng dẫn này, chúng ta sẽ cùng tìm hiểu cách sử dụng SSH để kết nối với máy chủ từ xa.
Cách SSH vào máy chủ từ xa chỉ với 5 bước
- Mở terminal của bạn.
- Trên Linux/macOS: Khởi chạy ứng dụng Terminal.
- Trên Windows: Sử dụng PowerShell, Git Bash hoặc WSL (Windows Subsystem for Linux).
- Chạy lệnh SSH:
ssh username@your_server_ip
- Xem và chấp nhận dấu vân tay của máy chủ nếu được yêu cầu.
- Xác thực bằng mật khẩu hoặc SSH key (nếu bạn đã cấu hình trước đó).
- Bạn đã kết nối thành công!
Gõ lệnh exit
để đóng phiên SSH và quay về shell cục bộ của bạn.
Cú pháp cơ bản
Để kết nối tới một hệ thống từ xa bằng SSH, chúng ta sẽ sử dụng lệnh ssh
.
- Nếu bạn đang dùng Windows, bạn cần cài đặt một phiên bản của OpenSSH để có thể sử dụng lệnh
ssh
từ terminal. - Nếu bạn thích làm việc trong PowerShell, bạn có thể làm theo hướng dẫn chính thức của Microsoft để thêm OpenSSH vào PowerShell.
- Nếu bạn muốn có một môi trường Linux đầy đủ, bạn có thể thiết lập WSL (Windows Subsystem for Linux), trong đó
ssh
đã được cài sẵn theo mặc định.
Cuối cùng, nếu bạn muốn một giải pháp nhẹ, bạn có thể cài đặt Git for Windows, công cụ này cung cấp môi trường bash terminal cho Windows, bao gồm cả lệnh ssh
. Tất cả các lựa chọn trên đều được hỗ trợ tốt. Bạn nên chọn tùy theo sở thích và thói quen làm việc của mình.
Nếu bạn đang sử dụng máy Mac hoặc Linux, bạn đã có sẵn lệnh ssh
trong terminal.
Dạng lệnh đơn giản nhất là:
ssh remote_host
remote_host
trong ví dụ trên là địa chỉ IP hoặc tên miền của máy chủ từ xa mà bạn muốn kết nối đến.
Lệnh này giả định rằng tên người dùng trên hệ thống từ xa giống với tên người dùng trên máy cục bộ của bạn.
Nếu tên người dùng của bạn khác trên hệ thống từ xa, bạn có thể chỉ định tên đó bằng cách sử dụng cú pháp này:
ssh remote_username@remote_host
Sau khi bạn đã kết nối thành công tới máy chủ, hệ thống có thể yêu cầu bạn xác minh danh tính bằng cách nhập mật khẩu.
Ở phần sau, chúng ta sẽ tìm hiểu cách tạo SSH key để sử dụng thay cho mật khẩu, giúp tăng tính bảo mật và tiện lợi khi đăng nhập.
Để thoát khỏi phiên làm việc SSH và quay lại terminal của máy cục bộ, bạn hãy nhập:
exit
SSH hoạt động như thế nào?
SSH hoạt động bằng cách kết nối một chương trình client với một ssh server, gọi là sshd
.
Trong phần trước, ssh
là chương trình client. SSH server đã được chạy sẵn trên remote_host
mà chúng ta đã chỉ định.
Trên hầu hết các môi trường Linux, dịch vụ sshd
sẽ tự động khởi động. Nếu vì lý do nào đó nó không chạy, bạn có thể cần truy cập tạm thời vào server của mình thông qua một web-based console hoặc local serial console.
Quy trình để khởi động một SSH server phụ thuộc vào bản phân phối (distribution) Linux mà bạn đang sử dụng.
Trên Ubuntu, bạn có thể khởi động SSH server bằng cách gõ lệnh:
sudo systemctl start ssh
Lệnh đó sẽ khởi động sshd server, và sau đó bạn có thể đăng nhập từ xa.
Ngoài ra, nếu bạn đang sử dụng DigitalOcean, bạn thậm chí không nhất thiết phải cần đến SSH client. DigitalOcean cung cấp một tính năng Console tích hợp sẵn cho mỗi Droplet.
Đây là một terminal chạy trên trình duyệt, cho phép bạn truy cập vào server của mình ngay cả khi SSH client bị cấu hình sai hoặc không thể sử dụng được.
Tính năng này đặc biệt hữu ích cho người dùng mới hoặc trong các tình huống khẩn cấp, giúp bạn truy cập hoàn toàn vào server mà không cần dựa vào công cụ bên thứ ba, mọi thứ đều nằm trong hệ sinh thái của DigitalOcean.
Truy cập vào server của bạn thông qua Console chạy trên trình duyệt của DigitalOcean, lý tưởng cho các tình huống khẩn cấp khi bạn không có SSH client.
Để hiểu chi tiết hơn về cách SSH server và SSH client tương tác với nhau, hãy xem bài viết SSH Essentials: Làm việc với SSH Servers, Clients và Keys.
Cách cấu hình SSH
Khi bạn thay đổi cấu hình của SSH, tức là bạn đang thay đổi các thiết lập của sshd
server.
Trong Ubuntu, tệp cấu hình sshd
chính nằm ở /etc/ssh/sshd_config
.
Sao lưu phiên bản hiện tại của tệp này trước khi chỉnh sửa:
sudo cp /etc/ssh/sshd_config{,.bak}
Mở nó bằng nano hoặc trình soạn thảo văn bản mà bạn yêu thích:
sudo nano /etc/ssh/sshd_config
Bạn nên để nguyên hầu hết các tùy chọn trong tệp này. Tuy nhiên, có một vài tùy chọn bạn có thể muốn xem qua:
/etc/ssh/sshd_config
Port 22
Khai báo cổng xác định cổng mà máy chủ sshd sẽ lắng nghe để nhận kết nối. Mặc định, cổng này là 22. Bạn nên giữ nguyên thiết lập này trừ khi bạn có lý do cụ thể để thay đổi. Nếu bạn thực sự thay đổi cổng, chúng tôi sẽ hướng dẫn bạn cách kết nối với cổng mới sau đó.
/etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
Các khai báo khóa máy chủ xác định nơi tìm các khóa máy chủ toàn cục. Chúng tôi sẽ thảo luận về khóa máy chủ là gì ở phần sau.
/etc/ssh/sshd_config
SyslogFacility AUTH
LogLevel INFO
Hai mục này cho biết mức độ logging cần được thực hiện.
Nếu bạn đang gặp sự cố với SSH, tăng mức độ logging có thể là một cách tốt để xác định vấn đề.
/etc/ssh/sshd_config
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
Các tham số này chỉ định một số thông tin liên quan đến đăng nhập.
LoginGraceTime
xác định số giây mà kết nối sẽ được giữ sống nếu chưa đăng nhập thành công.
Việc đặt thời gian này cao hơn một chút so với thời gian bạn thường mất để đăng nhập có thể là một ý tưởng hay.
PermitRootLogin
chọn xem người dùng root có được phép đăng nhập hay không.
Trong hầu hết các trường hợp, bạn nên thay đổi giá trị này thành no
sau khi đã tạo một tài khoản người dùng có quyền nâng cao (thông qua su
hoặc sudo
) và có thể đăng nhập qua SSH, nhằm giảm thiểu rủi ro có người chiếm quyền truy cập root vào máy chủ của bạn.
StrictModes
là một cơ chế bảo vệ an toàn, sẽ từ chối các lần cố gắng đăng nhập nếu các tập tin xác thực có thể được đọc bởi tất cả mọi người.
Điều này ngăn chặn các lần đăng nhập khi tập tin cấu hình không đủ an toàn.
/etc/ssh/sshd_config
X11Forwarding yes
X11DisplayOffset 10
Các tham số này cấu hình một tính năng gọi là X11 Forwarding. Tính năng này cho phép bạn xem giao diện đồ họa người dùng (GUI) của hệ thống từ xa ngay trên hệ thống cục bộ.
Tùy chọn này phải được bật trên máy chủ và phải được cấp cho client SSH khi kết nối bằng tùy chọn -X
.
Sau khi bạn thực hiện các thay đổi, hãy lưu và đóng tệp cấu hình. Nếu bạn đang sử dụng nano
, nhấn Ctrl+X
, sau đó khi được hỏi, nhấn Y
và sau đó nhấn Enter.
Nếu bạn đã thay đổi bất kỳ thiết lập nào trong tệp /etc/ssh/sshd_config
, hãy chắc chắn rằng bạn đã reload máy chủ sshd
để áp dụng các thay đổi:
sudo systemctl reload ssh
Bạn nên kiểm tra kỹ các thay đổi của mình để đảm bảo rằng chúng hoạt động đúng như mong đợi.
Việc mở sẵn vài phiên terminal trong khi thực hiện thay đổi có thể là một ý tưởng hay. Điều này sẽ cho phép bạn khôi phục cấu hình nếu cần thiết, tránh tình huống bị khóa không thể truy cập lại máy chủ.
Cách sử dụng ~/.ssh/config
cho nhiều kết nối SSH
Để đơn giản hóa việc truy cập đến nhiều máy chủ, bạn có thể tạo hoặc chỉnh sửa tệp ~/.ssh/config
:
Host dev-server
HostName 192.168.1.10
User devuser
Port 2222
IdentityFile ~/.ssh/dev_key
Sau đó kết nối bằng:
ssh dev-server
Điều này rất hữu ích nếu bạn quản lý nhiều SSH key và các cổng không theo chuẩn.
Cách đăng nhập SSH bằng khóa
Mặc dù việc đăng nhập vào hệ thống từ xa bằng mật khẩu là tiện lợi, nhưng cấu hình xác thực bằng khóa sẽ nhanh hơn và bảo mật hơn.
Xác thực bằng khóa hoạt động như thế nào?
Xác thực bằng khóa (Key-based authentication) hoạt động bằng cách tạo ra một cặp khóa: khóa riêng (private key) và khóa công khai (public key).
Khóa riêng (private key) được lưu trên máy của client (máy tính của bạn), được bảo mật và giữ bí mật.
Khóa công khai (public key) có thể chia sẻ cho bất kỳ ai hoặc đặt lên bất kỳ máy chủ nào mà bạn muốn truy cập.
Khi bạn cố gắng kết nối bằng cặp khóa, máy chủ sẽ sử dụng khóa công khai để tạo thông báo cho máy khách mà chỉ có thể đọc được bằng khóa riêng.
Sau đó, máy tính khách sẽ gửi phản hồi thích hợp trở lại máy chủ để thông báo cho máy chủ rằng máy khách đó là hợp pháp.
Quá trình này sẽ được thực hiện tự động sau khi bạn cấu hình xong các khóa của mình.
Để tìm hiểu sâu hơn về cơ chế hoạt động bên trong của mã hóa SSH và cách thức quá trình kết nối diễn ra, hãy đọc bài viết “Tìm hiểu về quy trình kết nối và mã hóa SSH.”
Cách tạo SSH key
SSH key nên được tạo trên máy tính mà bạn sẽ dùng để đăng nhập vào máy chủ thường là máy cục bộ (local machine) của bạn.
Nhập lệnh sau vào dòng lệnh (terminal):
ssh-keygen -t rsa
Bạn có thể sẽ được nhắc đặt mật khẩu cho chính các tệp khóa, nhưng điều này khá hiếm khi được thực hiện. Bạn nên nhấn Enter qua các bước nhắc để chấp nhận các giá trị mặc định. Các khóa của bạn sẽ được tạo tại ~/.ssh/id_rsa.pub
và ~/.ssh/id_rsa
Để xem hướng dẫn chi tiết về cách cấu hình truy cập SSH bằng khóa, hãy tham khảo bài viết: “Cách cấu hình xác thực SSH bằng khóa trên máy chủ Linux.”
Để chuyển vào thư mục .ssh
, hãy gõ lệnh sau:
cd ~/.ssh
Xem quyền (permissions) của các tệp:
ls -l
Output-rw-r--r-- 1 demo demo 807 Sep 9 22:15 authorized_keys
-rw------- 1 demo demo 1679 Sep 9 23:13 id_rsa
-rw-r--r-- 1 demo demo 396 Sep 9 23:13 id_rsa.pub
Như bạn có thể thấy, tệp id_rsa
chỉ có quyền đọc và ghi đối với chính chủ sở hữu. Điều này giúp giữ cho khóa riêng được bảo mật.
Trong khi đó, tệp id_rsa.pub
có thể được chia sẻ và có quyền phù hợp với mục đích này.
Cách chuyển khóa công khai (public key) của bạn lên máy chủ
Nếu bạn hiện tại có quyền truy cập vào máy chủ bằng mật khẩu, bạn có thể sao chép khóa công khai của mình lên máy chủ đó bằng cách thực hiện lệnh sau:
ssh-copy-id remote_host
Lệnh này sẽ bắt đầu một phiên SSH. Sau khi bạn nhập mật khẩu, nó sẽ sao chép khóa công khai của bạn vào tệp authorized_keys trên máy chủ. Việc này sẽ cho phép bạn đăng nhập mà không cần mật khẩu vào những lần kế tiếp.
Tùy chọn phía client
Có một số tùy chọn (flags) bổ sung mà bạn có thể sử dụng khi kết nối qua SSH.
Một số trong đó có thể cần thiết để phù hợp với cấu hình sshd
của máy chủ từ xa.
Ví dụ, nếu bạn đã thay đổi số cổng (port) trong tập tin cấu hình sshd
, bạn sẽ cần chỉ định lại cổng tương ứng ở phía client bằng cách gõ:
ssh -p port_number remote_host
Lưu ý:
Thay đổi cổng SSH là một cách hợp lý để tăng cường bảo mật bằng cách làm cho dịch vụ ít bị phát hiện hơn (security through obscurity). Nếu bạn cho phép kết nối SSH đến một máy chủ phổ biến với cổng mặc định 22 và bật xác thực bằng mật khẩu, bạn rất có thể sẽ bị tấn công bởi nhiều script tự động cố gắng đăng nhập. Việc chỉ sử dụng xác thực dựa trên khóa và chạy SSH trên một cổng không chuẩn không phải là giải pháp bảo mật phức tạp nhất mà bạn có thể áp dụng, nhưng bạn nên giảm thiểu những điều này.
Nếu bạn chỉ muốn thực thi một lệnh duy nhất trên hệ thống từ xa, bạn có thể chỉ định nó sau địa chỉ máy chủ như sau:
ssh remote_host command_to_run
Bạn sẽ kết nối đến máy từ xa, tiến hành xác thực, và lệnh sẽ được thực thi.
Như đã đề cập trước đó, nếu X11 forwarding được bật trên cả hai máy (máy cục bộ và máy chủ từ xa), bạn có thể sử dụng tính năng này bằng cách gõ:
ssh -X remote_host
Miễn là bạn đã cài đặt đầy đủ các công cụ cần thiết trên máy tính của mình, các chương trình giao diện đồ họa (GUI) mà bạn chạy trên hệ thống từ xa sẽ hiển thị cửa sổ ngay trên hệ thống cục bộ của bạn.
Các lỗi SSH phổ biến và mẹo khắc phục sự cố
Lỗi | Nguyên nhân có thể | Giải pháp khuyến nghị |
---|---|---|
Lỗi bị từ chối kết nối SSH | SSH service (sshd ) không chạy hoặc cổng bị chặn |
Khởi động SSH: sudo systemctl start ssh ; kiểm tra các quy tắc tường lửa (firewall) |
Permission Denied (Publickey) | Sai quyền truy cập tệp hoặc thiếu khóa công khai | Sửa quyền: chmod 700 ~/.ssh , chmod 600 ~/.ssh/authorized_keys |
SSH Timeout or Hang | Vấn đề DNS, máy chủ không truy cập được, hoặc cổng bị chặn | Dùng chế độ gỡ lỗi chi tiết: ssh -vvv user@host ; kiểm tra kết nối mạng/tường lửa |
Lỗi SSH nâng cao và mẹo khắc phục sự cố
Lỗi | Nguyên nhân có thể | Giải pháp nâng cao |
---|---|---|
Xác minh khóa máy chủ không thành công | Tệp known_hosts không khớp do thay đổi IP/tên máy chủ |
Xóa khóa cũ: ssh-keygen -R server_ip ; hoặc chỉnh sửa thủ công tệp ~/.ssh/known_hosts |
Quá nhiều lỗi xác thực | SSH agent thử quá nhiều khóa | Ép sử dụng khóa cụ thể: ssh -o IdentitiesOnly=yes -i ~/.ssh/id_rsa user@host |
Kết nối bị đóng bởi máy chủ từ xa | Máy chủ từ xa đóng kết nối do timeout hoặc cấu hình giới hạn | Kiểm tra sshd_config với các tham số như ClientAliveInterval , MaxAuthTries , hoặc giới hạn đăng nhập |
Chủ sở hữu hoặc quyền không hợp lệ trên .ssh | Quyền truy cập tệp lỏng lẻo gây ra rủi ro bảo mật | Đảm bảo phân quyền đúng: chmod 700 ~/.ssh , chmod 600 ~/.ssh/id_rsa , chmod 644 ~/.ssh/id_rsa.pub |
Không thể giải quyết tên máy chủ | Sai tên máy chủ hoặc lỗi DNS | Kiểm tra DNS, sửa lỗi gõ sai, hoặc chỉnh /etc/hosts để ánh xạ thủ công |
Xác thực bị từ chối: không có phương thức nào khả dụng | Cả mật khẩu và xác thực bằng khóa đều bị tắt trên máy chủ | Đảm bảo khóa đã được cài đặt hoặc bật ít nhất một phương thức trong /etc/ssh/sshd_config |
Vô hiệu hóa xác thực bằng mật khẩu
Nếu bạn đã tạo khóa SSH, bạn có thể tăng cường bảo mật cho máy chủ bằng cách vô hiệu hóa xác thực chỉ bằng mật khẩu. Khi đó, ngoài giao diện console, cách duy nhất để đăng nhập vào máy chủ là thông qua khóa riêng tư (private key) tương ứng với khóa công khai mà bạn đã cài đặt trên máy chủ.
Cảnh báo: Trước khi bạn thực hiện bước này, hãy đảm bảo rằng bạn đã cài đặt khóa công khai lên máy chủ. Nếu không, bạn sẽ bị khóa hoàn toàn và không thể đăng nhập trở lại!
Với quyền root hoặc người dùng có quyền sudo, hãy mở tệp cấu hình SSH:
sudo nano /etc/ssh/sshd_config
Tìm dòng có nội dung PasswordAuthentication
, và bỏ dấu #
ở đầu dòng để bỏ chú thích. Sau đó, đổi giá trị thành no
:
/etc/ssh/sshd_config
PasswordAuthentication no
Hai thiết lập khác thường không cần chỉnh sửa (miễn là bạn chưa từng chỉnh sửa tệp này trước đó) là PubkeyAuthentication
và ChallengeResponseAuthentication
. Chúng được thiết lập mặc định và sẽ có nội dung như sau:
/etc/ssh/sshd_config
PubkeyAuthentication yes
ChallengeResponseAuthentication no
Sau khi thực hiện các thay đổi, hãy lưu và đóng tệp.
Bây giờ bạn có thể tải lại SSH daemon bằng lệnh:
sudo systemctl reload ssh
Danh sách kiểm tra các thực hành tốt nhất về bảo mật SSH
- Vô hiệu hóa xác thực bằng mật khẩu (
PasswordAuthentication no
) - Thay đổi cổng mặc định từ 22 sang cổng khác
- Sử dụng SSH key thay vì mật khẩu
- Đặt
PermitRootLogin no
- Bật cập nhật bảo mật tự động
- Hạn chế quyền truy cập SSH thông qua firewall (ví dụ: UFW hoặc firewalld)
Cách sử dụng SSH trên Windows, Linux và macOS
Windows:
Sử dụng PowerShell, Git Bash, hoặc WSL để truy cập SSH.
Ví dụ:
ssh user@server_ip
macOS/Linux:
Sử dụng terminal tích hợp và lệnh tương tự.
Tạo khóa bằng cách sử dụng:
ssh-keygen
Câu hỏi thường gặp (FAQs)
Q: SSH dùng để làm gì?
SSH (Secure Shell) chủ yếu được sử dụng để đăng nhập an toàn vào các hệ thống từ xa, thường là máy chủ chạy Linux. Nó tạo ra một kênh mã hóa qua mạng không bảo mật, cho phép bạn thực thi lệnh, truyền tệp, và quản lý hạ tầng một cách an toàn.
SSH rất quan trọng đối với quản trị viên hệ thống, lập trình viên và nhóm DevOps để:
- Truy cập từ xa các máy ảo (như DigitalOcean Droplets),
- Tự động hóa tác vụ bằng script,
- Thậm chí forward port hoặc tunnel lưu lượng qua kết nối bảo mật để tăng tính an toàn và kiểm soát.
Q: Làm sao để tạo SSH key?
SSH key được tạo bằng tiện ích ssh-keygen
, tiện ích này tạo ra một cặp khóa công khai–riêng tư an toàn. Chạy ssh-keygen -t rsa -b 4096
để tạo khóa RSA mạnh. Khóa riêng được giữ trên máy cục bộ, thường được lưu tại ~/.ssh/id_rsa
, trong khi khóa công khai (id_rsa.pub
) được đặt trên máy chủ từ xa. Khi kết nối, máy chủ sử dụng khóa công khai để xác minh danh tính của bạn mà không truyền mật khẩu. Xác thực bằng khóa giúp tăng cường bảo mật và tự động hóa khi truy cập máy chủ.
Q: “Permission denied” trong SSH có nghĩa là gì?
Lỗi “Permission denied” trong SSH thường cho thấy lỗi xác thực. Điều này có thể do tên người dùng không đúng, quyền trên thư mục .ssh
hoặc các tệp khóa bị sai hoặc đã hết hạn, hoặc thiếu khóa công khai trên máy chủ từ xa. SSH yêu cầu thư mục ~/.ssh
có quyền 700 và các khóa riêng như id_rsa
có quyền 600. Lỗi này cũng có thể có nghĩa là máy chủ SSH không cho phép xác thực bằng mật khẩu hoặc đăng nhập root, tùy theo cách cấu hình trong sshd_config
.
Q: SSH có an toàn để sử dụng không?
Có, SSH được xem là một trong những phương pháp an toàn nhất để truy cập hệ thống từ xa. Nó sử dụng mã hóa bất đối xứng và các thuật toán mã hóa hiện đại để đảm bảo tính bảo mật và toàn vẹn dữ liệu. Bảo mật có thể được cải thiện bằng cách vô hiệu hóa xác thực bằng mật khẩu, sử dụng cặp khóa, thay đổi cổng mặc định, bật xác thực hai yếu tố (2FA), và sử dụng các công cụ như Fail2Ban để ngăn chặn tấn công brute-force. Thường xuyên cập nhật máy chủ SSH và kiểm tra nhật ký cũng giúp giảm thiểu lỗ hổng và truy cập trái phép.
Q: Tôi có thể sử dụng SSH trên Windows không?
Hoàn toàn có thể. Windows hiện hỗ trợ SSH một cách nguyên bản thông qua PowerShell và OpenSSH, đặc biệt từ Windows 10 trở đi. Bạn cũng có thể sử dụng Git Bash, vốn bao gồm một SSH client, hoặc bật Windows Subsystem for Linux (WSL) để có một môi trường Linux đầy đủ. Mỗi phương pháp đều cho phép bạn sử dụng lệnh ssh
để kết nối đến máy chủ. Việc tạo SSH key và cấu hình truy cập SSH cũng tương tự như trên Linux/macOS, khiến Windows trở thành một nền tảng phù hợp để quản lý hệ thống từ xa qua SSH.
Kết luận
Việc làm quen với SSH sẽ mang lại lợi ích lớn cho bất kỳ hoạt động điện toán đám mây nào của bạn trong tương lai. Khi sử dụng các tùy chọn khác nhau, bạn sẽ khám phá được nhiều chức năng nâng cao, giúp công việc trở nên dễ dàng hơn.