Khi bạn kết nối SSH vào một server, SSH client sẽ tự động tìm kiếm và sử dụng các SSH key được lưu trữ trong hệ thống của bạn. Hiểu được key nào đang được sử dụng có thể giúp khắc phục các vấn đề kết nối và quản lý truy cập an toàn một cách hiệu quả.
Quy Trình Tải SSH Key
Client sẽ cố gắng xác thực bằng cách sử dụng SSH key theo thứ tự sau:
1. Key được chỉ định qua command-line (khi sử dụng tùy chọn -i
)
ssh -i ~/.ssh/specific_key user@server
2. Các key được liệt kê trong SSH config (nếu IdentityFile
được chỉ định)
File cấu hình SSH client (~/.ssh/config
) cho phép bạn chỉ định key nào sẽ được sử dụng cho host nào:
Host myserver
HostName myserver.com
User myuser
IdentityFile ~/.ssh/my_custom_key
Nếu file này tồn tại, SSH sẽ ưu tiên IdentityFile
được chỉ định cho host đó thay vì các key mặc định.
3. Các File SSH Key Mặc Định trong ~/.ssh/
:
id_rsa
(Private Key - RSA)
SSH client kiểm tra các file key sau theo thứ tự ưu tiên:
1. Trên Linux/macOS (thư mục ~/.ssh/
)
~/.ssh/id_rsa
(Private Key - RSA)~/.ssh/id_ecdsa
(Private Key - ECDSA)~/.ssh/id_ed25519
(Private Key - Ed25519)~/.ssh/id_dsa
(Private Key - DSA, không còn được khuyến khích do bảo mật yếu)
2. Trên Windows (OpenSSH)
- OpenSSH trên Windows tuân theo quy ước tương tự và tìm kiếm trong
C:\Users\<username>\.ssh\
.
SSH Agent
SSH agent là một chương trình lưu trữ các private key đã giải mã của bạn trong bộ nhớ, cho phép bạn:
- Chỉ cần nhập passphrase một lần mỗi phiên làm việc
- Sử dụng các key khác nhau cho các server khác nhau mà không cần can thiệp thủ công
Khởi động agent với:
eval $(ssh-agent)
Thêm key vào agent với:
ssh-add ~/.ssh/your_key
Agent forwarding (sử dụng cẩn thận)
ssh -A user@hostname
Hãy nhớ rằng agent forwarding nên được sử dụng một cách hạn chế vì nó làm tăng khả năng bị tấn công.
Trình Tự Tải Key Chi Tiết:
-
SSH client đọc cấu hình từ:
- Cấu hình toàn hệ thống (/etc/ssh/ssh_config)
- Cấu hình riêng của người dùng (~/.ssh/config)
-
Đối với mỗi lần xác thực, client sẽ:
- Kiểm tra xem file private key có tồn tại không
- Xác minh quyền truy cập file (phải là 600 đối với private key)
- Cố gắng giải mã key nếu nó được bảo vệ bằng passphrase
- Trình bày public key tương ứng cho server
-
Server kiểm tra authorized_keys:
- Tìm trong ~/.ssh/authorized_keys của người dùng đang kết nối
- So sánh public key được trình bày với các key đã lưu
- Nếu khớp, tạo một challenge được mã hóa bằng public key
- Client giải mã bằng private key để chứng minh quyền sở hữu
Kiểm Tra SSH Key Nào Đang Được Sử Dụng
Để kiểm tra SSH key nào đang được sử dụng khi kết nối đến server, chạy lệnh:
ssh -v user@server.com
Để liệt kê tất cả các SSH key hiện đang được tải trong SSH agent:
ssh-add -L
Nếu không tìm thấy key nào, bạn có thể cần khởi động SSH agent và thêm key của mình thủ công:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
Những Lưu Ý Quan Trọng Về Bảo Mật:
-
Quyền Truy Cập File:
- Thư mục ~/.ssh nên có quyền 700 (drwx------)
- Private key nên có quyền 600 (-rw-------)
- authorized_keys nên có quyền 600 (-rw-------)
-
Các Loại Key:
- Ưu tiên sử dụng key ed25519 (ssh-keygen -t ed25519)
- Key RSA nên có ít nhất 4096 bit
- Tránh sử dụng key DSA (không an toàn)
-
Bảo Vệ Bằng Passphrase:
- Luôn sử dụng passphrase cho private key
- Sử dụng ssh-agent để tránh phải nhập passphrase thường xuyên
Tóm Tắt
- SSH tự động đọc các file key từ
~/.ssh/
theo thứ tự ưu tiên. - File
~/.ssh/config
có thể ghi đè lựa chọn key mặc định. - Sử dụng
ssh -v
để debug xem key nào đang được sử dụng. - SSH agent quản lý các key đã tải, và
ssh-add
có thể được sử dụng để thêm key mới.
Hiểu rõ các cơ chế này sẽ giúp bạn quản lý xác thực SSH tốt hơn và khắc phục các vấn đề liên quan đến key. 🚀