Đăng nhập SSH server với public key và private key

Để quản lý một VPS linux, phương thức kết nối thường được sử dụng là SSH ở port 22. Khi để mặc định kết nối SSH, VPS rất dễ bị bot quét port để dò thông tin username và mật khẩu yếu bằng phương pháp brute force. Nếu mật khẩu yếu sẽ bị hack và bị đưa vào hệ thống bot net. Để kiểm tra những dạng login kiểu này, có thể dùng lệnh grep "Failed password" /var/log/auth.log để xem nhật kí login thất bại. Nếu bạn sử dụng mật khẩu SSH/SFTP đủ mạnh, tài khoản có thể an toàn trước các cuộc tấn công brute force. Tuy nhiên, sử dụng xác thực bằng public key để đăng nhập SSH có nhiều tiện lợi, giảm thiểu khả năng bị hack và an toàn hơn rất nhiều lần so với mật khẩu thông thường. Xác thực bằng khoá public key là cách đăng nhập vào tài khoản SSH/SFTP bằng private key thay vì mật khẩu.

Những ưu điểm xác thực bằng public key có thể kể ra như sau:

  • Cho phép nhiều người đăng nhập với cùng tên người dùng (user) trên hệ thống mà không phải chia sẻ một mật khẩu.

  • Thu hồi quyền truy cập user nào đó mà không thu hồi quyền truy cập của các thành viên khác.

  • Giúp đăng nhập vào nhiều tài khoản SSH dễ dàng hơn mà không cần phải quản lý nhiều mật khẩu.

  • Thêm lớp bảo mật cho private key bằng cách sử dụng key có mật khẩu.

Bây giờ chúng ta sẽ xem xét một cách chi tiết hơn.

Phương thức xác thực public key làm việc như thế nào?

Để xác thực bằng public key cần phải có public keyprivate key. Mỗi cặp public và private key là duy nhất và chúng hoạt động cùng với nhau. Hai khóa này có một thuộc tính toán học rất đặc biệt: nếu bạn có private key, bạn có thể chứng minh bạn có nó mà không cần đưa ra cho người khác xem. Nó giống như việc chứng minh bạn biết mật khẩu mà không cần phải cho ai đó xem mật khẩu.

Xác thực SSH sử dụng public key hoạt động như sau:

  • Tạo một cặp public keyprivate key.

  • Lưu public key ở máy chủ VPS.

  • Khi login VPS, máy chủ sẽ yêu cầu bạn chứng minh bạn có private key tương ứng với public key đã lưu ở máy chủ VPS.

  • Chứng minh bạn có private key và việc xác thực được đảm nhận bởi chương trình SSH trên máy chủ.

Tạo khóa mã hóa SSH public key và private key

Trên Linux và Mac có sẵn lệnh ssh-keygen để tạo ra một cặp public keyprivate key. Khóa public keyprivate key nên tạo ở một máy khác máy chủ VPS và lưu nó ở một nơi nào đó an toàn trên máy tính và nên sao lưu một bản backup ở lastpass.

Nếu sử dụng Windows, bạn SSH vào máy chủ VPS và sử dụng lệnh ssh-keygen, sau đó lưu về máy tính cá nhân. Xóa private key trên máy chủ VPS.

Tạo public key và private key cho SSH

Tạo public key và private key cho SSH

Tóm lại, để tạo cặp khoá SSH chạy lệnh ssh-keygen, bạn có thể đặt password cho private key được tạo ra. Nếu để các tùy chọn mặc định bạn sẽ có 2 file được tạo ra nằm ở thư mục ~/.sshid_rsa.pubid_rsa. Nội dung id_rsa.pub chính là public key, và id_rsa chính là private key

ssh-keygen

Có thể sử dụng lệnh với các tham số như sau

ssh-keygen -t rsa -C "Ghi chu ve SSH (ví dụ: SSH-key VPS)"

Hiện nay, chuẩn mã hoá key Ed25519 đã và đang thay thế RSA vì chuẩn bảo mật. Chuẩn Ed25519 được giới thiệu trong OpenSSH phiên bản 6.5. Bạn phải sử dụng chuẩn này đối với OpenSSH 6.5 mới có thể hoạt động được (ví dụ Ubuntu 22).

$ ssh-keygen -t ed25519

Cấu hình để sử dụng SSH key

Nguyên tắc của việc cấu hình này là bạn copy nội dung public key lên VPS và phân quyền đúng cho thư mục .ssh chứa nội dung public key đó

Cách 1: Sử dụng lệnh ssh-copy-id

Sau khi đã có SSH keys bằng cách sử dụng lệnh câu lệnh ssh-keygen, bạn sử dụng lệnh ssh-copy-id để copy public key vào máy chủ. Đảm bảo thay thế remote bằng địa chỉ IP của máy chủ VPS và user bằng tên user của bạn, ví dụ như root.

ssh-copy-id user@remote

Cách 2: Cấu hình thủ công

Vì một lý do nào đó mà bạn không thể sử dụng lệnh ssh-copy-id (ví dụ: nếu bạn đang sử dụng Windows), thay vào đó, bạn có thể SSH vào máy chủ và tạo thủ công thư mục .ssh để chứa khóa public key.

Bạn có thể thực hiện 2 câu lệnh bên dưới để tạo thư mục .ssh và file authorized_keys.

umask 077 && test -d ~/.ssh || mkdir ~/.ssh
umask 077 && touch ~/.ssh/authorized_keys

