0

Lab 5 — SSH & Remote Server Administration

1. Mục tiêu

Ở các lab trước, chúng ta quản lý Linux trực tiếp trên máy.

Trong thực tế DevOps, server thường nằm ở:

Cloud
On-premise
Data Center
Virtual Machine

Và chúng ta quản lý chúng từ xa thông qua SSH.

Sau lab này, bạn sẽ biết:

  • SSH là gì và hoạt động như thế nào.
  • Đăng nhập Linux server từ xa.
  • Sử dụng SSH Key thay cho password.
  • Copy file bằng scp.
  • Sử dụng ssh-agent.
  • Cấu hình SSH Client.
  • Disable password authentication.
  • Troubleshoot lỗi SSH.
  • Chuẩn bị nền tảng để học Ansible.

2. SSH là gì?

SSH — Secure Shell — là giao thức cho phép kết nối và điều khiển một máy tính từ xa thông qua kết nối được mã hóa.

Mô hình:

Ảnh Minh hoạ
Screenshot 2026-08-06 at 15.56.23.png image.png Screenshot 2026-08-06 at 15.56.23.png

Ví dụ:

ssh user@192.168.1.100

Có thể hiểu:

ssh
 │
 ├── user       → user trên server
 └── IP         → địa chỉ server

Sau khi đăng nhập:

Ảnh Minh hoạ
Screenshot 2026-08-06 at 15.56.23.png image.png Screenshot 2026-08-06 at 15.56.23.png

Đây là cách DevOps thường quản lý server.


3. Chuẩn bị Lab

Bạn cần 2 máy Linux:

Ảnh Minh hoạ
Screenshot 2026-08-06 at 15.56.23.png image.png Screenshot 2026-08-06 at 15.56.23.png

Nếu chỉ có một máy, bạn có thể sử dụng:

  • Ubuntu VM.
  • Multipass.
  • VirtualBox.
  • Một VPS/cloud server.

Trong lab này giả sử server có:

IP: 192.168.1.100
User: devops

Kiểm tra IP server:

ip addr

Hoặc:

hostname -I

4. Kiểm tra SSH Server

Trên Ubuntu Server:

sudo systemctl status ssh

Nếu chưa chạy:

sudo systemctl enable --now ssh

Kiểm tra port:

sudo ss -lntp | grep :22

Bạn có thể thấy:

LISTEN 0 128 0.0.0.0:22

Port mặc định của SSH là:

22

5. Kết nối SSH

Từ máy client:

ssh devops@192.168.1.100

Lần đầu tiên có thể xuất hiện:

Are you sure you want to continue connecting?

Nhập:

yes

Sau đó nhập password của user devops.

Nếu thành công:

devops@server:~$

Bạn đã đăng nhập vào server.

Kiểm tra:

hostname

và:

whoami

Ví dụ:

server01
devops

6. SSH thực sự làm gì?

Có thể hình dung:

Ảnh Minh hoạ
Screenshot 2026-08-06 at 15.56.23.png Screenshot 2026-08-06 at 15.56.23.png

Sau khi authentication thành công, SSH tạo một shell session cho bạn.

Do đó khi chạy:

ls

command được thực thi trên server, không phải máy local.


7. SSH Key Authentication

Trong production, không nên phụ thuộc vào password.

SSH thường sử dụng:

Private Key
     +
Public Key

Mô hình:

Ảnh Minh hoạ
Screenshot 2026-08-06 at 15.56.23.png Screenshot 2026-08-06 at 15.56.23.png

Điểm quan trọng:

Private key không được gửi lên server.

Server chỉ lưu public key.


8. Tạo SSH Key

Trên máy client:

ssh-keygen -t ed25519

Bạn có thể nhấn Enter để sử dụng đường dẫn mặc định:

~/.ssh/id_ed25519

Hai file được tạo:

~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub

Trong đó:

id_ed25519
    → Private key

id_ed25519.pub
    → Public key

⚠️ Cực kỳ quan trọng

Không chia sẻ:

id_ed25519

Không commit private key vào Git.

Không gửi private key qua Slack, email hoặc chat.

Public key thì có thể đưa lên server.


9. Copy Public Key lên Server

Cách đơn giản:

ssh-copy-id devops@192.168.1.100

Sau đó thử:

ssh devops@192.168.1.100

Nếu cấu hình đúng, bạn có thể đăng nhập mà không cần nhập password của server.


10. Nếu không có ssh-copy-id

Có thể sử dụng:

cat ~/.ssh/id_ed25519.pub | ssh devops@192.168.1.100 \
'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'

Sau đó:

ssh devops@192.168.1.100

11. authorized_keys

Trên server:

cat ~/.ssh/authorized_keys

Bạn sẽ thấy public key.

Mô hình:

SSH kiểm tra xem client có chứng minh được quyền sở hữu private key tương ứng hay không.


12. Permission của SSH Key

SSH rất nhạy cảm với permission.

Trên client:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

Trên server:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Kiểm tra:

ls -la ~/.ssh

Kinh nghiệm thực tế: Nếu SSH key đúng nhưng vẫn không đăng nhập được, hãy kiểm tra permission của .sshauthorized_keys trước khi nghĩ đến những lỗi phức tạp hơn.


