Đă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 key
và private 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 key
vàprivate 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 key
và private key
. Khóa public key
và private 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ó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 ~/.ssh
là id_rsa.pub
và id_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
.