Tiếp theo, dùng lệnh authorized_keys. Copy nội dung id_rsa.pub vào file authorized_keys

Hoặc bạn cũng có thể thực hiện theo những câu lệnh sau với lưu ý là file id_rsa.pub đã có sẵn hoặc được copy vào thư mục hiện hành của câu lệnh cat

ssh user@remote
mkdir ~/.ssh
chmod 700 ~/.ssh
cat id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Permissions đúng cho thư mục .ssh

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Vô hiệu hoá phương thức xác thực bằng password

Lưu ý quan trọng: nếu bạn tắt phương thức xác thực bằng password thì bạn sẽ không thể log in bằng passwords nữa. Chỉ có thể login bằng private key tương ứng với public key đã lưu. Nếu bạn không chắc những gì đang làm thì hãy thử trước trên một máy không có dữ liệu tránh trường hợp không đăng nhập được sau này.

Thực hiện những câu lệnh sau để sao lưu và chỉnh sửa file sshd_config

cd /etc/ssh
cp sshd_config sshd_config.orig
nano sshd_config

Chỉnh sửa những dòng tương ứng bên dưới

PermitRootLogin 		yes
PasswordAuthentication	yes
UsePAM					yes

Sau khi chỉnh sửa:

PermitRootLogin			yes
PasswordAuthentication	no
UsePAM					no

Lưu file với tổ hợp phím Ctrl + O và khởi động lại SSH:

/etc/init.d/ssh restart

Sử dụng

Dòng lệnh

Bây giờ bạn có thể SSH hoặc SFTP vào máy chủ bằng private key

ssh user@remote

Nếu bạn không tạo khóa ở vị trí mặc định, bạn sẽ cần chỉ thư mục lưu private key:

ssh -i ~/.ssh/private_key user@remote

Ví dụ, nếu lưu file chứa private key ở thư mục hiện hành câu lệnh sẽ như sau:

ssh -i ./id_rsa [email protected]

Nếu bạn đang sử dụng máy khách Windows SSH, chẳng hạn như PuTTy, hãy xem cấu hình để chỉ đường dẫn đến private key.

TIPS (MẸO)

Lưu khóa public key với một câu lệnh duy nhất

Lưu ý thay public key trong câu lệnh bằng public key của bạn

cd ~ && rm -rf .ssh && mkdir .ssh && echo "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhHZ1wmNopllV7WqAw3aIAyjWYNqowMjPYHqV92VSJOvGNZV352voAPd/jI8giBmH1Z9Dg9/0J4FsgQxR5NnAoB4+Mt9Yhj3EWIxKKxx93i2vzsRS2/CH2OFUTglNpWe8kUX0Ug+rgqKGVH3goADlUoLeoDCwe/9SldVx/IziGpZXkVTpBg1etHx7Vb2ytcO/0Sf43gFpmMaMHKgl9XHncE+42t2QkC3eJdjJd1ckYtW5RuFv8Xq1rUmpMbNqXyZhKxEYczaez5VtzqAG/nOj754yieLPgKsOb9xC1Yi4EfGyuh3Hgj09uG7pci2DzQLGW9v3e/A1rZNb9KPIcAQa0Q== root">>.ssh/authorized_keys && chmod 700 .ssh && cd .ssh && chmod 600 authorized_keys 

Câu lệnh trên sẽ chuyển bạn về thư mục $HOME của user hiện hành và xóa thư mục .ssh ở thư đó. Trường hợp bạn muốn thêm key mà không xóa thư mục .ssh thì câu lệnh sẽ trông như sau:

 echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDr6DyyzMealKsexzJvMJ0oMMAbFpZ3s1mzz/cwbRgduslE1w7RG16yu3wJTdPWsWdo3QhqnhUjIpSFT7HY6j9dw+QAqKfUl0RTlw/z+QuO2b15DtfTzdmCqFXQ14q/Bc6u6jZwC3sibXkO4XokWKhl/SeGb/CnxOMW5JZ2Lo4SAPby5x7eD776uEKLzPaGiH7UlzBo/X7peCLspfxG0FZQKxf/FRAxCjJyyOvh+OiiANjaks+1Xxu5O5LcVLNpoIxw25ZVvw4m5b44G5MgXgpzzxkEBvuRVTLg8LFpwYBfWVNJKa3x58ky8uLiifQi+RCyUfV5TXRp+mOhiPjrv9Yh SSH">>.ssh/authorized_keys && chmod 700 .ssh && cd .ssh && chmod 600 authorized_keys

Với ed25519:

 echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICufl4JBdIlKXthKs8caV7wG7eG02JGO1kvAmcIjOJgc SSH">>.ssh/authorized_keys && chmod 700 .ssh && cd .ssh && chmod 600 authorized_keys

Tắt xác thực bằng password

cd ~ && sudo sed -i "s|#PasswordAuthentication yes|PasswordAuthentication no|g" /etc/ssh/sshd_config && sudo systemctl restart sshd

Tạo lại public key từ private key

Nếu bạn bỏ quên public key đâu đó mà chỉ còn private key bạn có thể tạo lại public key bằng cách sử dụng câu lệnh bên dưới.

Lệnh sau sẽ lấy khóa công khai từ khóa riêng:

ssh-keygen -y -f /đường/dẫn-đến/file_private_key (ví dụ /root/.ssh/id_rsa or ~/.ssh/tên_tuỳ_chỉnh)

Lưu ý rằng bạn không thể tạo private key nếu bạn chỉ có public key.