Trả lời nhanh: Khóa SSH là cặp khóa thay cho mật khẩu khi đăng nhập máy chủ: phần công khai đặt trên máy chủ, phần riêng giữ trên máy bạn và không bao giờ rời khỏi đó. Ba việc nên làm ngay: tạo khóa loại ed25519 vì ngắn và mạnh, đặt mật khẩu bảo vệ cho khóa riêng để mất máy không mất luôn quyền vào server, và tắt hẳn đăng nhập bằng mật khẩu sau khi đã chắc chắn khóa hoạt động. Riêng việc cuối cắt đứt toàn bộ các đợt dò mật khẩu tự động.
Máy chủ nào mở cổng SSH ra internet cũng bị dò mật khẩu, thường là vài nghìn lượt mỗi ngày, bắt đầu ngay trong giờ đầu tiên sau khi máy lên mạng. Mật khẩu mạnh giúp bạn sống sót, nhưng khóa SSH thì làm cho toàn bộ chuyện dò đoán trở nên vô nghĩa. Bài này đi từ tạo khóa tới quản lý khi bạn đã có mười máy chủ và ba dịch vụ Git.
Tạo khóa đúng loại
ssh-keygen -t ed25519 -C "laptop-cong-viec"# Nhan Enter de dung duong dan mac dinh# Nhap mat khau bao ve khoa rieng khi duoc hoiKết quả là hai file trong ~/.ssh: id_ed25519 là khóa riêng và không bao giờ được chia sẻ, còn id_ed25519.pub là khóa công khai, chép đi đâu cũng được.
Vì sao chọn ed25519: khóa ngắn hơn nhiều so với loại cũ nhưng độ an toàn tương đương hoặc hơn, và tốc độ xác thực nhanh hơn. Loại rsa vẫn dùng được nếu bạn phải làm việc với hệ thống cũ, khi đó hãy chọn độ dài từ 4096 bit.
Phần ghi chú ở cuối lệnh nên đặt theo tên máy chứ không phải tên người. Sau này nhìn danh sách khóa trên máy chủ bạn sẽ biết ngay khóa nào của máy nào để gỡ khi máy đó bị mất.
Cài khóa lên máy chủ
# Cach gon nhatssh-copy-id nguoidung@dia-chi-may-chu # Neu khong co lenh docat ~/.ssh/id_ed25519.pub | ssh nguoidung@may-chu "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"Quyền thư mục quan trọng: SSH từ chối dùng file khóa nếu quyền quá rộng, và nó im lặng quay về hỏi mật khẩu chứ không báo lỗi rõ ràng. Thư mục phải là 700 và file phải là 600.
Sau khi cài, mở một phiên mới để thử trước khi đóng phiên hiện tại. Đây là thói quen cứu người: nếu cấu hình sai mà bạn đã đóng hết phiên thì đường vào duy nhất còn lại là bảng điều khiển của nhà cung cấp.
Tắt đăng nhập bằng mật khẩu
Chỉ làm bước này sau khi đã đăng nhập bằng khóa thành công ít nhất một lần.
# /etc/ssh/sshd_configPasswordAuthentication noPermitRootLogin prohibit-passwordPubkeyAuthentication yessudo sshd -t # kiem tra cu phap truocsudo systemctl reload sshDòng thứ hai cho phép vào bằng tài khoản quản trị nhưng chỉ qua khóa, không qua mật khẩu. Nếu bạn đã có tài khoản thường dùng với quyền nâng cấp, hãy đặt hẳn thành cấm để bề mặt tấn công nhỏ hơn nữa.
Sau bước này, mọi đợt dò mật khẩu tự động đều thất bại ngay từ đầu vì máy chủ không còn nhận mật khẩu. Đây là thay đổi đơn lẻ có hiệu quả bảo mật cao nhất mà bạn làm được trong năm phút, và nó nằm trong danh sách việc đầu tiên ở bài 12 việc sau khi nhận VPS.
Quản lý khi có nhiều khóa
Nguyên tắc: một khóa cho một máy của bạn, không phải một khóa cho một máy chủ. Laptop một khóa, máy để bàn một khóa, máy chủ dùng làm nơi làm việc một khóa. Lý do rất thực dụng: mất laptop thì bạn chỉ cần gỡ đúng một khóa khỏi các máy chủ, thay vì phải đổi tất cả.
Với dịch vụ Git, hãy tạo khóa riêng thay vì dùng chung khóa đăng nhập máy chủ. Khi đó bạn thu hồi quyền truy cập mã nguồn mà không đụng tới quyền vào server.
Tác nhân quản lý khóa giúp bạn khỏi gõ mật khẩu bảo vệ ở mỗi lần kết nối:
eval "$(ssh-agent -s)"ssh-add ~/.ssh/id_ed25519Còn khi cần nhảy qua một máy trung gian để vào máy trong mạng nội bộ, hãy dùng cấu hình chuyển tiếp thay vì chép khóa riêng lên máy trung gian. Chép khóa riêng lên máy khác là đánh mất toàn bộ ý nghĩa của việc dùng khóa. Cách viết file cấu hình cho gọn nằm ở bài riêng trong cụm này.
Những sai lầm hay gặp
Đưa khóa riêng vào repo. Xảy ra nhiều hơn bạn tưởng, thường là do chép cả thư mục cấu hình vào repo dotfiles. Chỉ đưa file cấu hình, không bao giờ đưa khóa. Nguyên tắc này nằm ở bài dotfiles.
Khóa không có mật khẩu bảo vệ. Tiện lúc dùng nhưng ai cầm được máy bạn là vào thẳng mọi máy chủ. Dùng tác nhân quản lý khóa thì bạn chỉ gõ một lần mỗi phiên, không có lý do gì để bỏ lớp bảo vệ này.
Không gỡ khóa cũ. Nhân viên nghỉ việc, laptop bị thay, nhưng khóa vẫn nằm trong danh sách được phép trên máy chủ. Hãy rà file khóa được phép định kỳ, và đó chính là lúc phần ghi chú tên máy phát huy tác dụng.
Mở SSH ra cả internet khi không cần. Nếu chỉ mình bạn và đội quản trị cần vào, hãy để máy chủ chỉ nhận kết nối trong mạng riêng theo bài Tailscale. Không mở thì không có gì để dò.
Bảng sai lầm về khóa và cách làm đúng
| Sai lầm | Hậu quả | Cách đúng |
|---|---|---|
| Dùng chung một khóa cho cả đội | Thu hồi quyền một người là phải đổi cho tất cả | Mỗi người một khóa riêng |
| Copy khóa riêng sang nhiều máy | Khóa lộ ở một máy là lộ tất cả | Mỗi máy một khóa riêng, cùng trỏ về một tài khoản |
| Không đặt mật khẩu cho khóa riêng | Ai lấy được tệp là dùng được ngay | Đặt mật khẩu, dùng công cụ giữ khóa để đỡ phải gõ lại |
| Đưa khóa riêng vào kho mã nguồn | Công cụ quét tự động tìm ra trong vài phút | Không bao giờ; thêm vào danh sách loại trừ |
| Không thu hồi khi nhân viên nghỉ | Người đã nghỉ vẫn vào được máy chủ | Đưa vào quy trình nghỉ việc |
Sai lầm cuối là lỗ hổng phổ biến nhất ở doanh nghiệp Việt Nam: nhân viên nghỉ nhiều tháng mà khóa của họ vẫn nằm trong tệp cho phép trên máy chủ, và không ai rà lại.
Tạo, cài và rà soát
# Tao khoa loai hien dai, ngan va nhanh hon loai cussh-keygen -t ed25519 -C "ten-ban@may-lam-viec" -f ~/.ssh/id_ed25519 # Cai len may chussh-copy-id -i ~/.ssh/id_ed25519.pub nguoi-dung@may-chu # Tat dang nhap bang mat khau SAU KHI da thu dang nhap bang khoa thanh congsed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_configsed -i 's/^#\?PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_configsshd -t && systemctl restart sshd # RA SOAT: khoa nao dang duoc phep vao may chucat ~/.ssh/authorized_keysfor u in $(ls /home); do echo "=== $u"; cat /home/$u/.ssh/authorized_keys 2>/dev/nulldone # Xem ai da dang nhap gan daygrep "Accepted publickey" /var/log/auth.log | tail -20Chú ý thứ tự: thử đăng nhập bằng khóa thành công trước, rồi mới tắt đăng nhập bằng mật khẩu. Làm ngược lại là tự khóa mình ngoài máy chủ.
Quản lý khi có nhiều khóa và nhiều máy
- Ghi chú trong tệp cho phép: mỗi dòng khóa thêm phần mô tả người và máy. Không có việc này thì sau một năm không ai biết khóa nào của ai.
- Giới hạn quyền cho khóa dùng vào việc tự động: khóa triển khai chỉ nên chạy được một tập lệnh, không mở phiên đăng nhập đầy đủ.
- Rà soát mỗi quý bằng lệnh liệt kê ở trên, đối chiếu với danh sách nhân sự.
- Với nhiều máy chủ, dùng tệp cấu hình để đặt bí danh, xem bài về tệp cấu hình SSH.
Câu hỏi thường gặp
Khóa ed25519 hay rsa tốt hơn?
Ed25519 tốt hơn cho hầu hết trường hợp: ngắn hơn, nhanh hơn, an toàn tương đương hoặc hơn. Chỉ dùng rsa khi phải làm việc với hệ thống cũ không hỗ trợ, và khi đó chọn độ dài từ 4096 bit.
Mất khóa riêng thì sao?
Bạn mất quyền vào các máy chủ đã cài khóa đó, nhưng người khác cũng không vào được nếu khóa có mật khẩu bảo vệ. Đường xử lý là vào máy chủ qua bảng điều khiển của nhà cung cấp, gỡ khóa cũ khỏi danh sách và cài khóa mới.
Có nên dùng một khóa cho tất cả máy chủ không?
Được về mặt kỹ thuật nhưng nên chia theo máy của bạn: mỗi thiết bị một khóa. Khi mất một thiết bị, bạn chỉ gỡ đúng khóa của nó thay vì phải thay khóa trên mọi máy chủ.
Tắt đăng nhập mật khẩu có rủi ro bị khóa ngoài không?
Có nếu bạn tắt trước khi thử khóa. Luôn mở một phiên mới đăng nhập bằng khóa thành công rồi mới đóng phiên cũ. Ngoài ra hầu hết nhà cung cấp đều có bảng điều khiển truy cập trực tiếp làm đường dự phòng.
