Hiểu rõ nguyên nhân và cách khắc phục lỗi "Permission denied (publickey)" khi sử dụng SSH key để đăng nhập vào máy chủ. Hướng dẫn chi tiết từ A-Z.
Khắc phục Lỗi "Permission denied (publickey)" Khi Đăng Nhập SSH Key
Khắc phục Lỗi “Permission denied (publickey)” Khi Đăng Nhập SSH Key

Giới Thiệu Về Lỗi “Permission denied (publickey)”

Trong quá trình làm việc với các hệ thống máy chủ, việc sử dụng SSH (Secure Shell) để đăng nhập từ xa là một phương pháp vô cùng phổ biến và hiệu quả. SSH cung cấp một kênh truyền thông được mã hóa, đảm bảo an toàn cho dữ liệu khi truyền tải. Một trong những phương thức xác thực mạnh mẽ và tiện lợi nhất của SSH chính là sử dụng SSH Key. Tuy nhiên, đôi khi người dùng có thể gặp phải thông báo lỗi khó chịu: “Permission denied (publickey)”.

Thông báo lỗi này cho biết rằng máy chủ SSH đã từ chối yêu cầu đăng nhập của bạn vì không thể xác thực bạn bằng khóa công khai (public key) đã được cung cấp. Điều này có thể xuất phát từ nhiều nguyên nhân khác nhau, từ những lỗi cấu hình đơn giản cho đến các vấn đề phức tạp hơn liên quan đến quyền hạn hoặc sự không khớp giữa khóa riêng và khóa công khai.

Bài viết này sẽ đi sâu vào phân tích các nguyên nhân phổ biến dẫn đến lỗi “Permission denied (publickey)” và cung cấp các giải pháp chi tiết, từng bước để bạn có thể khắc phục và khôi phục quyền truy cập SSH một cách hiệu quả.

Hiểu Về Cơ Chế Xác Thực Bằng SSH Key

Để hiểu rõ nguyên nhân của lỗi, trước hết cần nắm vững cách thức hoạt động của cơ chế xác thực bằng SSH Key. SSH Key sử dụng một cặp khóa: khóa riêng (private key) và khóa công khai (public key). Khóa riêng được giữ bí mật tuyệt đối trên máy tính của bạn, trong khi khóa công khai sẽ được lưu trữ trên máy chủ mà bạn muốn kết nối.

Quá trình xác thực diễn ra như sau:

  • Khi bạn cố gắng kết nối SSH, máy khách (client) sẽ gửi khóa công khai của bạn cho máy chủ.
  • Máy chủ sẽ tìm kiếm khóa công khai tương ứng trong danh sách các khóa đã được ủy quyền.
  • Nếu tìm thấy, máy chủ sẽ tạo ra một thông điệp ngẫu nhiên và mã hóa nó bằng khóa công khai của bạn.
  • Thông điệp đã mã hóa này được gửi lại cho máy khách.
  • Máy khách sẽ giải mã thông điệp này bằng khóa riêng tương ứng của bạn.
  • Nếu thông điệp giải mã đúng khớp với thông điệp gốc, máy chủ xác nhận bạn là người sở hữu khóa riêng hợp lệ và cho phép bạn đăng nhập.

Các Nguyên Nhân Phổ Biến Gây Ra Lỗi “Permission denied (publickey)”

Có nhiều yếu tố có thể dẫn đến việc xác thực SSH Key thất bại. Việc xác định đúng nguyên nhân sẽ giúp bạn áp dụng giải pháp phù hợp.

1. Khóa Công Khai Chưa Được Thêm Vào Máy Chủ

Đây là nguyên nhân phổ biến nhất. Bạn có thể đã tạo cặp khóa SSH nhưng quên hoặc chưa thêm khóa công khai của mình vào tệp `authorized_keys` trên máy chủ.

2. Sai Vị Trí Hoặc Cấu Trúc Tệp `authorized_keys`

Tệp `authorized_keys` chứa các khóa công khai được phép truy cập. Nếu tệp này không nằm đúng vị trí (`~/.ssh/authorized_keys` theo mặc định) hoặc có sai sót trong cấu trúc (ví dụ: sai định dạng, có ký tự thừa), máy chủ sẽ không thể đọc và sử dụng các khóa đó.

