Sau bài này bạn làm được: triển khai SSH key-first với permission đúng; đọc và giải thích các directive sshd_config phổ biến; thiết kế bastion đơn giản; biết khi nào cần CA signing host key (trust on first use ở quy mô lớn); tránh các lỗi khiến sshd refuse login mà log chỉ một dòng.
Nếu blog của bạn có mục tech note về SSH hardening, hãy liên kết chéo từ đó tới bài này. Loạt Linux ops đi sâu hơn theo góc vận hành máy chủ (sshd, key, bastion).
SSH là giao thức được tin quá mức trong nhiều tổ chức
Hầu hết path quản trị đi qua SSH: human, Ansible, Terraform provisioner, git remote qua SSH… Nếu SSH yếu, mọi lớp khác trở nên vô nghĩa.
Mô hình: client có private key (hoặc password); server có authorized_keys hoặc PAM backend; sshd chạy privileged để bind 22 rồi drop xuống user (tuỳ build).
authorized_keys và permission
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
# home directory không được writable bởi others — sshd strict mode
chmod go-w "$HOME"
Debug: chạy server debug (chỉ lab):
sudo /usr/sbin/sshd -ddd -p 2222
sshd_config — checklist thực dụng
| Directive | Gợi ý |
|---|---|
PasswordAuthentication | no khi đã có key + break-glass |
PermitRootLogin | prohibit-password hoặc no |
PubkeyAuthentication | yes |
AllowUsers / AllowGroups | giới hạn account có shell |
MaxAuthTries | giảm brute-force noise |
LoginGraceTime | giảm connection pile-up |
ClientAliveInterval | tránh NAT middlebox drop idle |
Subsystem sftp | nếu chỉ cần SFTP-only user |
Luôn sshd -t sau sửa config:
sudo sshd -t && sudo systemctl reload ssh.service
Host key verification: known_hosts và TOFU
Lần đầu SSH báo fingerprint — đó là Trust on First Use. Ở quy mô lớn, team dùng SSH CA ký host key để client tin một CA nội bộ thay vì từng fingerprint.
Bastion / jump host — đơn giản hoá routing
Host internal-*
User deploy
ProxyJump bastion.example.com
Trade-off: mọi traffic qua bastion — bastion trở thành SPOF và audit point; cần hardening riêng và logging.
scp / rsync qua SSH
rsync -avz -e ssh ./localdir/ user@host:/remote/path/
Lưu ý: trailing slash ảnh hưởng semantics — đọc man rsync mỗi khi copy tree quan trọng.
Agent forwarding -A
Tiện (dùng key trên laptop để git clone qua bastion) nhưng nếu bastion bị compromise, attacker có thể dùng forwarded agent. Chỉ bật khi cần và thoát session sớm.
Fail2ban / rate limit
Lớp bổ sung trên log — không thay thế key-only + firewall. Cẩn thận false positive khi NAT văn phòng chung IP.
Liên hệ bài trước / sau
- Trước: Phần 9: Firewall
- Sau: Phần 11: Thời gian, timezone, logrotate
- Mạng host: Phần 8 Mạng — Linux networking ops
Câu hỏi hay gặp
1. “Ed25519 hay RSA?”
Ed25519 ngắn gọn và hiện đại; RSA vẫn gặp trong legacy HSM — chọn theo constraint thực tế.
2. “Tôi đổi port SSH sang 2222 có an toàn hơn?”
Security through obscurity nhẹ — giảm scan noise nhưng không thay thế key/auth policy.
3. “Match User trong sshd_config?”
Hữu ích để policy khác cho git user vs admin user — đọc man sshd_config phần Match.
Bài tiếp theo trong loạt
→ Phần 11: Thời gian, timezone và logrotate — đồng hồ sai, log và TLS đều “lạ”.