13. SSH Config

Thay vì mỗi lần phải gõ:

ssh devops@192.168.1.100

Bạn có thể cấu hình:

nano ~/.ssh/config

Thêm:

Host todo-server
    HostName 192.168.1.100
    User devops
    IdentityFile ~/.ssh/id_ed25519

Sau đó chỉ cần:

ssh todo-server

SSH sẽ tự hiểu:

todo-server
    ↓
192.168.1.100
    ↓
devops
    ↓
id_ed25519

Đây là cách rất tiện khi bạn quản lý nhiều server.

Ví dụ:

Host production
    HostName 10.0.0.10
    User deploy

Host staging
    HostName 10.0.0.20
    User deploy

Host monitoring
    HostName 10.0.0.30
    User devops

Sau đó:

ssh production
ssh staging
ssh monitoring

14. Copy File với SCP

SSH không chỉ dùng để chạy command.

Bạn có thể copy file:

scp app.jar devops@192.168.1.100:/opt/todo-app/

Mô hình:

Copy file từ server về local:

scp devops@192.168.1.100:/opt/todo-app/app.log .

Copy directory:

scp -r config/ devops@192.168.1.100:/opt/todo-app/

Thực tế: scp phù hợp cho các thao tác đơn giản. Với việc đồng bộ nhiều file hoặc deployment, sau này bạn sẽ gặp rsync, Ansible và CI/CD.


15. SSH Agent

Giả sử bạn quản lý nhiều server.

Nếu private key có passphrase, bạn không muốn nhập lại mỗi lần:

ssh server1
ssh server2
ssh server3

SSH Agent giải quyết vấn đề này.

Khởi động:

eval "$(ssh-agent -s)"

Thêm key:

ssh-add ~/.ssh/id_ed25519

Kiểm tra:

ssh-add -l

Bây giờ SSH Agent giữ key trong session và có thể sử dụng nó khi authentication.


16. Tắt Password Authentication

Trong production, một server có thể được cấu hình để chỉ cho phép SSH Key.

Mở:

sudo nano /etc/ssh/sshd_config

Cấu hình:

PasswordAuthentication no
PubkeyAuthentication yes

Sau đó kiểm tra configuration:

sudo sshd -t

Nếu không có output nghĩa là syntax hợp lệ.

Restart:

sudo systemctl restart ssh

⚠️ Cực kỳ quan trọng

Không đóng SSH session hiện tại ngay.

Mở terminal thứ hai và thử:

ssh devops@192.168.1.100

Nếu key login thành công, mới đóng session cũ.

Trick thực tế: Khi thay đổi SSH configuration trên remote server, luôn giữ một session SSH đang hoạt động cho đến khi xác nhận session mới đăng nhập được. Nếu cấu hình sai, bạn vẫn còn đường quay lại.


17. SSH Troubleshooting

Giả sử:

ssh devops@192.168.1.100

không kết nối được.

Đừng đoán.

Bước 1 — Kiểm tra network

ping 192.168.1.100

Nếu ping không được, chưa nên debug SSH.


Bước 2 — Kiểm tra port 22

nc -vz 192.168.1.100 22

Nếu:

Connection refused

có thể SSH server không chạy.

Nếu:

Connection timed out

có thể firewall/network đang chặn.


Bước 3 — Kiểm tra SSH service

Trên server:

sudo systemctl status ssh

Bước 4 — Debug SSH Client

Dùng:

ssh -v devops@192.168.1.100

Hoặc chi tiết hơn:

ssh -vvv devops@192.168.1.100

Bạn có thể thấy:

Connecting...
Offering public key...
Authentications that can continue...

Đây là command cực kỳ hữu ích.


18. Các lỗi SSH thường gặp

Connection refused

Thường liên quan đến:

SSH service không chạy
Port sai
Server không listen port

Kiểm tra:

sudo systemctl status ssh
sudo ss -lntp | grep :22

Connection timed out

Thường liên quan:

Firewall
Security Group
Network
VPN
Routing

Permission denied (publickey)

Thường kiểm tra:

Private key đúng chưa?
Public key đã nằm trong authorized_keys?
Permission đúng chưa?
User đúng chưa?
SSH config đúng chưa?

Debug:

ssh -vvv user@server

19. Bài thực hành — SSH Hardening

Hãy tạo user riêng:

sudo useradd -m deploy
sudo passwd deploy

Thêm SSH key cho user:

sudo mkdir -p /home/deploy/.ssh

Copy public key vào:

sudo nano /home/deploy/.ssh/authorized_keys

Sau đó:

sudo chown -R deploy:deploy /home/deploy/.ssh
sudo chmod 700 /home/deploy/.ssh
sudo chmod 600 /home/deploy/.ssh/authorized_keys

Test:

ssh deploy@192.168.1.100

Nếu thành công, bạn đã có user chuyên dùng cho deployment.


20. Tư duy Security

Một server production không nên có:

root
   ↓
Password
   ↓
Internet

Một mô hình tốt hơn:

Developer / CI
       │
       │ SSH Key
       ▼
   deploy user
       │
       ▼
