Hướng dẫn toàn diện: Sửa lỗi "Permission denied (publickey)" trong SSH

Nguyên nhân và cách khắc phục lỗi "Permission denied (publickey)" khi kết nối SSH

Lỗi "Permission denied (publickey)" là một trong những thông báo lỗi phổ biến nhất mà quản trị viên hệ thống gặp phải khi thiết lập kết nối SSH. Lỗi này xuất hiện khi máy chủ từ chối xác thực khóa công khai của bạn, ngăn cản việc truy cập từ xa vào hệ thống. Bài viết này sẽ hướng dẫn bạn cách xác định và khắc phục vấn đề này một cách hiệu quả.

Hiểu rõ về cơ chế xác thực SSH và lỗi publickey

SSH (Secure Shell) là giao thức mạng bảo mật cho phép truy cập từ xa an toàn vào máy chủ. Khi cấu hình SSH sử dụng xác thực khóa công khai, máy chủ sẽ kiểm tra xem khóa được cung cấp có khớp với khóa được ủy quyền hay không. Lỗi "Permission denied (publickey)" xuất hiện khi quá trình xác thực này thất bại, thường do cấu hình không chính xác hoặc vấn đề về quyền truy cập.

Kiểm tra cấu hình SSH cơ bản

Bước đầu tiên khi khắc phục lỗi này là xác minh rằng dịch vụ SSH đang hoạt động và cấu hình cơ bản đã chính xác. Kiểm tra trạng thái của dịch vụ SSH bằng lệnh sau:

sudo systemctl status sshd
# hoặc
sudo service ssh status

Đảm bảo dịch vụ đang hoạt động và không có thông báo lỗi nào khác. Tiếp theo, kiểm tra file cấu hình SSH tại "/etc/ssh/sshd_config" để xác nhận các thiết lập xác thực:

sudo nano /etc/ssh/sshd_config

Tìm và kiểm tra các dòng sau để đảm bảo xác thực khóa công khai được bật:

PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

Kiểm tra và sửa quyền truy cập của thư mục và file SSH

Một trong những nguyên nhân phổ biến nhất của lỗi "Permission denied (publickey)" là quyền truy cập không đúng đối với thư mục .ssh và các file bên trong. SSH yêu cầu các quyền truy cập nghiêm ngặt để đảm bảo an ninh. Thực hiện các lệnh sau để thiết lập quyền chính xác:

# Thiết lập quyền cho thư mục home
chmod 755 ~

# Thiết lập quyền cho thư mục .ssh
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# Thiết lập quyền cho file authorized_keys
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Đảm bảo rằng chủ sở hữu của các file này là người dùng đang cố gắng đăng nhập, không phải là root hoặc người dùng khác:

chown -R username:username ~/.ssh

Xác minh và cập nhật khóa SSH

Đảm bảo rằng khóa công khai của bạn đã được thêm chính xác vào file authorized_keys trên máy chủ. Nếu bạn chưa tạo cặp khóa SSH, thực hiện lệnh sau trên máy khách:

ssh-keygen -t rsa -b 4096

Sau đó, sao chép khóa công khai vào máy chủ. Có nhiều cách để làm điều này, nhưng phương pháp đơn giản nhất là sử dụng lệnh ssh-copy-id:

ssh-copy-id username@remote_host

Nếu không thể sử dụng ssh-copy-id, bạn có thể thêm khóa thủ công bằng cách sao chép nội dung từ ~/.ssh/id_rsa.pub và thêm vào ~/.ssh/authorized_keys trên máy chủ.

Kiểm tra cấu hình SSH nâng cao trên máy chủ

Đôi khi, các thiết lập SSH nâng cao có thể gây ra lỗi xác thực. Kiểm tra các cài đặt sau trong file sshd_config:

# Kiểm tra các cài đặt liên quan đến xác thực
PasswordAuthentication yes  # Tạm thời bật để kiểm tra nếu cần
ChallengeResponseAuthentication no
UsePAM yes

# Kiểm tra các hạn chế truy cập
AllowUsers username
AllowGroups sshusers

Sau khi thực hiện thay đổi, khởi động lại dịch vụ SSH:

sudo systemctl restart sshd
# hoặc
sudo service ssh restart

Sử dụng chế độ debug để xác định lỗi chính xác

Khi các biện pháp trên không giải quyết được vấn đề, việc sử dụng chế độ debug của SSH có thể cung cấp thông tin chi tiết về lỗi. Thêm cờ -v (có thể lặp lại để tăng mức độ chi tiết) khi kết nối:

ssh -vvv username@remote_host

Đọc kỹ kết quả đầu ra để tìm thông tin về quá trình xác thực và các lỗi cụ thể. Thông thường, thông báo lỗi sẽ chỉ ra chính xác vấn đề và cách khắc phục.

Các trường hợp đặc biệt cần lưu ý

Ngoài các vấn đề phổ biến, có một số trường hợp đặc biệt có thể gây ra lỗi "Permission denied (publickey)":

  • SELinux hoặc AppArmor: Các hệ thống bảo mật nâng cao có thể chặn truy cập SSH dù cấu hình đã đúng. Kiểm tra và điều chỉnh chính sách nếu cần.
  • Tường lửa: Đảm bảo cổng SSH (thường là 22) không bị chặn bởi tường lửa.
  • Định dạng file authorized_keys: File này nên có mỗi khóa trên một dòng, không có dấu cách thừa.
  • Thư mục home được mã hóa: Trên một số hệ thống với thư mục home được mã hóa, SSH có thể không truy cập được file authorized_keys.

Kết luận và các biện pháp phòng ngừa

Lỗi "Permission denied (publickey)" thường có thể khắc phục bằng cách kiểm tra cẩn thận cấu hình SSH, quyền truy cập file và quá trình xác thực khóa. Để tránh gặp lại vấn đề này trong tương lai, hãy thiết lập quy trình kiểm tra khi cấu hình SSH mới, luôn giữ bản sao lưu của các cặp khóa quan trọng, và xem xét sử dụng các công cụ quản lý SSH chuyên dụng cho môi trường nhiều máy chủ.

Với những hướng dẫn chi tiết trên, quản trị viên hệ thống có thể hiệu quả khắc phục lỗi "Permission denied (publickey)" và đảm bảo kết nối SSH an toàn, ổn định cho hệ thống của mình.