CÁC BIỆN PHÁP BẢO MẬT OPENSSH TRÊN SERVER LINUX

SSH (Secure Shell) là một giao thức kết nối bảo mật, cho phép điều khiển từ xa giữa Client và Server. Dữ liệu truyền tải giữa Client/Server qua giao thức SSH được mã hóa đảm bảo an toàn, hỗ trợ xác minh tính toàn vẹn dữ liệu và xác thực Client.

OpenSSH là một bộ chương trình mã nguồn mở được sử dụng để mã hoá (Encrypt) các phiên kết nối và dữ liệu truyền tải giữa các Host với nhau bằng cách sử dụng giao thức Secure Shell (SSH).

  • OpenSSH Client: Chương trình cho phép thực hiện thiết lập kết nối SSH Remote từ một Host (vai trò Client) tới các Host khác (vai trò Server) có cài đặt và cấu hình OpenSSH Server.
  • OpenSSH Server: Chương trình cho phép tiếp nhận và xác thực các kết nối SSH Remote từ các Host Client khác.
  • được biết đến hay các Host Server lần đầu truy cập.
  • Secure Copy Program (SCP): Chương trình cho phép Copy File từ xa giữa các Host thông qua giao thức SSH, yêu cầu xác thực giữa Client và Server.
  • Secure File Transfer Program (SFTP): Chương trình cho phép truyền tải dữ liệu FTP một cách an toàn.

 

OpenSSH Client sử dụng thuộc tính “StrictHostKeyChecking” để xử lý kết nối tới các Host Server mới, chưa có thông tin.

  • StrictHostKeyChecking no: Tự động kết nối tới bất kỳ máy chủ SSH nào mà không phụ thuộc vào tình trạng của nó, tùy chọn này không an toàn và không được khuyến cáo.
  • StrictHostKeyChecking ask: Hiển thị Host Key mới và yêu cầu Admin xác nhận (yes/no) để tiếp tục, nếu kết nối thay đổi Host Key thì chương trình sẽ ngăn chặn việc SSH cho tới khi Admin xóa Host Key cũ trong File known_hosts (ssh-keygen -R <ip_address>) và xác nhận (yes) cho kết nối Host Key mới.
  • StrictHostKeyChecking yes: Ngăn chặn mọi kết nối tới bất kỳ Host máy chủ nào mà không có thông tin trong File known_hosts trên Host Client.

 

OpenSSH Server hỗ trợ các cấu hình tăng cường bảo mật cho truy cập Remote như xác thực bằng Password hay Public Key, giới hạn số lần đăng nhập sai, giới hạn thời gian duy trì phiên kết nối, ... Sau đây là một số biện pháp giúp tăng cường bảo mật OpenSSH trên các Server Linux.

 

1. SỬ DỤNG SSH KEY THAY CHO SSH PASSWORD

Phương thức xác thực bằng SSH Password nếu không có giới hạn số lần đăng nhập sai thì sẽ dễ dàng bị tấn công dò tìm Password bằng các phương thức Bruteforce, dò từ điển (Dictionary), dự đoán Password, ... Do đó, để tăng cường bảo mật cần chuyển sang hình thức xác thực bằng SSH Key.

Host Client tạo ra các Key xác thực bao gồm Public Key "id_rsa.pub" và Private Key "id_rsa", SSH Key có thể tăng độ khó bằng cách tăng kích thước thuật toán RSA và dùng PassPhrase.

Cú pháp tham khảo: ssh-keygen -t rsa -b 4096

Mặc định các SSH Key sẽ lưu trong đường dẫn '.ssh/' ở thư mục Home của User. Trên Host Server, Copy nội dung Public Key SSH vào đường dẫn '/root/.ssh/authorized_keys' hoặc đường dẫn tương tự của một User khác Root để cho phép SSH thông qua Privated Key của Host Client.

Để cấu hình chặn SSH Password và chỉ cho phép SSH bằng Key, thực hiện chỉnh sửa File "/etc/ssh/sshd_config".

Sau đó Restart Service SSH với lệnh "sudo systemctl restart sshd".

 

2. NGĂN CHẶN SSH REMOTE BẰNG TÀI KHOẢN ROOT

Root là quyền hạn cao nhất trên Server Linux, nếu Hacker thực hiện các phương thức dò tìm Password thành công hoặc thông qua máy Client bị chiếm để SSH Key lên Server thì sẽ chiếm được quyền hạn cao nhất trên Server. Do đó, cần phải tăng cường bảo mật bằng cách không cho phép các Host Client SSH lên Server bằng tài khoản đặc quyền Root.

Restart Service SSH với lệnh "sudo systemctl restart sshd".

 

3. LỌC DANH SÁCH NHỮNG TÀI KHOẢN ĐƯỢC PHÉP SSH TRÊN SERVER

Trên Server nếu có nhiều tài khoản thì có thể cấu hình cho phép các Host Client được phép SSH cụ thể bằng tài khoản nào. Ngoài ra, chặn toàn bộ Host Client SSH bằng User Root nhưng cũng có thể thiết lập ngoại lệ những địa chỉ IP nào được phép SSH Server bằng tài khoản Root.

