12 cách tăng cường bảo mật ssh trên linux

  • Saturday 28/09/2024

SSH là gì ?

SSH (Secure Shell) là một giao thức mạng được sử dụng rộng rãi để thiết lập kết nối an toàn giữa hai máy tính, cho phép người dùng điều khiển từ xa một máy tính khác một cách an toàn qua mạng không tin cậy. SSH mã hóa dữ liệu được truyền, giúp bảo vệ thông tin nhạy cảm như mật khẩu, khóa mã hóa, và dữ liệu đầu cuối khỏi việc bị đánh cắp hoặc giả mạo trong quá trình truyền.

 

Tại sao phải bảo mật SSH.

Việc bảo mật SSH là vô cùng quan trọng vì nếu không được thiết lập bảo mật tốt, SSH có thể trở thành một điểm yếu dễ bị khai thác. Các cuộc tấn công phổ biến như tấn công brute-force (thử mật khẩu hàng loạt), tấn công man-in-the-middle (kẻ tấn công chèn vào giữa quá trình trao đổi dữ liệu), hoặc khai thác các lỗ hổng bảo mật đều có thể xảy ra.

Để tránh các nguy cơ này, việc thực hiện các biện pháp bảo mật như sử dụng xác thực khóa công khai, giới hạn truy cập IP, và thay đổi cổng mặc định là rất cần thiết trong quá trình quản trị hệ thống.

bao mat ssh

Cách tăng cường bảo mật SSH

1. Sử dụng SSH phiên bản 2 (SSHv2)

Config để phía ssh server chỉ cho phép những client nào sử dụng protocol ver 2 mới được quyền truy cập. Config trong file /etc/ssh/sshd_config như sau:

Protocol 2

 

2. Sử dụng xác thực bằng khóa công khai (Public Key Authentication)

Bình thường ta sẽ login ssh bằng cách nhập password, nhưng để nâng cao tính bảo mật ssh thì ta nên chuyển qua authen bằng public key. Config như sau trong /etc/ssh/sshd_config để đổi từ password sang public key

HostbasedAuthentication no # ko xác thực theo host based 
RhostsAuthentication no # ko xác thực theo host based

RhostsRSAAuthentication no # ko xác thực theo host based RSA
PasswordAuthentication no # ko sử dụng authen bằng password
ChallengeResponseAuthentication no # ko sử dụng authen bằng password
PermitEmptyPasswords no # ko cho phép truy cập bằng password rỗng (đối với user ko setup pass)
RSAAuthentication no # Không authen RSA(version 1 thôi)
PubkeyAuthentication yes # sử dụng public key để authen

Sau khi thiết lập xong ta chạy command sudo service sshd restart để restart lại sshd
Vậy ta sẽ login vào server qua ssh như thế nào sau khi thiết lập như trên. Ta phải

  • Sinh ra cặp khóa (key pair) để dùng xác thực. Chạy câu lệnh sau ở bất kỳ đâu
ssh-keygen -t rsa -P '' -f <path>/mykey
  • Copy public key của cặp khóa lên ssh server vào file ~/.ssh/authorized_keys (lưu ý file này phải để phân quyền là 600 ), mục đích là add public key đã sinh ra vào key được xác thực trên ssh server.
cat mykey.pub >> ~/.ssh/authorized_keys 
  • Lúc ssh vào ssh server ta sử dụng command sau (sử dụng private key để đăng nhập)
ssh <user>@<ssh_server_ip> -i <key_path>/mykey

 

3. Đổi cổng mặc định của SSH

Thay đổi cổng SSH mặc định từ 22 sang một cổng khác có thể giảm thiểu các cuộc tấn công tự động nhắm vào cổng 22 đồng thời tăng bao mật SSH.

Đổi sshd port trong file /etc/ssh/sshd_config như sau

Port 2222

Lúc này để ssh vào ta phải thiết lập port number từ client ssh <user>@<ssh_server_ip> -p 2222

 

4. Sử dụng tường lửa để giới hạn IP truy cập

Giới hạn các địa chỉ IP cụ thể có quyền truy cập SSH sẽ giảm nguy cơ bị tấn công từ các mạng không xác định.

