+3

Hướng dẫn config OpenSSH server

Chào anh em, Hôm nay mình chia sẻ một tip nhỏ về config OpenSSH server (sshd) trên Linux.

Vào đề

Mình có thuê một con VPS trên cloud, lúc tạo instance thì bị yêu cầu tạo password cho user mặc dù đã thêm key pair. Như vậy là mình có thể ssh vào server bằng password hoặc identity key. Nhưng để đảm bảo tính bảo mật và tiện lợi nên mình không muốn cho phép connect bằng password mà chỉ muốn cho phép connect bằng identity key.

Cách mình đã thử và thất bại

Mặc định thì thuộc tính PasswordAuthentication trong file /etc/ssh/sshd_config được set là yes nên mình đã comment out nó đi như sau.

#PasswordAuthentication yes

Sau đó mình restart lại sshd bằng command sau:

sudo systemctl restart sshd

Tuy nhiên kết quả không như mong muốn, mình vẫn có thể connect bằng password. Mình thử check giá trị hiện tại của thuộc tính PasswordAuthentication bằng command sau.

sudo sshd -T | grep -i PasswordAuthentication

Thì bất ngờ kết quả là:

passwordauthentication yes

Tại sao mình đã comment out dòng PasswordAuthentication yes ( đồng nghĩ là PasswordAuthentication = no) trong file config rồi mà tại sao vẫn là yes.

Cách giải quyết

Sau khi check lại file config thì mình phát hiện dòng sau.

Include /etc/ssh/sshd_config.d/*.conf

Thì ra config không chỉ được load từ file /etc/ssh/sshd_config mà còn được load từ tất cả các file có đuôi .conf nằm trong thư mục /etc/ssh/sshd_config.d.

Đây là một concept khá phổ biến của một số service trong Linux. Thường sẽ có một file config mặc định (như ở trên là /etc/ssh/sshd_config) và có một thư mục để lưu các custom config (ở trên là /etc/ssh/sshd_config.d) - nơi mà chúng ta thường thêm vào chứ ít khi sửa trực tiếp file config mặc định. Config ở trong thư mục config.d sẽ override (ghi đè) config mặc định. Ngoài OpenSSH thì mình đã gặp Nginx, PostgreSQL.

Quả nhiên trong thư mục /etc/ssh/sshd_config.d có một số file config khác.

ls /etc/ssh/sshd_config.d/
100-allowsshrsa.conf  50-cloud-init.conf

thủ phạm làm cho việc mình vẫn có thể login bằng password là file 50-cloud-init.conf

PasswordAuthentication yes

Lưu ý: file(s) và nội dung file(s) có thể khác nhau tùy theo OS/ Distro.

Ok, nguyên nhân thì đã rõ rồi nên giải quyết sẽ đơn giản thôi.

... Nhưng có thể bạn đã lầm, mình sẽ không sửa trực tiếp vào file 50-cloud-init.conf vì mình không biết file đó của ai và nó không phải là của mình. Cũng tương tự như việc mình không nên tự ý chỉnh sửa file/code/chức năng của người khác mà chỉ chỉnh sửa những gì của mình để hạn chế conflict.

Quay lại vấn đề, mình sẽ giải quyết bằng cách tạo một file config mới cho thuộc tính là PasswordAuthentication với giá trị là no. để cho nó override config trong file 50-cloud-init.conf.

Nhưng làm sao để có thể override config trong file 50-cloud-init.conf? Nếu bạn để ý thì sẽ thấy tên file bắt đầu bằng các con số 50 hay 100. Các số này nhằm chỉ mức độ ưu tiên. Config nằm trong ở file nào có tên file bắt đầu bằng chữ số lớn hơn thì mức độ ưu tiên sẽ cao hơn.

Quy tắc (rule) như sau:

  • Config ở trong file có chữ số nhỏ hơn sẽ được đọc trước, sau đó đến file có số lớn hơn.
  • Config đọc sau sẽ override config trước đó

Như trường hợp của mình ở trên, OpenSSH sẽ đọc file 50-cloud-init.conf trước, sau đó đến file 100-allowsshrsa.conf. Nếu config nào có trong cả 2 file 50-cloud-init.conf100-allowsshrsa.conf thì giá trị trong file 100-allowsshrsa.conf sẽ được ưu tiên.

Như vậy là mình đã rõ quy tắc override rồi thì mình chỉ cần tạo một file có tên file bắt đầu bằng chữ số lớn hơn hoặc bằng 50 là mình có thể override config nằm trong file 50-cloud-init.conf. Vì sao có thể bằng 50? Vì 50-cloud-init2.conf sẽ được đọc sau nên cũng có thể override file 50-cloud-init.conf. Nhưng trường hợp này mình muốn config của mình có mức độ ưu tiên cao nhất nên mình đặt tên file là 1000-customize.conf (override file 100-allowsshrsa.conf luôn). Nội dung file thì như bạn có thể đoán.

PasswordAuthentication no

Test lại nào.

sudo sshd -T | grep -i PasswordAuthentication
passwordauthentication no

Có vẻ ok rồi. Restart sshd service sau đó xem còn có thể connect bằng password nữa không nào. Chắc chắn là không được rồi.

ssh nam@163.44.98.44
nam@163.44.98.44: Permission denied (publickey).

Tổng kết

Bài này mình lấy tip hướng dẫn config không cho login bằng password làm ví dụ nhưng mình tóm lại mình muốn chia sẻ mấy point sau:

  1. config không chỉ được config ở file /etc/ssh/sshd_config mà còn có thể config bằng cách thêm/sửa file ở trong thư mục /etc/ssh/sshd_config.d (có thể custom lại include/ignore hay thư mục nhưng nằm ngoài phạm vi bài viết này).
  2. config có thể được/bị override. Giá trị mới sẽ override giá trị cũ.
  3. Nội dung bài viết này không chỉ áp dụng với OpenSSH mà còn có thể áp dụng với các service khác.

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.