HỌC BẰNG THỰC HÀNH
← Lộ trình học
01 · Linux Administration

SSH key và hardening sshd

Thực hiện trên server của bạn, rồi kiểm tra từng tiêu chí.

Cốt lõi

Vì sao cần học

Server có IP công khai bị dò mật khẩu SSH chỉ vài phút sau khi bật. Đăng nhập bằng key và tắt mật khẩu loại bỏ gần như toàn bộ kiểu tấn công này. Đây cũng là bước bắt buộc trước khi mở bất kỳ port nào trên VPS lab.

Mục tiêu

  • Tạo cặp key ed25519 và hiểu private key, public key nằm ở đâu.
  • Cấp quyền đăng nhập bằng key cho một user với đúng owner và quyền.
  • Viết drop-in cấu hình sshd, kiểm tra cú pháp và reload an toàn.
  • Hiểu vì sao sai quyền .ssh khiến key bị từ chối âm thầm.

Điều kiện tiên quyết

  • Bài User, group và thư mục dùng chung.
  • Một phiên SSH vào VM, và thêm một phiên dự phòng (console của VM hoặc SSH thứ hai) mở trong suốt bài.

Mental model

Private key ở lại máy bạn, public key đặt trên server. Khi đăng nhập, server thách thức client chứng minh đang giữ private key tương ứng với một dòng trong authorized_keys. Private key không bao giờ rời máy bạn.

sshd rất khắt khe về quyền. Nếu ~/.ssh hoặc authorized_keys ghi được bởi người khác, sshd bỏ qua key (StrictModes). Triệu chứng là bị hỏi mật khẩu dù đã có key. Lý do thật chỉ nằm trong log của server.

