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ạ |
||
|---|---|---|
![]() |
![]() |
![]() |
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ạ |
||
|---|---|---|
![]() |
![]() |
![]() |
Đâ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ạ |
||
|---|---|---|
![]() |
![]() |
![]() |
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ạ |
||
|---|---|---|
![]() |
![]() |
![]() |
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ạ |
||
|---|---|---|
![]() |
![]() |
![]() |
Đ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
.sshvàauthorized_keystrướ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ế:
scpphù 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ặprsync, 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





