Tăng cường bảo mật cho SSH server

Tổng quan mình sẽ đưa ra một số phương pháp để tăng cường độ bảo mật cho SSH server, sau đó mình sẽ đi sâu vào hướng dẫn những phương pháp phổ biến mà hữu ích nhất.

  • Sử dụng Fail2ban để bảo vệ cổng SSH không bị tấn công brute force.
  • Cài đặt Google Authenticator PAM module cho SSH server để tạo lớp bảo vệ thứ 2.
  • Tắt đăng nhập với quyền root và giới hạn các user được quyền SSH.
  • Thay đổi cổng đăng nhập SSH.
  • Sử dụng SSH private key với passphrase mạnh thay thế cho password truyền thống.
  • Tắt bà nó SSH đi, khỏi xài nữa :)) . Bình tĩnh nào, mình sẽ giải thích khi đến phần này.

Cài đặt Fail2ban để bảo vệ cổng SSH

Fail2ban có sẵn trên repository gốc của Ubuntu.

sudo apt-get install fail2ban

Chúng ta sẽ tạo một file config mới cho Fail2ban.

nano /etc/fail2ban/jail.local

Thêm đoạn này vào file config.

 [ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 600
ignoreip = 127.0.0.1/8 

Dùng Ctrl+O để lưu lại, Ctrl+X để thoát ra.
Sau đó khởi động lại dịch vụ Fail2ban.

systemctl restart fail2ban

Chúng ta có thể kiểm tra trạng thái các jail đang hoạt động của Fail2ban bằng lệnh fail2ban-client status.

Để kiểm tra các IP bị ban bởi jail SSH, ta dùng lệnh fail2ban-client status ssh.

Bật service của Fail2ban khởi động cùng hệ thống:

systemctl enable fail2ban

Cài đặt Google Authenticator PAM module cho SSH server

Đầu tiên chúng ta sẽ cài module trước.

apt-get install libpam-google-authenticator

Sau đó hãy đăng nhập với user mà bạn sẽ muốn tạo secret key. Rồi chạy lệnh google-authenticator

Do you want authentication tokens to be time-based (y/n)

Trả lời y.

Các bước còn lại sẽ giống như vầy, bạn có thể chọn theo ý bạn.

Cài đặt Google Authenticator lên thiết bị của bạn theo hướng dẫn tại đây.

https://support.google.com/accounts/answer/1066447?hl=en

Sau đó mở Google Authenticator lên, cách dễ nhất là chọn quét mã QR, bạn quét mã QR sinh ra ở bước phía trên là xong. Cách thứ hai là nhập khóa được cung cấp, bạn nhập tên tài khoản là gì cũng được (không quan trọng), sau đó bạn nhập secret key tạo ở bước trên vào ô khóa được cung cấp là xong.

Mở file /etc/pam.d/sshd và thêm dòng này vào.

auth required pam_google_authenticator.so

Mở file /etc/ssh/sshd_config và bật ChallengeResponseAuthentication.

ChallengeResponseAuthentication yes

Khởi động lại dịch vụ SSH.

systemctl restart ssh

Lần đăng nhập kế tiếp, bạn sẽ phải nhập verification code trước khi đăng nhập SSH.

Như vầy là thành công

Theo nguyên lý làm việc này thì bạn sẽ gặp rắc rối nếu thời gian trên máy bạn hoặc server không đúng.

Đổi port SSH

Phần này rất đơn giản. Bạn mở file config của SSH.

nano /etc/ssh/sshd_config

Tìm dòng Port, uncomment nó đi (nếu còn dấu #), rồi sửa thành port bạn muốn rồi lưu lại

CẨN THẬN

Hãy chắc chắn rằng bạn không bật firewall, nếu bạn có bật firewall, bạn phải thêm port SSH mới vào danh sách được cho phép. Ví dụ ở đây mình vừa chuyển sang port 47896.
Để thêm port này vào ufw ta dùng lệnh.

ufw allow 47896/tcp

Đối với CentOS 6 (và các distro khác) dùng iptables.

iptables -A INPUT -p tcp --dport 47896 -j ACCEPT

Đối với CentOS 7 dùng firewalld

firewall-cmd --permanent --add-port=47896/tcp

firewall-cmd --reload

Khởi động lại dịch vụ SSH.

systemctl restart ssh

Tạo SSH key với passphrase để đăng nhập thay cho password

Tạo key RSA 2048-bit

ssh-keygen -t rsa

Chưa đủ đô? Thì đây, 4096-bit.

ssh-keygen -t rsa -b 4096

Nó sẽ hỏi:

Enter file in which to save the key

Kệ cha nó đi, bấm enter bỏ qua.
Nó lại hỏi tiếp:

Enter passphrase (empty for no passphrase):

Bạn có thể nhập passphrase ở đây để tăng độ bảo mật cho khóa, không làm cũng không sao, tốt hơn là nên làm.

Lệnh này sẽ tạo ra một cặp khóa RSA công khai & bí mật, bạn có thể đọc thêm tại đây: https://goo.gl/t1yF92

Bạn đổi tên file id_rsa.pub thành authorized_keys.

mv /root/.ssh/id_rsa.pub authorized_keys

authorized_keys là khóa công khai, id_rsa là khóa bí mật. Dùng cat /root/.ssh/id_rsa đọc toàn bộ nội dung khóa bí mật rồi copy lưu cẩn thận trong máy. Hoặc kết nối SFTP vào server rồi tải id_rsa về. Sau đó thử đăng nhập bằng SSH key.

Với PuTTY trên Windows, bạn thêm SSH key vào mục Auth, Private key file for authentication.

browse_keys

Nếu gặp trục trặc khi kết nối bằng SSH key, bạn có thể chmod 400 id_rsa hoặc chmod 600 id_rsa.

Nếu đăng nhập thành công thì nó sẽ vào thẳng server mà không cần password (có thể cần nhập passphrase nếu bạn có tạo).

Sau khi đã đăng nhập thành công thì tắt chức năng đăng nhập bằng password đi.

nano /etc/ssh/sshd_config

Sửa 2 dòng này:

PasswordAuthentication no

UsePAM no

Khởi động lại dịch vụ SSH.

systemctl restart ssh

Tắt đăng nhập quyền root và giới hạn các user được phép SSH

Khoan, bạn phải tạo một sudoer mới trước khi tắt đăng nhập bằng root. Tắt xong thì lấy quyền éo gì mà vào nữa :))