Least Privilege

Và nếu cần quyền đặc biệt:

deploy
   ↓
sudo
   ↓
Specific command

Không nên cho tất cả user quyền:

sudo ALL=(ALL) ALL

nếu không thực sự cần.


21. Bài tập tổng hợp

Hãy xây dựng môi trường:

              Your Computer
                    │
                    │ SSH
                    ▼
             Ubuntu Server
                    │
          ┌─────────┴─────────┐
          ▼                   ▼
      deploy user          devops user
          │
          ▼
    /opt/todo-app

Yêu cầu:

1. Tạo user

deploy

2. Tạo SSH Key

id_ed25519
id_ed25519.pub

3. Cho phép deploy login bằng SSH Key

4. Tạo SSH config

Host todo-server
    ...

5. Copy một file

scp app.txt todo-server:/opt/todo-app/

6. Kiểm tra service

ssh todo-server
systemctl status todo-app

7. Debug SSH

Thử:

ssh -vvv todo-server

và hiểu được SSH đang fail ở bước nào.


22. Từ SSH đến Ansible

Đây là phần rất quan trọng đối với roadmap DevOps của bạn.

Ở lab này:

Bạn
 │
 ├── ssh server1
 ├── ssh server2
 └── ssh server3

Nếu có 100 server:

ssh server1
ssh server2
ssh server3
...
ssh server100

Rõ ràng không thể quản lý thủ công.

Đó là lý do chúng ta cần Ansible.

Ansible sử dụng SSH để kết nối đến server:

                  Ansible
                     │
          ┌──────────┼──────────┐
          │          │          │
         SSH        SSH        SSH
          │          │          │
          ▼          ▼          ▼
       Server 1   Server 2   Server 3

Ví dụ thay vì:

ssh server1
sudo apt update

ssh server2
sudo apt update

ssh server3
sudo apt update

Ansible có thể thực hiện cùng một task trên nhiều server.

Vì vậy:

SSH là một trong những nền móng quan trọng nhất trước khi học Ansible.


23. Những command cần nhớ

Command Mục đích
ssh user@host SSH vào server
ssh -v Debug SSH
ssh -vvv Debug SSH chi tiết
ssh-keygen Tạo SSH key
ssh-copy-id Copy public key
ssh-add Thêm key vào SSH Agent
scp Copy file qua SSH
ssh-keygen -t ed25519 Tạo Ed25519 key
ss -lntp Kiểm tra port đang listen
systemctl status ssh Kiểm tra SSH server
sshd -t Kiểm tra SSH configuration

24. Kinh nghiệm thực tế

1. Không dùng root SSH trực tiếp nếu không cần

Thay vì:

root@server

nên sử dụng:

deploy@server

và chỉ dùng sudo khi cần.


2. Dùng Ed25519 cho SSH key

Hiện nay có thể ưu tiên:

ssh-keygen -t ed25519

thay vì sử dụng các kiểu key cũ nếu hệ thống của bạn hỗ trợ.


3. Private key phải được bảo vệ

Không bao giờ:

Git commit private key
Upload private key
Send private key
Copy private key lên server

Nếu private key bị lộ, hãy coi nó như một credential đã bị compromise và thực hiện rotation.


4. Luôn test SSH config trước khi restart

sudo sshd -t

Sau đó mới:

sudo systemctl restart ssh

5. Luôn giữ session SSH dự phòng

Khi thay đổi:

sshd_config
Firewall
Network
User permission

hãy giữ một session hiện tại cho đến khi xác nhận session mới hoạt động.


25. Checklist

Sau Lab 5, bạn nên tự trả lời được:

✓ SSH là gì?
✓ SSH hoạt động như thế nào?
✓ Port mặc định của SSH là bao nhiêu?
✓ SSH Key gồm những gì?
✓ Public Key và Private Key khác nhau thế nào?
✓ authorized_keys dùng để làm gì?
✓ Vì sao private key không được đưa lên server?
✓ ssh-agent dùng để làm gì?
✓ ~/.ssh/config có tác dụng gì?
✓ scp dùng để làm gì?
✓ Làm sao debug Connection refused?
✓ Làm sao debug Connection timed out?
✓ Làm sao debug Permission denied (publickey)?
✓ Vì sao không nên SSH trực tiếp bằng root?
✓ Vì sao SSH là nền tảng của Ansible?

Kết quả cần đạt

Sau 5 lab đầu tiên, bạn đã có nền móng Linux tương đối đầy đủ:

Lab 1
Linux Fundamentals
      ↓
Lab 2
Users & Permissions
      ↓
Lab 3
Process & Systemd
      ↓
Lab 4
CPU / RAM / Disk
      ↓
Lab 5
SSH & Remote Administration
      ↓
        Ansible

Lab 6 — Ansible Fundamentals sẽ bắt đầu chuyển từ quản trị một server thủ công sang Infrastructure Automation: Inventory, Module, Ad-hoc command, Playbook, Variables, Handlers và Idempotency. Đây là bước đầu tiên để tiến tới việc viết các Ansible playbook provisioning server mà bạn muốn làm trong mục tiêu DevOps ban đầu.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí