SSH là một trong những giao thức được sử dụng rộng rãi nhất để quản trị hệ thống trên nền tảng Linux. Giao thức này khả dụng cho nhiều hệ điều hành dựa trên Unix, Linux và MacOS. Giao thức này dựa trên mô hình máy khách-máy chủ, trong đó một máy chạy thành phần máy chủ và máy kia sử dụng công cụ máy khách để truy cập thành phần đó.
Theo cách này, máy khách được đảm bảo rằng nó đang kết nối với đúng máy chủ SSH. Khi điều này được thực hiện, máy khách có thể truy cập vào máy chủ. Nếu bạn đang sử dụng máy khách Windows, bạn sẽ phải sử dụng các công cụ như putty để kết nối với máy chủ. Cả máy khách và máy chủ đều có thể được cài đặt trên cùng một hệ thống, điều này có nghĩa là bạn có thể sử dụng công cụ máy khách để truy cập vào các máy khác hoặc hệ thống của bạn có thể là chính máy chủ mà những người khác có thể truy cập. Trong trường hợp như vậy, tệp cấu hình được đặt trong cùng một thư mục nhưng với tên hơi khác. Vị trí thư mục là ‘/etc/ssh’ và tên cho tệp cấu hình máy khách ssh là ‘ssh_config’ và tên của tệp cấu hình máy chủ là ‘sshd_config’:
Trong trường hợp bạn có cả hai tệp trên hệ thống của mình, bạn nên khôn ngoan chọn tệp nào bạn cần cấu hình. Trong hầu hết các trường hợp, chúng ta cần cấu hình máy chủ để bảo mật vì nó mở ra cánh cửa cho khả năng truy cập vào hệ thống.
Đầu tiên, chúng ta bắt đầu bằng cách kiểm tra trạng thái của SSH daemon hoặc sshd trên máy chủ của mình. Theo cách này, chúng ta có thể xem nó có đang chạy và được bật để tự động khởi động khi khởi động hay không. Lệnh bên dưới sẽ kiểm tra trạng thái sshd:
$ systemctl status ssh.service
Hoặc sử dụng lệnh bên dưới:
$ systemctl status sshd.service
Từ ảnh chụp màn hình, chúng ta có thể thấy dịch vụ đang hoạt động và được bật. Dịch vụ đã chạy trong 6 giờ qua. Khi bạn mở rộng chế độ xem thiết bị đầu cuối bằng cách nhấn mũi tên phải, bạn sẽ thấy rằng dịch vụ đang lắng nghe trên cổng mặc định 22.
Đôi khi chúng ta thực hiện các thay đổi đối với tệp cấu hình SSH của hệ thống từ xa trong khi chúng ta đang kết nối với nó bằng chính SSH. Trong trường hợp như vậy, chúng ta nên sử dụng lệnh reload thay vì lệnh restart. Theo cách này, chúng ta ít có khả năng bị ngắt kết nối hơn.
$ sudo cp /etc/ssh/sshd_config ~/sshd_config.bkp
Sau khi thực hiện sao lưu, chúng ta có thể yên tâm rằng nếu chúng ta làm hỏng tệp chính và làm hỏng SSH, chúng ta có thể sử dụng tệp sao lưu để trở lại trạng thái bình thường.
$ sudo nano /etc/ssh/sshd_config
Bỏ chú thích dòng ‘#Port 22’ và đổi ‘22’ thành một số cổng khác, không được sử dụng trên hệ thống của bạn. Chúng ta phải đổi thành '222' và khởi động lại dịch vụ. Bây giờ hãy sử dụng lệnh ssh với tùy chọn 'p' để chỉ định cổng mới:
$ ssh user@system_ip -p 222
$ sudo nano /etc/ssh/sshd_config
và đặt tham số ‘PermitRootLogin’ thành ‘no’. Điều này sẽ đảm bảo rằng máy chủ sẽ được bảo vệ khỏi các cuộc tấn công ngẫu nhiên nhắm vào tài khoản root. Tùy chọn mặc định là ‘prohibit-password’ cho phép đăng nhập dựa trên xác thực khóa công khai nhưng từ chối đăng nhập dựa trên mật khẩu.
$ cat /etc/ssh/sshd_config | grep 'Protocol'
Trong trường hợp đầu ra của bạn trống, OpenSSH có thể đang sử dụng phiên bản 2 vì đây là trường hợp của chúng tôi. Một cách khác là sử dụng tiện ích lệnh netcat:
$ nc localhost 22
Đầu ra mẫu:
SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.4
Từ đầu ra, chúng ta có thể thấy SSH2 đang hoạt động trên hệ thống của mình.
Để kiểm tra phiên bản giao thức nào mà máy chủ từ xa đang chạy, hãy thử kết nối với máy chủ đó bằng ứng dụng khách ssh có tùy chọn -Q (truy vấn):
$ ssh -Q protocol-version user@server_name
Hình ảnh trên cho thấy SSH phiên bản 2 khi truy cập máy chủ ssh Ubuntu từ Kali Linux.
Từ hình ảnh trên, chúng ta có thể thấy rằng khi đặt giá trị ‘MaxAuthTries’ thành 3, chúng ta bị từ chối SSH sau ba lần nhập sai mật khẩu. Một khía cạnh bảo mật quan trọng khác là sử dụng xác thực khóa công khai để đăng nhập. Các mô hình xác thực dựa trên khóa ít bị tấn công bằng cách dùng vũ lực. Tương tự như vậy, chúng ta có thể sử dụng mô-đun xác thực PAM để tăng cường bảo mật cho máy chủ SSH hơn nữa.
SSH hoạt động như thế nào?
Máy khách (ssh) khởi tạo kết nối bằng cách gửi yêu cầu đến máy chủ. Máy chủ lắng nghe các yêu cầu đến bằng cách sử dụng daemon máy chủ (sshd). Nó sử dụng khóa công khai của mình để xác thực với máy khách đang cố kết nối với nó:Theo cách này, máy khách được đảm bảo rằng nó đang kết nối với đúng máy chủ SSH. Khi điều này được thực hiện, máy khách có thể truy cập vào máy chủ. Nếu bạn đang sử dụng máy khách Windows, bạn sẽ phải sử dụng các công cụ như putty để kết nối với máy chủ. Cả máy khách và máy chủ đều có thể được cài đặt trên cùng một hệ thống, điều này có nghĩa là bạn có thể sử dụng công cụ máy khách để truy cập vào các máy khác hoặc hệ thống của bạn có thể là chính máy chủ mà những người khác có thể truy cập. Trong trường hợp như vậy, tệp cấu hình được đặt trong cùng một thư mục nhưng với tên hơi khác. Vị trí thư mục là ‘/etc/ssh’ và tên cho tệp cấu hình máy khách ssh là ‘ssh_config’ và tên của tệp cấu hình máy chủ là ‘sshd_config’:
Trong trường hợp bạn có cả hai tệp trên hệ thống của mình, bạn nên khôn ngoan chọn tệp nào bạn cần cấu hình. Trong hầu hết các trường hợp, chúng ta cần cấu hình máy chủ để bảo mật vì nó mở ra cánh cửa cho khả năng truy cập vào hệ thống.
Đầu tiên, chúng ta bắt đầu bằng cách kiểm tra trạng thái của SSH daemon hoặc sshd trên máy chủ của mình. Theo cách này, chúng ta có thể xem nó có đang chạy và được bật để tự động khởi động khi khởi động hay không. Lệnh bên dưới sẽ kiểm tra trạng thái sshd:
$ systemctl status ssh.service
Hoặc sử dụng lệnh bên dưới:
$ systemctl status sshd.service
Từ ảnh chụp màn hình, chúng ta có thể thấy dịch vụ đang hoạt động và được bật. Dịch vụ đã chạy trong 6 giờ qua. Khi bạn mở rộng chế độ xem thiết bị đầu cuối bằng cách nhấn mũi tên phải, bạn sẽ thấy rằng dịch vụ đang lắng nghe trên cổng mặc định 22.
Đôi khi chúng ta thực hiện các thay đổi đối với tệp cấu hình SSH của hệ thống từ xa trong khi chúng ta đang kết nối với nó bằng chính SSH. Trong trường hợp như vậy, chúng ta nên sử dụng lệnh reload thay vì lệnh restart. Theo cách này, chúng ta ít có khả năng bị ngắt kết nối hơn.
Cấu hình SSH bằng các phương pháp hay nhất
Tôi nghĩ rằng bây giờ đã đến lúc bắt đầu cấu hình cấu hình máy chủ SSH. Trước khi bắt tay vào thực hiện tệp cấu hình SSH, chúng ta nên sao lưu tệp với các thiết lập mặc định:$ sudo cp /etc/ssh/sshd_config ~/sshd_config.bkp
Sau khi thực hiện sao lưu, chúng ta có thể yên tâm rằng nếu chúng ta làm hỏng tệp chính và làm hỏng SSH, chúng ta có thể sử dụng tệp sao lưu để trở lại trạng thái bình thường.
1. Thay đổi Cổng Mặc định
Theo mặc định, daemon sshd lắng nghe trên cổng 22 của máy chủ. Nên thay đổi giá trị này thành một số khác theo cách giảm phạm vi tấn công tự động bằng tập lệnh. Cách tiếp cận này được gọi là bảo mật thông qua sự mơ hồ. Để thực hiện, hãy mở tệp bên dưới và tìm dòng có chứa văn bản ‘#Port 22’.$ sudo nano /etc/ssh/sshd_config
Bỏ chú thích dòng ‘#Port 22’ và đổi ‘22’ thành một số cổng khác, không được sử dụng trên hệ thống của bạn. Chúng ta phải đổi thành '222' và khởi động lại dịch vụ. Bây giờ hãy sử dụng lệnh ssh với tùy chọn 'p' để chỉ định cổng mới:
$ ssh user@system_ip -p 222
2. Vô hiệu hóa đăng nhập với tư cách là người dùng Root
Root là người dùng cuối cùng trên bất kỳ hệ thống Linux nào có quyền truy cập vào mọi tài nguyên trên hệ thống của bạn. Trong trường hợp bạn không yêu cầu quyền truy cập root nghiêm ngặt, bạn nên vô hiệu hóa tiện ích đăng nhập root trên máy chủ của mình. Để thực hiện việc này, hãy mở cùng tệp ở trên:$ sudo nano /etc/ssh/sshd_config
và đặt tham số ‘PermitRootLogin’ thành ‘no’. Điều này sẽ đảm bảo rằng máy chủ sẽ được bảo vệ khỏi các cuộc tấn công ngẫu nhiên nhắm vào tài khoản root. Tùy chọn mặc định là ‘prohibit-password’ cho phép đăng nhập dựa trên xác thực khóa công khai nhưng từ chối đăng nhập dựa trên mật khẩu.
3. Thiết lập Phiên bản Giao thức
Phiên bản giao thức cũ hơn của SSH là 1 và kém an toàn hơn so với SSH2 và chúng có các triển khai mạng khác nhau và cũng không tương thích với nhau. Để kiểm tra phiên bản giao thức nào đang hoạt động trên máy chủ của bạn, hãy mở lại tệp sshd_config và tìm dòng 'Protocol':$ cat /etc/ssh/sshd_config | grep 'Protocol'
Trong trường hợp đầu ra của bạn trống, OpenSSH có thể đang sử dụng phiên bản 2 vì đây là trường hợp của chúng tôi. Một cách khác là sử dụng tiện ích lệnh netcat:
$ nc localhost 22
Đầu ra mẫu:
SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.4
Từ đầu ra, chúng ta có thể thấy SSH2 đang hoạt động trên hệ thống của mình.
Để kiểm tra phiên bản giao thức nào mà máy chủ từ xa đang chạy, hãy thử kết nối với máy chủ đó bằng ứng dụng khách ssh có tùy chọn -Q (truy vấn):
$ ssh -Q protocol-version user@server_name
Hình ảnh trên cho thấy SSH phiên bản 2 khi truy cập máy chủ ssh Ubuntu từ Kali Linux.
4. Độ phức tạp của mật khẩu
Mật khẩu yếu luôn dễ bị khai thác, do đó, mật khẩu trống có nhiều khả năng bị khai thác hơn. Do đó, tùy chọn PermitEmptyPasswords nên được đặt thành 'no' trong tệp sshd_config. Tương tự như vậy, số lần đăng nhập bằng mật khẩu sai nên được giới hạn để giảm khả năng bị tấn công bằng cách dùng vũ lực. Điều này có thể đạt được bằng cách đặt tùy chọn ‘MaxAuthTries’ thành một giá trị nhỏ hơn như 3.Từ hình ảnh trên, chúng ta có thể thấy rằng khi đặt giá trị ‘MaxAuthTries’ thành 3, chúng ta bị từ chối SSH sau ba lần nhập sai mật khẩu. Một khía cạnh bảo mật quan trọng khác là sử dụng xác thực khóa công khai để đăng nhập. Các mô hình xác thực dựa trên khóa ít bị tấn công bằng cách dùng vũ lực. Tương tự như vậy, chúng ta có thể sử dụng mô-đun xác thực PAM để tăng cường bảo mật cho máy chủ SSH hơn nữa.