useradd vir

passwd vir

Mấy cái này cơ bản mình không giải thích.
Bây giờ nâng vir thành sudoer.

nano /etc/sudoers

Thêm vào vir ALL=(ALL:ALL) ALL rồi lưu lại.
Thử đăng nhập với user vir rồi sudo -s thử xem được chưa, nếu thành công sang bước tiếp theo.

nano /etc/ssh/sshd_config

Tìm đến dòng #PermitRootLogin yes, uncomment nó đi sửa lại thành PermitRootLogin no.

Thêm dòng AllowUsers vir để cho phép chỉ mình vir được SSH, có thể thêm nhiều user cách nhau bởi khoảng cách.

Khởi động lại dịch vụ SSH.

systemctl restart ssh

Tắt SSH service

Cái gì? Mày bày trò cho tao làm nãy giờ xong kêu tao tắt?

OK. Tại sao mình lại kêu tắt SSH?
Nếu bạn sử dụng các dịch vụ cloud VPS, cloud server mà nhà cung cấp có hỗ trợ một VNC console trên nền web, thì bạn có một cách thứ 2 để tương tác với server thay vì SSH trực tiếp.

Nếu production của bạn đã xong giai đoạn deploy và đi vào hoạt động ổn định thì bạn cũng không cần phải SSH nhiều, chủ yếu để vào cập nhật các bản vá, kiểm tra tình trạng hệ thống nhẹ nhàng.

Bạn có thể tắt hẳn SSH và chỉ dùng VNC trên web của nhà cung cấp để quản lý server. Khi nào cần SSH thì chỉ cần vào VNC để bật lại. Bạn nên gia cố thêm bảo mật hai lớp vào tài khoản quản trị trên web cho chắc ăn.

systemctl stop ssh

systemctl disable ssh

Trên đây chỉ là một trong rất nhiều cách để tăng cường bảo mật cho server. Hi vọng bài viết này giúp ích được bạn.

Thuê Cloud Hosting SSD giá rẻ, Hosing linux giá rẻ