Restart Service SSH với lệnh "sudo systemctl restart sshd".

 

4. NGĂN CHẶN SSH REMOTE BẰNG TÀI KHOẢN KHÔNG PASSWORD

Trên Server, các quản trị viên có thể tạo ra các tài khoản không có Password cho mục đích nào đó và quên xóa, những tài khoản này nếu không kiểm soát thì có thể được dùng để Bypass SSH.

Restart Service SSH với lệnh "sudo systemctl restart sshd".

 

5. GIỚI HẠN SỐ LẦN ĐĂNG NHẬP SAI VÀ PHIÊN REMOTE

Giới hạn số lần đăng nhập sai giúp phần nào ngăn chặn các hình thức tấn công Bruteforce, Dictionary. Ngoài ra, cũng cần giới hạn số lượng phiên SSH cần thiết cùng lúc trên Server và thiết lập thời gian tự động thoát phiên (Session Timeout) nếu cần thiết.

Restart Service SSH với lệnh "sudo systemctl restart sshd".

 

6. THAY ĐỔI PORT SSH VÀ IP SERVER LISTEN SSH

Mặc định Port SSH là 22 (Known Port), để tăng cường bảo mật cần thay đổi Port mặc định thành một Port khác (Unknown Port).

Ngoài ra, mặc định SSH cũng Listen trên mọi IP Interface của Server (0.0.0.0). Server nên có tối thiểu 2 Interface (2 IP Address), một Interface sẽ cung cấp dịch vụ chính và Interface còn lại dùng trong Management, cần cấu hình SSH Server chỉ Listen trên IP của Interface Management.

Thay đổi Port SSH và IP Server Listen SSH là một trong những biện pháp hiệu quả giúp ngăn chặn tấn công Bruteforce.

Restart Service SSH với lệnh "sudo systemctl restart sshd".

 

7. KIỂM SOÁT KẾT NỐI SSH BẰNG FIREWALL

Kiểm soát các kết nối SSH có thể thực hiện trên thiết bị Firewall trong hạ tầng mạng và Firewall trên chính Server. Trên Server Linux có thể sử dụng IPTable hoặc OpenSource Firewall CSF.

Cài đặt Firewall CSF:

wget http://download.configserver.com/csf.tgz
tar -xzf csf.tgz
cd csf
sh install.sh
perl /usr/local/csf/bin/csftest.pl

Cấu hình File "/etc/csf/csf.conf" để Filter các Port TCP/UDP cần thiết.

Mặc định Deny các lớp mạng (Deny Any Any), sau đó mới Allow cụ thể những địa chỉ IP hoặc lớp mạng tin cậy.

Tham khảo:

csf -d 10.0.0.0/8 "Deny Local Class A"
csf -d 172.16.0.0/12 "Deny Local Class B"
csf -d 192.168.0.0/16 "Deny Local Class C"

csf -a 192.168.1.10 "admin-01"
csf -a 192.168.1.11 "admin-02"
csf -a 192.168.1.12 "admin-03"

Cấu hình trực tiếp File "/etc/csf/csf.allow" để Allow các Client IP và Port

tcp|in|d=22|s=192.168.1.10 #admin-01
tcp|in|d=22|s=192.168.1.11 #admin-02
tcp|in|d=22|s=192.168.1.12 #admin-03

tcp|in|d=8080|s=192.168.2.10 #dev-01
tcp|in|d=8080|s=192.168.2.11 #dev-02

 

8. KIỂM TRA TÌNH TRẠNG BRUTEFORCE ATTACK

Một số lệnh kham thảo để kiểm tra Log Server có đang bị Bruteforce Attack hay không.

Trên Redhat/Centos: /var/log/secure

# Successful SSH Login Attempts
cat secure | grep 'Accepted' | awk '{print $1 " " $2 " " $3 " User: " $9 " " }'
cat secure* | sort | grep 'Accepted' | awk '{print $1 " " $2 " " $3 " User: " $9 " IP:" $11 }'

# Successful SSH Login Attempts From Sudo Users
cat /var/log/secure | grep 'session opened for user root' | awk '{print $1 " " $2 " " $3 " Sudo User: " $13 " " }'

# SSH Login Attempts From Non-Existing & Unauthorized User Accounts
cat /var/log/secure | grep 'Invalid user'
cat /var/log/secure | grep 'user NOT in sudoers'

# SSH Login Attempts By Authorized SSH Accounts With Failed Password
cat /var/log/secure | grep -v invalid | grep 'Failed password'

 

Trên Debian/Ubuntu: /var/log/auth

grep sshd.\*Failed /var/log/auth.log | less
# Aug 18 11:00:57 izxvps sshd[5657]: Failed password for root from 95.58.255.62 port 38980 ssh2
# Aug 18 23:08:26 izxvps sshd[5768]: Failed password for root from 91.205.189.15 port 38156 ssh2
# Aug 18 23:08:30 izxvps sshd[5770]: Failed password for nobody from 91.205.189.15 port 38556 ssh2
# Aug 18 23:08:34 izxvps sshd[5772]: Failed password for invalid user asterisk from 91.205.189.15 port 38864 ssh2
# Aug 18 23:08:38 izxvps sshd[5774]: Failed password for invalid user sjobeck from 91.205.189.15 port 39157 ssh2
# Aug 18 23:08:42 izxvps sshd[5776]: Failed password for root from 91.205.189.15 port 39467 ssh2