Sử dụng iptables (firewall của linux) để cấu hình. Ta chỉ cho phép những ip chuẩn chỉ mới được truy cập vào server thông qua ssh.

Ví dụ file cấu hình của iptables (lưu tại /etc/sysconfig/iptables)
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp -s 192.168.1.0/24 –dport 22 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp -s 198.51.100.0/24 –dport 22 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp -s 203.0.113.0/32 –dport 22 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited

  • Giải thích: chỉ những client có ip thuộc các dải mạng 192.168.1.0/24, 198.51.100.0/24, 203.0.113.0/32 sẽ được quyền truy cập vào ssh server, tất cả những ip khác sẽ bị cấm bởi config -A INPUT -j REJECT –reject-with icmp-host-prohibite, trong đó icmp-host-prohibited là những truy cập bị cấm sẽ trả về lỗi type=3:Destination Unreachable hoặc code=10:Host administratively prohibited cho client
  • Cách kiểm tra: xem log ssh service qua command #tail -f /var/log/secure : những truy cập bị cấm sẽ có thông báo refused connect from như dưới đây:
    Apr 29 12:00:04 sshsrv sshd[23071]: refused connect from 172.16.11.10 (172.16.11.10)
    Apr 29 12:02:04 sshsrv sshd[23075]: refused connect from 172.16.11.10 (172.16.11.10)
    Apr 29 12:02:36 sshsrv sshd[23078]: refused connect from 172.16.11.10 (172.16.11.10)

 

5. Vô hiệu hóa các tệp .rhosts (xác minh)

Không đọc các tệp ~/.rhosts và ~/.shosts của người dùng. Cập nhật file /etc/ssh/sshd_config với các cài đặt sau:

IgnoreRhosts yes

SSH có thể mô phỏng hành vi của lệnh rsh đã lỗi thời, vì vậy hãy vô hiệu hóa quyền truy cập không an toàn qua RSH.

 

6. Giới hạn quyền truy cập root (Disable Root Login)

Chắc bạn cũng hiểu là người dùng root có quyền hạn tuyệt đối trên Linux và thật sự rất nguy hiểm nếu chẳng may lộ mật khẩu của người dùng root và bị kẻ tấn công dò được, để bảo mật ssh bạn cần tắt truy cập tài khoản root.

Trước khi vô hiệu hóa đăng nhập người dùng root, hãy đảm bảo rằng người dùng thông thường có thể đăng nhập như root. Ví dụ, cho phép người dùng ktpa đăng nhập như root bằng lệnh sudo.

Cách thêm người dùng ktpa vào nhóm sudo trên Debian/Ubuntu

# sudo adduser ktpa sudo

Mở file /etc/ssh/sshd_config cấu hình ssh để vô hiệu hóa đăng nhập root bạn tìm đến dòng và sửa thành nội dung sau:

PermitRootLogin no

 

7. Sử dụng Fail2Ban để ngăn chặn tấn công brute-force

Fail2Ban theo dõi các lần đăng nhập không thành công và khóa tạm thời IP của kẻ tấn công sau một số lần thử sai.

Bạn có thể tham khảo hướng dẫn cài đặt Fail2ban trên Centos7 tại đây.

 

8. Giới hạn số lượng phiên đăng nhập đồng thời

Giới hạn số lượng phiên SSH đang hoạt động có thể giúp giảm thiểu nguy cơ bị khai thác hệ thống từ một số lượng lớn kết nối bất hợp pháp.

Có 2 cách giới hạn là dùng iptables hashlimit hoặc config sshd thông số MaxStartups

1. Iptables hashlimi

Config như sau:
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -m hashlimit –hashlimit-name ssh –hashlimit-burst
3 –hashlimit 2/m –hashlimit-mode srcip –hashlimit-htable-expire 180000 -j ACCEPT

Giải thích: từ cùng 1 máy client (–hashlimit-mode srcip => chế độ source ip) nếu có tới 3 kết nối đồng thời (–hashlimit-burst 3) sẽ chỉ cho 2 kết nối trên mỗi phút (–hashlimit 2/m), và những kết nối quá 3 phút sẽ bị ngắt (htable-expire 180000)

2. OpenSSH MaxStartups

Config trong file : /etc/ssh/sshd_config

