Như đã biết, mặc định SSH dùng mật khẩu để xác thực người dùng trong một phiên kết nối giữa client và server. Tuy nhiên khả năng bảo mật không cao tiểm ẩn nhiều rủi rõ, đặc biệt khi làm việc với hệ thống LAMP Stack hay LEMP Stack.
Bài này mình sẽ hướng dẫn thêm một cách nữa để gia tăng bảo mật cho kết nối SSH, bằng cách tạo Khoá chung – Public key và Khoá riêng – Private key hay còn gọi ngắn gọn là SSH Key.
Tham khảo trước: Cấu hình SSH Server cơ bản
1. Tìm hiểu SSH Keys Authentication
1.1 Các thành phần của SSH Key
SSH Key hoạt động dạng Server – Client, kết nối được tạo bởi quá trình bắt tay giữa SSH Server và SSH Client.
- SSH Server: là máy chủ của chúng ta, với máy chủ chạy hệ điều hành Linux thì yêu cầu phải cài openssh-server. Còn máy chủ chạy hệ điều hành Windows thường thì chúng ta dùng Remote desktop tuy nhiên bạn nào thích ssh vẫn có thể cài ứng dụng của bên thứ 3 để thay thế openssh-server làm máy chủ SSH trên môi trường win. Cài ssh trên win thế nào các bạn tìm hiểu thêm mình nói ở đậy lạc đề mất.
- SSH Client: là máy muốn truy cập vào SSH Server thường là những máy tính chạy windows. Trên những máy này bạn phải cài một ứng dụng có khả năng tạo kết nối SSH, trên linux có openssh-client còn windows có Putty.
Như hình bên trên các bạn nhận thấy SSH Key gồm 3 thành phần.
- Private Key: có dạng file chứa chuỗi mã hóa được lưu trên Client, bạn cần bảo mật file này cẩn thận nó còn dùng để lấy lại Public Key.
- Public Key: cũng là dạng file chứa chuỗi mã hóa được lưu trên Server.
- Passphrase: là mật khẩu dùng để nhận diện Public Key và Private Key khi tạo SSH connection, cũng được dùng để lấy lại Public Key.
1.2 Cách làm việc của SSH Key
Quá trình hình thành kết nối SSH sử dụng Key sẽ trải qua nhiều lớp xác thực khác nhau.
Đầu tiên, khi SSH Client khởi tạo kết nối bạn phải nhập vào Passphrase để kiểm tra xem Private Key & Public Key có phải là một cặp hay không.
Tiếp theo chúng sẽ được so sánh với nhau theo thuật toán riêng xem có khớp hay không. Nếu ok người dùng phải nhập đúng tài khoản được cấp trên SSH Server tương ứng với cặp khóa này. Khi đó kết nối mới được khởi tạo để bắt đầu phiên làm việc.
2. Tạo Private Key và Public Key
Trong bài mình sẽ tạo cặp khóa SSH trên Client. Chúng ta có thể tạo cặp khóa này trên cả Windows và Linux bằng cách sử dụng những phần mềm khác nhau.
- Windows: ta dùng công cụ puttygen để tạo khóa, download tại đây
- Linux: dùng ssh-keygen tạo khóa, công cụ này có sẵn rồi bạn chỉ sử dụng thôi.
2.1 Puttygen – Tạo SSH Key trên Windows.
Chạy puttygen bạn sẽ thấy giao diện như hình bên dưới.
Chọn thuật toán mã hóa, mình thường chọn SSH-2 RSA,
tiếp theo chọn độ dài chuỗi mã hóa mình chọn 2048
dài quá cũng giảm tốc độ truyền dữ liệu.
Sau đó dùng chuột rê quanh vùng trắng ở phía dưới đây là ma trận tạo khóa, sau đó ấn Generate để khởi tạo.
Và click chọn như hình bên dưới.
Passpharase
(1): bạn đặt mật khẩu tùy thích miễn không quên là được.Save public key
(2): lưu Public Key ra file, bạn muốn ssh đến server nào thì vứt nó vào server đó.Save private key
(3): lưu Private Key ra file có đuôi mở rộng là .ppk
2.2 SSH-Keygen – Tạo SSH Key trên Linux
Giớ đến hướng dẫn tạo khóa trên Linux, mình thực hiện trên Ubuntu và CentOS các distro khác bạn nghiên cứu nhé.
Trên cửa sổ terminal gõ lệnh ssh-keygen -t rsa -b 2048
trong đó:
-t rsa
: chỉ định thuật toán mã hóa là RSA-b 2048
: độ dài chuỗi mã hóa là 2048 bit
Nó sẽ hỏi bạn tạo passphrase, nhập vào passphrase muốn dùng. Quá trình tạo SSH Key trên Linux hoàn tất ta sẽ được hai file.
id_rsa
: đây là file Private Keyid_rsa.pub
: đây là file Public Key
Mặc định mỗi user trên Linux có một Home Directory (profile) có đường dẫn /home/user. Khi đăng nhập bằng user nào để tạo SSH Key thì cặp khóa sinh ra sẽ nằm trong thư mục /home/user/.ssh
Dấu chấm đằng trước chỉ định .ssh là thư mục ẩn.
Nếu muốn dùng Private Key (id_rsa) trên Windows bạn tham khảo thêm cách Convert Private Key sang ppk.
3. Cách sử dụng Public Key.
Như đã nói ở trên Privete Key thì giữ lại ở Client (máy trạm), còn Public Key phải được đẩy lên Server (máy chủ).
Vấn đề bây giờ là vứt Public Key vào đâu trên server ?
Theo mô hình ở trên, mặc định Public Key có tên và đường dẫn là /home/thuyserver/.ssh/authorized_keys
trên server.
Khi chuyển Public Key lên server bạn phải đổi tên nó thành authorized_keys không muốn đổi tên thì copy nội dung file rồi paste vào file authorized_keys có sẵn là được.
Nếu ở gần máy chủ thì việc thêm Public Key chỉ cần một cái USB là xong, nhưng khi đặt máy chủ ở Datacenter ra vào mất nhiều thời gian, hoặc thuê VPS, Dedicated Server mãi tận USA thì chỉ còn cách remote từ xa thôi.
Vậy làm sao đây ?
3.1 Copy Public Key từ Windows Client vào Server
Trên Windows thì rất đơn giản, bạn dùng WinSCP tạo kết nối SFTP sau đó copy Public Key vào server rồi đổi tên file thành authorized_keys là xong.
3.2 Copy Public Key từ Linux Client vào Server
SSH Client là linux thì hơi khó phải dùng lệnh hoàn toàn.
Đầu tiên mình cần tạo thư mục chứa Public Key trên Server.
[thuyclient@srv4 ~]$ ssh thuyserver@192.168.0.100 mkdir -p .ssh
Trên đây mình gộp 2 lệnh lại cho gọn, trong đó:
ssh thuyserver@192.168.0.100
: là tạo kết nối ssh đến server có IP là 192.168.0.100 với tài khoản thuyserver.mkdir -p .ssh
: dùng-p
ép tạo thư mục .ssh trên Server nếu chưa có.
Bước tiếp theo mình sẽ tạo authorized_keys cho server bằng chuỗi lệnh:
[thuyclient@srv4 ~]$ cat .ssh/id_rsa.pub | ssh thuyserver@192.168.0.100 'cat >> .ssh/authorized_keys'
Ý nghĩa:
cat .ssh/id_rsa.pub
(1): xuất nội dung id_rsa.pub (Public Key) trên Client ra màn hình.ssh thuyserver@192.168.0.100
: sau đó kết nối đến Server có IP 192.168.0.100 với user thuyserver.'cat >> .ssh/authorized_keys'
: lệnh này lấy kết quả của (1) là nội dung file id_rsa.pub ghi đè vào file authorized_keys tồn tại trước đó trên Server.
Tiếp sau sẽ dùng chmod phân quyền 700
cho folder .ssh
& 640
cho file authorized_keys
[thuyclient@srv4 ~]$ ssh thuyserver@192.168.0.118 'chmod 700 .ssh; chmod 640 .ssh/authorized_keys' Enter passphrase for key '/home/thuyclient/.ssh/id_rsa':
Đến đây kể như hoàn tất Client đã có Private Key, trên Server đã có Public Key nhưng kết nối vẫn xác thực theo Password Authentication.
Thức ra chỗ này mình muốn các bạn làm quen với lệnh linux, chứ bạn hoàn toàn có thể dùng các công cụ copy file/folder đơn giản hơn như SCP và RSYNC.
Kế tiếp chúng ta cần phải cấu hình server để vô hiệu hóa xác thực bằng mật khẩu và cho phép xác thực bằng SSH Key.
4. Cấu hình SSH Key trên Server
Các bạn tìm đến file /etc/ssh/sshd_config
hiệu chỉnh thông số như sau.
ChallengeResponseAuthentication no PasswordAuthentication no UsePAM no[alert-note]
Chắc chắn bạn đã truy cập SSH bằng khóa thành công trước khi disable PasswordAuthentication nếu không bạn sẽ không thể truy cập được server nữa.
[/alert-note]Thay đổi thông số xong, trên Windows bạn sử dụng PuTTy để thử đăng nhập bằng SSH Key xem sao.
Chọn Auth để chuyển sang phần cài đặt sử dụng Key, sau đó Browse… chọn Private Key, nhấn Open tạo kết nối.
Nếu kết nối thành công thì bạn mới khởi động lại dịch vụ ssh nhé.
Còn test SSH Key trên Linux Client thì đơn giản hơn chỉ cần đăng nhập bằng user thuyclient rồi gõ lệnh.
ssh thuyserver@192.168.0.100
SSH sẽ tự biết lấy private key trong /home/thuyclient/.ssh/id_rsa
trên Client để so sánh tạo kết nối với Server.
5. Tổng kết
Đến đây bạn đã cấu hình SSH Keys Authentication trên Linux xong.
Đây là cách bảo mật rất hiệu quả, bài tới mình sẽ hướng dẫn sử dụng SFTP truyền dữ liệu và một số cấu hình giúp gia tăng bảo mật cho SSH.
Chúc bạn thành công !
Hi anh
Hiện tại, em đang gặp phải vấn đề về xác thực ssh key,nhờ anh tư vấn dùm
Hình như apache mặc định home directory của nó là var/www, em đang băn khoăn là ví dụ mình cấp quyền user và group apache cho 1 thư mục x , thì x khi xác thực ssh key thì mình phải bỏ thư mục .ssh ở var/www ạ ?
Vì hiẹn tại, Ngoài cấp quyền cho apache xử lý ra, nếu cấp quyền cho các user khác thì e cứ gặp permision denied khi xử lý code
Apache cài mặc định không có Home Directory.
Thư mục /var/www thường là DocumentRoot của Webserver Apache, người ta còn gọi là thư mục chứa source code của website.
Nếu Apache có Home Directory là /var/www thì .ssh phải đặt trong thư mục này, trường hợp này có thể làm được nhưng mình chưa thấy ai làm như vậy cả.
Dear Admin,
Nếu mình muốn thay đổi nơi chứa Public key trên client, thì SSH biết lấy key ở đâu?
Mong giải đáp giúp.
Thanks!
Bạn muốn đổi thư mục chứa key hay muốn ssh từ một client khác
Muốn thay đổi thư mục chứa key trên server bạn mở file cấu hình ssh /etc/sshd_config tìm đến
AuthorizedKeysFile
sửa lại đường dẫn theo ý bạn.Thank! Admin
Vâng đúng rồi Anh Thủy, mình làm hoài không được , anh Thủy hướng dẫn giúp mình.Thank
Chính xác là như vậy, anh Thùy hướng dẫn mình đưa public key vào Filezila server. Thank
Nếu như vậy bạn đã hiểu sai về SFTP rồi.
1. FileZilla chỉ có thể làm FTP Server hoặc FTP Client, đôi khi người ta còn dùng FileZilla làm Client để kết nối đến SFTP Server nhưng không làm SFTP Server được.
2. SFTP là một giao thức độc lập và sử dụng SSH mã hóa dữ liệu, nó không liên quan gì đến FTP cả.
3. Muốn dùng SFTP bạn phải cài SSH trên Linux, không biết dùng Linux bạn phải cài tool giả lập SSH trên Windows như CopSHH chẳng hạn.
Bạn tham khảo bài viết Tìm hiểu FTP để phân biệt FTP và SFTP.
Lệnh chown là thay đổi quyền sở hữu, bạn không nhất thiết phải chown, cách làm bạn xem lại comment bên trên của mình.
Lệnh của bạn có nghĩa tài khoản apache thuộc group user có quyền 775 trên toàn bộ folder và file trong /home/web, có vẻ không liên quan mấy đến việc tạo ssh key.
Em có làm theo hướng dẫn của anh và tạo ssh key cho root rồi.
Em tạo thêm users mới ở /home/user
Nhưng em cấp quyền cho user mới tại thư mục khác (chown -R apache:user /home/web và chown 775)
Giờ em muốn user mới truy cập qua ssh key vào thư mục (/home/web) .
Em có copy cái ~./.ssh của root vào thư mục của user /home/user nhưng khi truy cập putty qua user mới đó thì không được. (Do tắt chức năng đăng nhập bằng mật khẩu rồi)
Anh Thủy hướng dẫn e vs. 🙂
Bạn muốn khi đăng nhập ssh bằng tài khoản user thì tự động chuyển vào /home/web để làm được bạn phải thay đôi lại home directory của tài khoản user, hoặc tạo mới tài khoản user với home directory là /home/web, lệnh
useradd user -d /home/web
.Sau đó tạo folder ẩn .ssh trong /home/web rồi chạy lệnh tạo SSH Key như bình thường, chú ý key tao ra phải nằm trong /home/web/.ssh
Thay đổi lại home directory của tài khoản user thành /home/web là
chown -R apache:user /home/web và chown 775 đúng không ạ
Bạn ơi cho mình hỏi , Trên Windows thì rất đơn giản bạn dùng công cụ WinSCP tạo kết nối SFTP tiếp đó copy Public Key vào server (ở đây mình xài Filezila làm server, vậy public key bỏ vào đâu), bạn cho mình ý kiến,rồi đổi tên file thành authorized_keys là xong.
FileZilla cũng có thể tạo được kết nối SFTP như WinSCP.
Bạn open FileZilla lên trong phần khai báo thông số connect bạn nhập như sau:
Host: sftp://thuysys.com (hoặc IP Addess của bạn)
Username: là tài khoản của bạn.
Password: mật khẩu của bạn.
Port: 22 bạn chạy SSH với port nào thì nhập vào port đó.
Khi tạo kết nối SFTP xong bạn copy file Public key vào Server đổi tên là xong.
Bạn hiểu sai ý của mình,mình nói rõ hơn để bạn hiểu giúp mình khắc phục(Mình sử dụng cấu hình Filezila server để truyền file qua mạng internet bằng giao thức FTP, mình sử dụng winscp để kết nối vào Filezila server, nay mình muốn chuyển sang giao thức SFTP, mình đã mỡ port 22 rồi, , và cũng đã tạo SSH trên winscp,private mình đưa vào winscp theo như hướng dẫn, nhưng ko biết đưa public key vào Filezila server ),bạn hướng dẫn mình đưa public key vào máy chủ “tức là máy cài Filezila server.Thank
Mình hiểu như này bạn xem đúng không nhé.
1. Bạn cài Filezilla làm Server. Rồi bạn dùng WinSCP kết nối được vào Server. Nhưng sau đó bạn muốn dùng SFTP nên bạn mở port 22 trên Server.
2. Bạn đã tạo Public key & Private Key thành công bằng công cụ Puttygen như nội dung bài hướng dẫn của mình.
3. Bạn đưa Private Key vào WinSCP và không biết đưa Public Key vào Filezilla Server.