Chuyển đến nội dung chính

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. 

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 = 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 


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-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.


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 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.

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_config
Sửa 2 dòng này:
PasswordAuthentication no
UsePAM no
Khởi động lại dịch vụ SSH.
systemctl restart ssh
5. 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

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 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.

Tham khảo: MrVir

Nhận xét

Bài đăng phổ biến từ blog này

So sánh giấy phép mã nguồn mở Apache, MIT, GPL

Mã nguồn mở ngày nay đã và đang trở nên phổ biến hơn bao giờ hết, những dự án mã nguồn mở có thể được tìm thấy hầu như ở bất kì đâu trên không gian mạng rộng lớn này. Tuy nhiên dù có “mở” đi chăng nữa thì những phần mềm mã nguồn mở phải tuân theo những giấy phép nhất định. Điển hình là 3 loại giấy phép phổ biến nhất là Apache, MIT và GPL. Vậy, giữa chúng có gì khác nhau. Trước hết, giấy phép mã nguồn mở là một loại giấy phép được sử dụng cho các phần mềm mã nguồn mở. Giấy phép này cho phép bất kì cá nhân hay tổ chức nào cũng có thể nghiên cứu, thay đổi, chỉnh sửa và cải tiến phần mềm, và phân phối ở các dạng khác nhau như thay đổi hoặc chưa thay đổi. Giấy phép Apache Giấy phép Apache ra đời bởi Quỹ Phần mềm Apache (Apache Software Foundation - ASF). Đây là một giấy phép phần mềm tự do, không có copyleft, bắt buộc trong việc thông báo bản quyển và lời phủ nhận. Giấy phép này hoạt động như các giấy phép phần mềm mã nguồn mở khác, trao cho người sử dụng phần mềm quyền tự do trong b

Mã hóa đối xứng và bất đối xứng

Hôm nay mình xin được nói về hai thuật toán cơ bản và quan trong nhất trong bảo mật đó là mã hóa đối xứng và mã hóa bất đối xứng . 1. Mã hóa đối xứng (mã hóa không công khai- symmetric-key algorithms ) - Là lớp thuật toán các mã hóa trong đó việc mã hóa và giải mã đều dùng chung cho 1 khóa (secret key) 1.1 Các loại thuật toán khóa đối xứng Thuật toán đối xứng có thể được chia ra làm hai thể loại, mật mã luồng ( stream ciphers ) và mật mã khối ( block ciphers ). Mật mã luồng mã hóa từng bit của thông điệp trong khi mật mã khối gộp một số bit lại và mật mã hóa chúng như một đơn vị. Cỡ khối được dùng thường là các khối 64 bit. Thuật toán tiêu chuẩn mã hóa tân tiến ( Advanced Encryption Standard ), được NIST công nhận tháng 12 năm 2001, sử dụng các khối gồm 128 bit. Các thuật toán đối xứng thường không được sử dụng độc lập. Trong thiết kế của các hệ thống mật mã hiện đại, cả hai thuật toán bất đối xứng ( asymmetric ) (dùng chìa khóa công khai) và thuật toán đối xứng được sử

Chuyện nghề Kiểm thử an toàn thông tin

Từ hồi đi làm đến giờ, tôi gặp nhiều tình huống không biết nên trả lời thế nào cho đúng, hôm nay ghi lại đây để mai mốt ai có gặp tham khảo. Khi được liên hệ, tôi thấy đa phần các đơn vị làm xong rồi mới nghĩ đến chuyện kiểm thử, thậm chí là bị hack rồi mới nghĩ tới. Việc pentest nên được triển khai ngay từ khi Phân tích thiết kế hệ thống . Các luồng đi của dữ liệu khi phác thảo ý tưởng ở trên giấy cũng cần kiểm tra tính an toàn, nếu để đến khi đã ra sản phẩm rồi thì đi sửa lại mất nhiều thời gian, công sức hơn nhiều, thậm trí sửa lại sinh ra lỗi mới. Nhiều người vẫn đánh giá các sản phẩm cầm nắm được giá trị hơn sản phẩm trí tuệ, hay sáng tạo. Giống thằng em tôi làm graphic designer hay "được nhờ" vẽ hộ logo hai cái này cái kia, có khi mất cả ngày hoặc nhiều hơn, trong khi không được đồng nào, có khi còn bị chê :)). Nếu làm tốt việc gì đó, đừng bao giờ làm miễn phí hoặc lấy giá quá rẻ . Nghe đồn Louis Vutton đốt trụi rũi hàng ế, chứ chưa bao giờ chịu giảm giá. Relax với chuy