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.
1. 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 = trueDùng Ctrl+O để lưu lại, Ctrl+X để thoát ra.
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 600
ignoreip = 127.0.0.1/8
Sau đó khởi động lại dịch vụ Fail2ban.
systemctl restart fail2banChú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
2. Cài đặt Google Authenticator PAM module cho SSH server
https://github.com/google/google-authenticator-libpam/
https://mangmaytinh.net/threads/xac-thuc-hai-buoc-cho-ssh-tren-centos-6-su-dung-google-authenticator.153/
Đầu tiên chúng ta sẽ cài module trước.
apt-get install libpam-google-authenticatorSau đó 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.
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 :D
LƯU Ý: 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.
3. Đổ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.
LƯU Ý: 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
4. Tạo SSH key với passphrase để đăng nhập thay cho password
Tạo key RSA 2048-bit:
ssh-keygen -t rsaChưa đủ đô? Thì đây, 4096-bit.
ssh-keygen -t rsa -b 4096Nó sẽ hỏi:
Enter file in which to save the keyKệ 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_keysauthorized_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.
Với Linux và macOS, đọc lại bài này:
https://mrvir.com/ket-noi-ssh-den-may-chu-linux/
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_configSửa 2 dòng này:
PasswordAuthentication noKhởi động lại dịch vụ SSH.
UsePAM no
systemctl restart ssh5. 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 virMấy cái này cơ bản mình không giải thích.
passwd vir
Bây giờ nâng vir thành sudoer.
nano /etc/sudoersThê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_configTì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
6. 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 sshTrê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.
systemctl disable ssh
Tham khảo: MrVir
Nhận xét
Đăng nhận xét