3. Quyền Hạn (Permissions) Của Thư Mục Và Tệp SSH

Hệ thống Linux/Unix rất chú trọng đến quyền hạn tệp và thư mục. Nếu các thư mục `.ssh` hoặc tệp `authorized_keys` có quyền truy cập quá rộng rãi (ví dụ: có thể ghi bởi người dùng khác), SSH server sẽ từ chối sử dụng chúng vì lý do bảo mật.

4. Khóa Riêng (Private Key) Không Được Máy Khách Nhận Diện

Máy khách SSH cần biết vị trí của khóa riêng mà nó nên sử dụng để xác thực. Nếu bạn không chỉ định đúng đường dẫn hoặc khóa riêng không có mặt tại vị trí mặc định (`~/.ssh/id_rsa`), máy khách sẽ không thể thực hiện bước giải mã.

5. Cấu Hình Sai Trên Máy Chủ SSH (sshd_config)

Tệp cấu hình của dịch vụ SSH server (`/etc/ssh/sshd_config`) có thể được cấu hình để không cho phép xác thực bằng khóa công khai, hoặc có các cài đặt khác hạn chế quá trình này.

6. Sự Không Khớp Giữa Khóa Riêng Và Khóa Công Khai

Mặc dù ít gặp hơn, nhưng đôi khi bạn có thể vô tình sử dụng sai cặp khóa, tức là khóa riêng bạn đang dùng không phải là khóa tương ứng với khóa công khai đã được thêm vào máy chủ.

7. Tên Người Dùng (Username) Sai

Đảm bảo bạn đang cố gắng đăng nhập với đúng tên người dùng trên máy chủ. Máy chủ sẽ tìm kiếm tệp `authorized_keys` trong thư mục chính của người dùng đó.

Các Bước Khắc Phục Lỗi “Permission denied (publickey)”

Dưới đây là các bước chi tiết để bạn có thể từng bước khắc phục sự cố này.

Bước 1: Kiểm Tra Tệp `authorized_keys` Trên Máy Chủ

Đăng nhập vào máy chủ bằng một phương thức khác (ví dụ: mật khẩu, nếu được phép) hoặc yêu cầu người quản trị hệ thống kiểm tra giúp. Sau đó, thực hiện các lệnh sau:

1. Di chuyển đến thư mục chính của người dùng bạn muốn đăng nhập:

cd ~

2. Kiểm tra xem thư mục `.ssh` có tồn tại không. Nếu chưa có, tạo nó:

mkdir ~/.ssh

3. Đặt quyền hạn chính xác cho thư mục `.ssh`:

chmod 700 ~/.ssh

4. Kiểm tra xem tệp `authorized_keys` có tồn tại trong `.ssh` không. Nếu chưa có, tạo nó:

touch ~/.ssh/authorized_keys

5. Đặt quyền hạn chính xác cho tệp `authorized_keys`:

chmod 600 ~/.ssh/authorized_keys

6. Mở tệp `authorized_keys` bằng trình soạn thảo văn bản (ví dụ: nano, vi):

nano ~/.ssh/authorized_keys

7. **Quan trọng:** Dán khóa công khai của bạn vào tệp này. Đảm bảo rằng toàn bộ khóa công khai (bắt đầu bằng `ssh-rsa` hoặc `ssh-ed25519` và kết thúc bằng tên người dùng hoặc mô tả) được đặt trên một dòng duy nhất. Xóa bỏ mọi ký tự xuống dòng hoặc khoảng trắng thừa.

8. Lưu tệp và thoát trình soạn thảo.

Bước 2: Kiểm Tra Khóa Riêng Trên Máy Khách

Trên máy tính của bạn (máy khách), hãy đảm bảo rằng bạn đang sử dụng đúng khóa riêng.

1. Kiểm tra vị trí mặc định của khóa riêng. Thường là `~/.ssh/id_rsa` (cho khóa RSA) hoặc `~/.ssh/id_ed25519` (cho khóa Ed25519).

2. Nếu khóa riêng của bạn nằm ở vị trí khác, bạn cần chỉ định đường dẫn này khi kết nối SSH bằng tùy chọn `-i`:

ssh -i /duong/dan/den/khoa_rieng.pem ten_nguoi_dung@dia_chi_ip_may_chu