MaxStartups 3 # Chỉ cho phép tối đa 3 liên kết xác thực ssh
LogLevel DEBUG # để log level debug để kiểm tra config có hoạt động hay ko

Check file log của ssh /var/log/secure ta sẽ thấy debug1: drop connection #3 là thể hiện kết nối xác thực tới ssh đã bị chặn

Aug 2 11:16:15 sshsrv sshd[1536]: debug1: Forked child 1544.
Aug 2 11:16:15 sshsrv sshd[1544]: Set /proc/self/oom_score_adj to 0
Aug 2 11:16:15 sshsrv sshd[1544]: debug1: rexec start in 5 out 5 newsock 5 pipe 9 sock 10
Aug 2 11:16:15 sshsrv sshd[1544]: debug1: inetd sockets after dupping: 3, 3
Aug 2 11:16:15 sshsrv sshd[1544]: Connection from 172.16.11.10 port 49784
Aug 2 11:16:18 sshsrv sshd[1536]: debug1: drop connection #3
Aug 2 11:16:18 sshsrv sshd[1536]: debug1: drop connection #3

3. Giới hạn truy cập từ chính ssh server ra ngoài

Hạn chế chính ssh server truy cập lung tung, ví dụ như server của chúng ta bị tấn công kiểu OS command injection ( hacker sẽ thực tiêm những command của hệ thống vào thông qua web service chẳng hạn để thực hiện ssh đến một máy chủ nào đó nhằm mục đích xấu). Ta lại sử dụng iptables để phòng chống. Config cho chain OUTPUT của iptables như sau:

-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A OUTPUT -p tcp -d 192.168.1.200 –dport 22 -j ACCEPT
-A OUTPUT -j DROP

 

9.Vô hiệu hóa mật khẩu trống

Bạn cần phải rõ ràng không cho phép đăng nhập từ xa từ các tài khoản có mật khẩu trống. Cập nhật file /etc/ssh/sshd_config với dòng sau:

PermitEmptyPasswords no

 

10. Cấu hình thời gian hết hạn phiên đăng nhập (Idle Timeout Interval)

Cấu hình SSH để tự động ngắt kết nối sau một khoảng thời gian không hoạt động giúp bảo vệ hệ thống khỏi các phiên đăng nhập không giám sát.

Mở file sshd_config và đảm bảo cấu hình các giá trị sau:

ClientAliveInterval 300
ClientAliveCountMax 0

Thiết lập khoảng thời gian chờ khi không hoạt động tính bằng giây (300 giây = 5 phút). Sau khi khoảng thời gian này trôi qua, người dùng không hoạt động sẽ tự động bị ngắt kết nối.

 

11. Cập nhật và vá các lỗ hổng bảo mật thường xuyên

Việc giữ cho phần mềm SSH và hệ thống luôn được cập nhật giúp tránh các lỗ hổng bảo mật có thể bị khai thác.

12. Giám sát và ghi lại các hoạt động SSH (Logging)

Kích hoạt tính năng ghi log chi tiết các hoạt động SSH sẽ giúp phát hiện và phân tích các hoạt động đáng ngờ, từ đó phản ứng kịp thời trước các mối đe dọa.

Bạn mở file: /etc/ssh/sshd_config

Tìm đến dòng LogLevel hoặc thêm nếu chưa có:

LogLevel VERBOSE

Lưu ý: Bạn có thể sử dụng các mức độ ghi log khác như INFO, ERROR, hoặc DEBUG, nhưng VERBOSE là lựa chọn tốt để ghi đầy đủ thông tin liên quan đến các hoạt động SSH.

Khởi động lại dịch vụ SSH để cấu hình được thực hiện.

Kiểm tra:
Trên hệ thống Ubuntu/Debian, log của SSH thường được ghi vào file /var/log/auth.log.
Trên hệ thống CentOS/RHEL, log của SSH được ghi vào file /var/log/secure.

_______________________________________________________________________________________________________

P.A Việt Nam cung cấp đa dạng các cấu hình Máy Chủ Ảo và Máy Chủ Riêng
Cloud Server
Cloud Server Pro
Máy Chủ Riêng

Tham khảo các ưu đãi: https://www.pavietnam.vn/vn/tin-khuyen-mai/

Rate this post