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
Và 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.conf
và 100-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:
- 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). - config có thể được/bị override. Giá trị mới sẽ override giá trị cũ.
- 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.