→ From Coder to Shipper
From Coder to Shipper · Hạ tầng

SSH — bàn tay điều khiển từ xa an toàn cho VPS

VPS của bạn là một máy tính ở xa. SSH là cách mã hoá để đăng nhập, chạy lệnh, chuyển file và chạm tới những thứ chỉ VPS nhìn thấy — thay thế telnet không an toàn.

← / → để chuyển slide · chuyển EN/VI bên dưới · góc nhìn kiến trúc sư — mô hình trong đầu trước, vài ví dụ nhỏ

Vấn đề

VPS là máy ở xa — bạn cần một bàn tay điều khiển an toàn

Bạn không cắm bàn phím vào nó được. Mọi thao tác đều đi qua mạng — nên cách bạn đăng nhập quyết định mức độ an toàn.

Telnet gửi mọi thứ lộ rõ

telnet là cách vào cũ. Nó gửi username VÀ password của bạn dạng plaintext — ai trên đường dây giữa bạn và VPS cũng đọc được.

Đường dây không thuộc về bạn

Lưu lượng của bạn đi qua router, ISP, cáp mà bạn không kiểm soát. Bất kỳ chặng nào, một sniffer cũng thấy login của bạn — gồm cả password — dạng plaintext.

Bạn cần một bàn tay ở xa

Để ship, bạn sẽ đăng nhập, chạy lệnh, sửa file và chạm tới dịch vụ mà chỉ VPS thấy được. Bàn tay ở xa đó phải an toàn, không chỉ tiện.

SSH là câu trả lời

SSH = Secure Shell. Nó làm đúng việc của telnet — remote login kèm shell — nhưng mã hoá toàn bộ cuộc hội thoại, nên đường dây chỉ toàn là mớ ký tự vô nghĩa.

Bức tranh

Đường dây mở vs đường hầm

Cùng một lần login — cái này ai cũng đọc được, cái kia không ai đọc được.

telnet · port 23
Laptop của bạnbạn, đang đăng nhập
→username + password dạng plaintext
VPS :23 mỗi gói tin trên đường dây đều đọc được
ssh · port 22
Laptop của bạnbạn, đang đăng nhập
→toàn bộ phiên, mã hoá
VPS :22 đường dây chỉ mang ciphertext

Telnet giao thông tin đăng nhập của bạn cho đường dây. SSH bọc toàn bộ phiên trong một đường hầm — từ password đến lệnh cuối cùng bạn gõ, không ai trên đường dây đọc được.

Cốt lõi

SSH trong một hơi

Nó được mã hoá

Ngay khi kết nối, không ai trên đường dây đọc được username, password hay bất kỳ lệnh nào. Đường hầm mới là ý cốt lõi.

Remote login + shell

ssh user@host đưa bạn vào một shell thật trên VPS. Gõ lệnh, lệnh chạy ngay trên đó, bạn thấy output — như thể đang ngồi trước máy đó.

Chuyển file

scp và sftp copy file tới và từ VPS qua cùng kênh mã hoá — cùng mức an toàn, dùng để chuyển file thay vì gõ lệnh.

Đường hầm

Port forwarding cho phép bạn chạm tới những thứ chỉ VPS thấy — một database trên mạng riêng — qua ống mã hoá.

Telnet là một cuộc hội thoại hét qua cánh đồng trống. SSH là cùng cuộc hội thoại trong một ống kín, mã hoá — cánh đồng không đọc được.
— toàn bộ sự khác biệt, trong một hình ảnh
01
Phần 1

Kết nối — ssh user@host

Lệnh đầu tiên, port tuỳ chỉnh, và prompt fingerprint bạn sẽ thấy đúng một lần mỗi server.

Lần đầu tiên

Đăng nhập — và prompt fingerprint

Port mặc định là 22; -p để đổi. Lần connect đầu hỏi bạn xác nhận fingerprint — quyết định 'tin server này' chỉ một lần.

ops@vps — zsh
# default port is 22 — -p 2222 uses a custom one
$ ssh deploy@203.0.113.10
The authenticity of host '203.0.113.10 (203.0.113.10)' can't be established.
ED25519 key fingerprint is SHA256:AbCdEf1234567890GhIjKlMnOpQr.
Are you sure you want to continue connecting (yes/no)? yes
# now you're in a shell on the VPS — commands run there
$ pwd
/home/deploy
Bên trong

Fingerprint — tin tưởng lần đầu

Server trình ra key

Mỗi server SSH có một host key. Lần connect đầu nó trình ra fingerprint (hash ngắn của key đó) để bạn xác nhận đang nói chuyện với server đúng — không phải kẻ giả mạo.