grep sshd.*Did /var/log/auth.log | less
# Aug  5 22:19:10 izxvps sshd[7748]: Did not receive identification string from 70.91.222.121
# Aug 10 19:39:49 izxvps sshd[1919]: Did not receive identification string from 50.57.168.154
# Aug 13 23:08:04 izxvps sshd[3562]: Did not receive identification string from 87.216.241.19
# Aug 17 15:49:07 izxvps sshd[5350]: Did not receive identification string from 211.22.67.238
# Aug 19 06:28:43 izxvps sshd[5838]: Did not receive identification string from 59.151.37.10

 

Một số công cụ ngăn chặn Bruteforce SSH tham khảo:

SSHGuard:
- On Ubuntu/Debian: sudo apt-get install sshguard
- On CentOS/RHEL: rpm -ivh http://flexbox.sourceforge.net/centos/5/i386/sshguard-1.5-2.el5.i386.rpm

Fail2ban:
- On Ubuntu/Debian: sudo apt-get install fail2ban
- On CentOS/RHEL: yum install fail2ban

Denyhosts:
- On Ubuntu/Debian: sudo apt-get install denyhosts
- On CentOS/RHEL: yum install denyhosts

 

9. KIỂM TRA TÌNH TRẠNG LOGIN BẰNG TOOL AUDIT REPORT

Debian Install: sudo apt install auditd
Redhat Install: yum install audit

# sudo aureport
Summary Report
======================
Range of time in logs: 01/01/1970 07:00:00.000 - 04/20/2021 15:36:16.305
Selected time for report: 01/01/1970 07:00:00 - 04/20/2021 15:36:16.305
Number of changes in configuration: 3
Number of changes to accounts, groups, or roles: 0
Number of logins: 0
Number of failed logins: 0
Number of authentications: 0
Number of failed authentications: 0
Number of users: 2
Number of terminals: 3
Number of host names: 1
Number of executables: 3
Number of commands: 1
Number of files: 0
Number of AVC's: 0
Number of MAC events: 0
Number of failed syscalls: 0
Number of anomaly events: 0
Number of responses to anomaly events: 0
Number of crypto events: 0
Number of integrity events: 0
Number of virt events: 0
Number of keys: 0
Number of process IDs: 5
Number of events: 29

Có thể dùng thêm lệnh "who" và "lastlog" để xem thông tin chi tiết.

 

10. ĐẶT MẬT KHẨU SSH MẠNH, MẬT KHẨU RANDOM

Trong một số trường hợp cần giữ lại hình thức xác thực kết nối SSH bằng Password thì cần phải thiết lập mật khẩu mạnh, khuyến nghị sử dụng mật khẩu Random trên 20 ký tự.

Tạo mật khẩu Random có thể sử dụng nhiều công cụ khác nhau, từ các công cụ Online cho tới các công cụ Password Manager hoặc đơn giản hơn là tạo bằng Command Line trên chính Sever Linux.

Một số lệnh tạo Password Radom trên Server Linux:

openssl rand -base64 32 (một trong những lệnh thường được sử dụng vì đơn giản)

date +%s | sha256sum | base64 | head -c 32 ; echo

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;

tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1

strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 30 | tr -d '\n'; echo

< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c6

dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev

</dev/urandom tr -dc '12345!@#$%qwertQWERTasdfgASDFGzxcvbZXCVB' | head -c8; echo ""

randpw(){ < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-16};echo;}

date | md5sum

 

11. CẤU HÌNH THIẾT LẬP SSH BANNER WARNING

Cấu hình này chủ yếu nhằm mục đích nhắc nhở, răn đe các User phải chú ý nâng cao cảnh giác và nghiêm túc chấp hành các quy định đảm bảo bảo mật trong quá trình thực hiện Remote Server làm việc.

Restart Service SSH với lệnh "sudo systemctl restart sshd".

 

12. CẬP NHẬT CHƯƠNG TRÌNH OPENSSH

Định kỳ kiểm tra cập nhật bộ chương trình OpenSSH lên bản mới nhất để tránh bị khai thác các lỗ hổng bảo mật ở phiên bản cũ hơn.

Đối với các Host Client không có nhu cầu cho phép các Host khác Remote SSH vào thì không nên cài đặt OpenSSH Server hoặc nếu đã cài thì phải tắt Service khi không cần thiết.

Có thể tìm kiếm trên Google theo cú pháp "OpenSSH Vulnerability" để kiểm tra tình trạng các lỗ hổng bảo mật mới nhất và đang ảnh hưởng ở phiên bản OpenSSH nào. Qua đó, so sánh phiên bản trên Server hiện tại và cập nhật lên phiên bản mới hơn đã Fix lổ hỗng bảo mật đó.