SSH và Truyền File: ssh, scp, rsync

K
Kai··5 min read

Tất cả kỹ năng các bài trước đều áp dụng trên server — và cách bạn vào server đó là SSH. Đây là kỹ năng nền tảng nhất của DevOps: gần như mọi thao tác trên máy chủ từ xa đều bắt đầu bằng một phiên SSH. Bài này dạy SSH với xác thực bằng key (cách làm đúng), và truyền file với scp/rsync.

SSH là gì

SSH (Secure Shell) cho bạn một shell trên máy khác, qua kết nối mã hóa. Bạn gõ lệnh trên máy mình, chúng chạy trên server từ xa.

ssh user@host
ssh ubuntu@203.0.113.10        # vào server có IP đó với user ubuntu
ssh -p 2222 user@host          # -p nếu SSH chạy ở cổng khác (mặc định 22)

Lần đầu kết nối tới một host, SSH hỏi xác nhận "fingerprint" của server (gõ yes) — đây là cơ chế chống giả mạo: nó nhớ server, lần sau cảnh báo nếu fingerprint đổi.

Hai cách xác thực: mật khẩu và key

SSH cho đăng nhập bằng mật khẩu hoặc bằng cặp khóa (key). Key vừa an toàn hơn vừa tiện hơn, và là chuẩn cho server.

Cặp khóa gồm:

  • Khóa riêng (private key) — giữ bí mật trên máy bạn, không bao giờ chia sẻ.
  • Khóa công khai (public key) — đặt trên server. Có thể chia sẻ thoải mái.
   Máy bạn (client)                    Server
   ┌─────────────────┐                 ┌──────────────────────┐
   │ private key      │ ──── ssh ────►  │ ~/.ssh/authorized_keys│
   │ (~/.ssh/id_...)  │  chứng minh     │  (chứa public key)    │
   └─────────────────┘  sở hữu private  └──────────────────────┘
        → vào được, KHÔNG cần gõ mật khẩu

Cơ chế: server ra một thử thách, client dùng private key chứng minh nó sở hữu khóa tương ứng với public key đã lưu — không truyền mật khẩu nào qua mạng.

Thiết lập key trong thực tế

Bước 1 — tạo cặp khóa trên máy bạn (chỉ làm một lần):

ssh-keygen -t ed25519
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5...  ban@may

Tạo hai file trong ~/.ssh/: id_ed25519 (private — giữ kín) và id_ed25519.pub (public). (ed25519 là loại khóa hiện đại, gọn và mạnh; rsa là loại cũ vẫn dùng được.) Khi hỏi passphrase, bạn có thể đặt thêm một lớp mật khẩu bảo vệ chính file khóa.

Bước 2 — đưa public key lên server. Cách tiện nhất:

ssh-copy-id user@host

Lệnh này chép public key vào ~/.ssh/authorized_keys trên server. (Thủ công thì là thêm dòng public key vào file đó.)

Bước 3 — từ đó, đăng nhập không cần mật khẩu:

ssh user@host        # vào thẳng, dùng key

Quyền của thư mục ~/.ssh rất quan trọng (nhớ Bài 7): SSH từ chối key nếu quyền quá lỏng. Cần ~/.ssh700~/.ssh/authorized_keys, file private key là 600. Lỗi "Permissions are too open" cho private key là vì quên chmod 600.

File config: bớt gõ dài

ssh -p 2222 ubuntu@203.0.113.10 -i ~/.ssh/work_key mỗi lần thì mệt. Tạo ~/.ssh/config:

Host myserver
    HostName 203.0.113.10
    User ubuntu
    Port 2222
    IdentityFile ~/.ssh/work_key

Giờ chỉ cần:

ssh myserver

Đặt nhiều khối Host cho nhiều server — đây là cách dân DevOps quản lý hàng loạt máy gọn gàng.

scp: copy file qua SSH

scp (secure copy) copy file giữa máy local và server, qua kết nối SSH:

scp file.txt user@host:/duong/dan/        # local -> server
scp user@host:/duong/dan/file.txt ./       # server -> local
scp -r thumuc/ user@host:/dan/             # -r cho cả thư mục

Cú pháp đích là user@host:đường-dẫn. scp đơn giản, hợp copy một vài file.

rsync: đồng bộ thông minh

Với việc đồng bộ thư mục (deploy, backup), rsync tốt hơn scp vì nó chỉ truyền phần thay đổi — lần sau chỉ gửi file mới/khác, không gửi lại toàn bộ:

rsync -av thumuc/ user@host:/dan/          # đồng bộ thư mục lên server
rsync -av user@host:/dan/ ./backup/        # kéo về
rsync -av --delete src/ user@host:/dan/    # --delete: xóa ở đích thứ không còn ở nguồn
  • -a (archive) giữ nguyên quyền, thời gian, symlink...; -v verbose.
  • --delete làm đích thành bản sao chính xác của nguồn (cẩn thận: nó xóa).
  • Dấu / cuối ở nguồn quan trọng: src/ đồng bộ nội dung src; src (không /) đồng bộ cả thư mục src vào trong đích.

rsync chạy qua SSH sẵn, nhưng cần rsync được cài ở cả hai đầu (client lẫn server). Nó là công cụ chuẩn để deploy mã nguồn và backup gia tăng.

Khi nào dùng cái nào: scp cho một vài file lẻ; rsync khi đồng bộ thư mục lặp lại nhiều lần (nhanh hơn nhiều lần thứ hai trở đi nhờ chỉ gửi phần khác).

Một lưu ý bảo mật về SSH server

Khi bạn quản trị server (không chỉ kết nối vào), vài thực hành chuẩn:

  • Tắt đăng nhập mật khẩu, chỉ cho key (trong /etc/ssh/sshd_config: PasswordAuthentication no) — chặn dò mật khẩu.
  • Tắt đăng nhập trực tiếp bằng root (PermitRootLogin no) — vào bằng user thường rồi sudo (Bài 12).
  • Cân nhắc đổi cổng SSH hoặc dùng fail2ban để giảm dò quét tự động.

🧹 Dọn dẹp

Phần thực hành (nếu bạn dựng hai container để thử ssh giữa chúng) thì xóa container + network. Cặp khóa SSH trên máy bạn thì giữ lại để dùng.

Tổng kết

SSH cho bạn shell trên server từ xa qua kết nối mã hóa. Dùng xác thực key (an toàn và tiện hơn mật khẩu): ssh-keygen tạo cặp khóa, public key lên server (~/.ssh/authorized_keys, qua ssh-copy-id), private key giữ kín với quyền 600. ~/.ssh/config giúp quản lý nhiều server gọn. Truyền file bằng scp (file lẻ) hoặc rsync (đồng bộ thư mục, chỉ gửi phần khác — chuẩn cho deploy/backup).

Bạn vào được server và làm mọi việc trên đó rồi. Bài 15 học cách quản lý các dịch vụ chạy nền trên đó: systemd — bật/tắt service, tự khởi động, và xem log.