3. Đảm bảo quyền hạn của tệp khóa riêng trên máy khách là `600` (chỉ người dùng sở hữu mới có quyền đọc/ghi):

chmod 600 ~/.ssh/id_rsa

Bước 3: Kiểm Tra Cấu Hình Máy Chủ SSH (sshd_config)

Đây là bước nâng cao hơn và yêu cầu quyền truy cập root hoặc sudo trên máy chủ.

1. Mở tệp cấu hình SSH server:

sudo nano /etc/ssh/sshd_config

2. Tìm và đảm bảo các dòng sau được thiết lập đúng (bỏ dấu `#` ở đầu dòng nếu có):

  • PubkeyAuthentication yes: Bật xác thực bằng khóa công khai.
  • AuthorizedKeysFile .ssh/authorized_keys: Chỉ định đúng đường dẫn đến tệp chứa khóa công khai.

3. Sau khi thay đổi cấu hình, bạn cần khởi động lại dịch vụ SSH server:

sudo systemctl restart sshd

Hoặc

sudo service ssh restart

Bước 4: Kiểm Tra Tên Người Dùng và Địa Chỉ IP

Đôi khi, lỗi đơn giản chỉ là bạn gõ sai tên người dùng hoặc địa chỉ IP của máy chủ. Hãy kiểm tra kỹ các thông tin này trước khi kết nối.

Bước 5: Sử Dụng Chế Độ Debugging Của SSH

Nếu vẫn gặp sự cố, bạn có thể sử dụng tùy chọn `-v`, `-vv` hoặc `-vvv` để xem nhật ký chi tiết của quá trình kết nối SSH. Điều này sẽ cung cấp thêm thông tin về lỗi xảy ra.

ssh -vvv -i /duong/dan/den/khoa_rieng.pem ten_nguoi_dung@dia_chi_ip_may_chu

Câu hỏi thường gặp (FAQ)

Làm thế nào để tạo một cặp SSH Key mới?

Bạn có thể sử dụng lệnh `ssh-keygen` trên máy khách. Ví dụ: ssh-keygen -t rsa -b 4096. Lệnh này sẽ tạo ra hai tệp: khóa riêng (mặc định là `id_rsa`) và khóa công khai (mặc định là `id_rsa.pub`) trong thư mục `~/.ssh/` của bạn.

Tôi có thể sử dụng một khóa SSH cho nhiều máy chủ không?

Có. Bạn chỉ cần thêm khóa công khai của mình vào tệp `authorized_keys` trên tất cả các máy chủ mà bạn muốn kết nối. Tuy nhiên, hãy cẩn trọng với việc quản lý khóa riêng của bạn.

Lỗi “Too many authentication failures” có liên quan không?

Có. Lỗi này thường xảy ra khi bạn thử đăng nhập nhiều lần nhưng đều thất bại, đặc biệt là khi cấu hình máy chủ SSH có các giới hạn về số lần thử xác thực. Việc khắc phục lỗi “Permission denied (publickey)” đúng cách thường sẽ giải quyết được vấn đề này.

Tôi có thể dùng mật khẩu thay cho SSH Key không?

Có, nếu máy chủ SSH được cấu hình cho phép cả hai phương thức. Tuy nhiên, việc sử dụng SSH Key được khuyến khích hơn vì tính bảo mật và tiện lợi của nó.

Kết Luận

Lỗi “Permission denied (publickey)” là một vấn đề phổ biến nhưng hoàn toàn có thể khắc phục được. Bằng cách hiểu rõ cơ chế hoạt động của SSH Key và kiểm tra cẩn thận các yếu tố như quyền hạn tệp, cấu hình máy chủ, và sự khớp nhau giữa các khóa, bạn có thể nhanh chóng xác định và giải quyết nguyên nhân. Đừng quên sử dụng các tùy chọn gỡ lỗi của SSH để có thêm thông tin khi cần thiết.

Hãy áp dụng các bước hướng dẫn chi tiết trong bài viết để đảm bảo kết nối SSH của bạn luôn ổn định và an toàn. Nếu bạn gặp khó khăn, hãy xem lại từng bước hoặc tham khảo thêm tài liệu chính thức từ nhà cung cấp hệ điều hành hoặc dịch vụ máy chủ của bạn.