Bạn xác minh một lần

Bạn đối chiếu fingerprint với giá trị nhà cung cấp đưa (console, email). Khớp? Gõ yes. Đó là toàn bộ bước tin tưởng.

Tin tưởng lần đầu (TOFU)

Đã chấp nhận, fingerprint được ghi nhớ trên máy bạn. Các lần connect sau lặng lẽ — và nếu key server đổi, SSH sẽ cảnh báo rõ (nghi MITM).

02
Phần 2

Key thắng password

Password dễ đoán, dễ lừa. Một cặp key là toán học không thể giả mạo. Cách setup — và cách khoá cửa sau lưng.

Hai cách vào

Xác thực password vs key

Password

Bạn gõ một bí mật mà cả hai bên cùng biết. Nó có thể bị đoán, lộ, lừa hay dùng lại. Mỗi lần login, bí mật đó đều đi qua mạng — có mã hoá, nhưng vẫn là bí mật đang di chuyển.

Cặp key

Bạn tạo private key (bí mật) và public key (danh tính). Server chỉ lưu public key. Login chứng minh bạn giữ private key — không bí mật nào di chuyển.

Luồng hoạt động

Login bằng key, ba bước

  1. 1

    Tạo cặp key

    ssh-keygen tạo private key (giữ kỹ — không chia sẻ) và public key tương ứng. Chấp nhận mặc định hoặc thêm passphrase.

  2. 2

    Copy public key

    ssh-copy-id gửi PUBLIC key của bạn tới server và thêm vào ~/.ssh/authorized_keys. Chỉ nửa public đi ra ngoài.

  3. 3

    Login không password

    Giờ ssh không hỏi password — xác minh bạn bằng private key. Cùng mức an toàn, không phải gõ gì, và không có gì để lừa.

Các lệnh

Tạo và cài key

Hai lệnh trên laptop của bạn làm trọn việc. Private key ở lại đây; chỉ public key đến VPS.

ops@vps — zsh
# 1) generate a key pair on your laptop
$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Your identification has been saved in /home/you/.ssh/id_ed25519.
Your public key has been saved in /home/you/.ssh/id_ed25519.pub.
# 2) copy the public key to the VPS
$ ssh-copy-id deploy@203.0.113.10
Number of key(s) added: 1.
Khoá cửa

Giờ tắt password login

Khi key đã chạy, bỏ con đường password để chỉ key vào được. Một dòng, và password trở nên vô nghĩa.

Một dòng trên server

Trong /etc/ssh/sshd_config, đặt PasswordAuthentication no. Khởi động lại dịch vụ SSH. Từ đó, chỉ login bằng key được chấp nhận.

Giữ một lối vào

Hãy chắc chắn login key chạy được TRƯỚC khi tắt password — và mở sẵn một console của nhà cung cấp làm phương án dự phòng. Tự khoá mình ngoài cửa là kẹt luôn.

Vì sao quan trọng

Không password = không gì để brute-force, lừa hay stuff. Kẻ tấn công tìm thấy server vẫn không vào được nếu không có private key.

03
Phần 3

Chuyển file — scp, sftp, rsync

Cùng kênh mã hoá, giờ cho file. Một để copy, một để duyệt, một để đồng bộ.

Ba công cụ

Một để copy, một để duyệt, một để đồng bộ

scp — copy

Như cp nhưng trên mạng. scp file user@host:/path copy file tới (hoặc từ) VPS qua kênh mã hoá. Một lệnh, xong.

sftp — duyệt

Một file shell tương tác. sftp user@host đưa bạn vào prompt nhỏ, nơi bạn ls, cd, get, put — người anh em an toàn hơn của ftp.

rsync — đồng bộ

Con ngựa thồ cho việc lớn. rsync so hai phía, chỉ chuyển phần thay đổi — dừng giữa chừng vẫn chạy tiếp được, nhanh, và chạy qua ssh được.

Ví dụ nhỏ

Copy một file, hoặc mở file shell

bash
# scp: copy a file TO the VPS
scp deploy.py deploy@203.0.113.10:/home/deploy/

# scp: copy a file FROM the VPS
scp deploy@203.0.113.10:/var/log/app.log ./app.log

# sftp: interactive file shell
sftp deploy@203.0.113.10
sftp> ls
sftp> get app.log
sftp> bye

# rsync: sync a folder over ssh
rsync -avz --progress ./site/ deploy@203.0.113.10:/var/www/site/

scp là một lượt (tới/từ), sftp là shell tương tác để duyệt và get/put, và rsync là đồng bộ so-sánh có thể tiếp tục — tất cả qua cùng kênh mã hoá.