Drop-in thay vì sửa file gốc. /etc/ssh/sshd_config include các file /etc/ssh/sshd_config.d/*.conf theo thứ tự tên. Với sshd, giá trị gặp đầu tiên thắng, nên file tên 10-... được ưu tiên hơn 50-redhat.conf hay 50-cloud-init.conf.

Thực hành (Guided Lab)

1. Key cho tài khoản quản trị của bạn

Trên máy của bạn (không phải VM):

ssh-keygen -t ed25519 -f ~/.ssh/kdc_lab -C "kdc-lab"
ssh-copy-id -i ~/.ssh/kdc_lab.pub <user>@<ip-của-vm>
ssh -i ~/.ssh/kdc_lab <user>@<ip-của-vm> 'echo key OK'
Giải thích lệnh và tham số
Lệnh / tùy chọnÝ nghĩa
ssh-keygenTạo cặp private/public key; giữ private key trên laptop.
-t ed25519Chọn thuật toán key.
-f ~/.ssh/kdc_labChọn tên file private key; public key có thêm .pub. Nếu file đã có, không xác nhận ghi đè trừ khi bạn muốn thay key.
-C "kdc-lab"Gắn comment để nhận biết key. -C hoa khác -c thường.
ssh-copy-id -i ...pubCài public key được chỉ định vào authorized_keys trên server.
ssh -i ...kdc_labChọn private key dùng để đăng nhập; -i có nghĩa tùy lệnh, ở đây nhận file private key.
'echo key OK'Lệnh được SSH chạy ở VM sau khi đăng nhập, rồi kết thúc phiên.

passwd <user> đặt mật khẩu user trên VM; sudo -v xác thực/cập nhật phiên quyền sudo mà chưa chạy lệnh quản trị khác. Thay <user> và <ip-của-vm> bằng giá trị thật.

Phải thấy key OK mà không bị hỏi mật khẩu đăng nhập. Chưa được thì dừng lại, chưa tắt mật khẩu.

VPS chỉ có tài khoản root: trước tiên tạo user quản trị (useradd -m -G wheel <user>, passwd <user>), copy key cho user đó, thử sudo -v, rồi mới làm tiếp.

2. User deploy chỉ đăng nhập bằng key

scp ~/.ssh/kdc_lab.pub <user>@<ip-của-vm>:/tmp/kdc_lab.pub

Trên VM:

sudo useradd -m kdc-deploy
sudo install -d -m 700 -o kdc-deploy -g kdc-deploy /home/kdc-deploy/.ssh
sudo install -m 600 -o kdc-deploy -g kdc-deploy /tmp/kdc_lab.pub /home/kdc-deploy/.ssh/authorized_keys
sudo restorecon -Rv /home/kdc-deploy/.ssh
rm /tmp/kdc_lab.pub
Giải thích lệnh và tham số

install -m 600 -o kdc-deploy -g kdc-deploy <nguồn> <đích> copy file và đặt quyền, owner, group trong cùng thao tác. Khi không có -d, install ở đây copy file. restorecon -Rv khôi phục SELinux context theo policy: -R đi qua thư mục con, -v in thay đổi. rm /tmp/kdc_lab.pub xóa bản public key tạm trên VM; private key vẫn ở laptop.

restorecon gán lại SELinux context đúng cho file vừa tạo. Thiếu bước này, SELinux có thể chặn sshd đọc authorized_keys.

Từ máy của bạn: ssh -i ~/.ssh/kdc_lab kdc-deploy@<ip-của-vm>.

3. Tắt mật khẩu và root login

sudo tee /etc/ssh/sshd_config.d/10-kdc-hardening.conf <<'EOF'
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
EOF
sudo sshd -t && sudo systemctl reload sshd
sudo sshd -T | grep -Ei '^(passwordauthentication|kbdinteractiveauthentication|permitrootlogin) '
Giải thích lệnh và tham số

sshd là chương trình dịch vụ SSH: -t chỉ kiểm tra cú pháp/key, -T in cấu hình hiệu lực. && chỉ chạy lệnh reload nếu bước kiểm tra trước đó thành công. systemctl reload yêu cầu dịch vụ nạp lại cấu hình mà không dừng toàn bộ dịch vụ khi được hỗ trợ. grep -Ei gộp -E (regex mở rộng) và -i (bỏ qua hoa/thường); ^ giới hạn đầu dòng, các dấu | trong mẫu chọn một trong ba tên cấu hình.

sshd -t kiểm tra cú pháp trước khi reload. sshd -T in cấu hình hiệu lực: đây là evidence đúng, không phải nội dung file bạn vừa viết.

4. Chứng minh mật khẩu đã bị từ chối

Từ một terminal mới trên máy của bạn:

ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password <user>@<ip-của-vm>
Giải thích lệnh và tham số

ssh -o <tên>=<giá-trị> đặt tùy chọn cho riêng lần kết nối này. PubkeyAuthentication=no tắt thử public key; PreferredAuthentications=password chỉ thử phương thức mật khẩu. Lệnh cố ý cần thất bại sau hardening; không dùng nó làm lệnh đăng nhập hằng ngày.

Kết quả mong đợi: Permission denied (publickey...). Giữ nguyên phiên dự phòng cho đến khi đăng nhập bằng key vẫn thành công.

Tự kiểm tra (Verification)

sudo ls -la /home/kdc-deploy/.ssh
sudo sshd -T | grep -Ei '^(passwordauthentication|permitrootlogin) '
systemctl is-active sshd
Giải thích lệnh và tham số

ls -la gộp -l (chi tiết) với -a (hiện cả tên bắt đầu bằng dấu chấm). Với lỗi xác thực, sudo journalctl -u sshd -n 30 xem 30 dòng log gần nhất của unit SSH: -u chọn unit, -n chọn số dòng. Nếu vào trình xem phân trang, nhấn q để thoát.

Chọn server và bấm Kiểm tra kết quả.

Lỗi thường gặp

  • Vẫn bị hỏi mật khẩu: xem sudo journalctl -u sshd -n 30 trên server. Thường gặp: bad ownership or modes, SELinux context sai, hoặc dán public key bị xuống dòng.
  • Tắt mật khẩu trước khi thử key: tự khóa mình ngoài server. Dùng console của VM hoặc của nhà cung cấp VPS để sửa.
  • Sửa /etc/ssh/sshd_config nhưng không có tác dụng: một file trong sshd_config.d/ đã đặt giá trị trước. Dùng sshd -T để biết giá trị cuối cùng.

Ghi chú production

  • Mỗi người một key, có passphrase. Khi người đó rời nhóm, xóa dòng key của họ.
  • Trên VPS, kết hợp với firewall chỉ mở các port cần thiết (Module 01, bài checkpoint) và firewall của nhà cung cấp.

Ghi chú Ubuntu

Unit là ssh.service (có alias sshd). Không cần restorecon vì Ubuntu dùng AppArmor. Ubuntu 24.04 dùng socket activation: sau khi đổi cấu hình, chạy sudo systemctl restart ssh.

Tài liệu chính thức