04
Phần 4

Đường hầm — ống trong ống

Mô hình trong đầu: một đường hầm chạy QUA kết nối SSH mã hoá của bạn để chạm tới những thứ chỉ VPS thấy.

Bức tranh

Đường hầm xuyên qua kết nối mã hoá

Local forward (-L): laptop của bạn → SSH mã hoá → VPS → mạng riêng → database.

cục bộ
Laptop của bạnbạn kết nối tới 127.0.0.1:5432
→ssh -L 5432:10.0.0.5:5432
(mã hoá)
VPS — bộ trung chuyểngánh đường hầm
→mạng riêng
Database 10.0.0.5:5432 — chỉ nội bộ

Bạn trỏ DB client tới 127.0.0.1:5432 (localhost). SSH mang lưu lượng đó, mã hoá, xuyên tới database riêng trên mạng nội bộ của VPS — thứ mà internet không chạm tới được. Không port công khai, không phơi ra.

Các cờ

-L chi tiết — và -R, -D mỗi cái một dòng

-L: local forward (cái bạn sẽ dùng)

ssh -L 5432:10.0.0.5:5432 user@vps mở port 5432 trên laptop CỦA BẠN; mọi thứ gửi tới đó được đưa qua hầm, mã hoá, tới 10.0.0.5:5432 theo cách VPS nhìn. Chạm tới DB riêng mà không bao giờ phơi nó ra.

-R: remote forward

Gương ngược — mở một port trên VPS, dẫn ngược về máy của bạn qua hầm. Hữu ích khi phía kia không thể chạm tới bạn trực tiếp.

-D: dynamic (SOCKS proxy)

Mở một SOCKS proxy cục bộ; app nào trỏ tới nó sẽ định tuyến toàn bộ lưu lượng qua VPS. Phiên bản đa dụng của cùng một ý tưởng.

05
Phần 5

Người bạn đồng hành mỗi ngày — ~/.ssh/config

Cú hích cho trải nghiệm hằng ngày: đặt tên server một lần, rồi ssh myvps và đi. Không phải gõ hostname, port hay path key mỗi lần.

File

~/.ssh/config — một block Host

~/.ssh/config
# ~/.ssh/config — one block per server
Host myvps
    HostName 203.0.113.10
    User deploy
    Port 22
    IdentityFile ~/.ssh/id_ed25519

# now this just works:
ssh myvps

Định nghĩa một Host alias một lần với HostName, User, Port và IdentityFile — sau đó ssh myvps, scp file myvps:/path và ssh -L ... myvps đều dùng nó tự động.

Cú hích

Vì sao đây là cú hích mỗi ngày

Đặt tên, đừng gõ

ssh myvps thay vì ssh -i ~/.ssh/id_ed25519 deploy@203.0.113.10. Ngắn, dễ nhớ, khó gõ sai. Mọi tool nhận host (ssh, scp, sftp) đều tôn trọng alias.

Một nguồn sự thật duy nhất

Đổi port hay path key một lần trong file là mọi lệnh tự cập nhật. Server mới? Thêm một block Host. Mở rộng từ một VPS lên mười mà không phải ghi nhớ gì.

Chạy với mọi thứ

Alias mang theo User, Port và IdentityFile — nên đường hầm (ssh -L ... myvps), copy (scp x myvps:/path) và mọi thứ khác kế thừa config miễn phí.

06
Phần 6

Toàn cục

Rút xa ra. SSH không phải đống cờ — nó là một mối quan hệ an toàn với VPS của bạn.

Rút xa ra

Một bàn tay an toàn, hai kỹ năng quan trọng

SSH = bàn tay điều khiển an toàn

Đăng nhập, chạy lệnh, chuyển file, chạm tới những thứ riêng — tất cả mã hoá, tất cả từ laptop. Nó là kênh duy nhất để bạn quản trị VPS.

Hai kỹ năng quan trọng nhất

Login bằng key (để không có gì để lừa hay đoán) và đường hầm (để thứ riêng vẫn riêng). Thành thạo hai cái đó, phần còn lại của SSH chỉ là tiện ích đi kèm.

SSH là cái bắt tay giữa bạn và VPS — mã hoá từ byte đầu đến byte cuối. Làm đúng key và đường hầm, phần còn lại tự viết.
— toàn bộ bài, trong một dòng

Giờ thì ship đi — với một bàn tay điều khiển an toàn

ssh user@host, key thay password, một đường hầm tới thứ riêng — và một alias trong ~/.ssh/config để bạn không bao giờ phải gõ lại tất cả.