OpenSSH (hoặc Secure Shell) đã trở thành một tiêu chuẩn cho truy cập từ xa thay thế các giao thức telnet đã cũ. SSH thực hiện các giao thức như telnet, nhưng thực tế là các kết nối được mã hóa và mật khẩu không còn gửi ở dạng văn bản đơn giản.

Tuy nhiên, ssh không phải là hoàn hảo, và khi một cổng SSH được mở thì đó cũng là nguy cơ để các hacker xâm nhập. Mình đã có các bài viết hướng dẫn bảo mật SSH như đổi cổng SSH mặc định, ngăn chặn tấn công Brute force.... tuy nhiên những cách trên chỉ giảm được phần nào thôi. Bài viết này sẽ tổng hợp thêm một số cách bảo vệ OpenSSH của bạn.

1. Sử dụng một mật khẩu mạnh

Một nguyên tắc chung khi sử dụng tất cả các tài khoản trên Internet là bạn phải có một mật khẩu đủ mạnh để tránh khỏi sự dò tìm của các công cụ auto. Nếu bạn đã từng làm việc với các máy chủ, chắc bạn sẽ nhận thấy nếu bạn có một cổng SSH đang mở và dùng mật khẩu để đăng nhập vào SSH, sẽ có nhiều cuộc tấn công kiểu Brute force, các tin tặc đoán tên người dùng/mật khẩu để đăng nhập vào SSH. Thông thường một hacker sẽ quét cổng 22 (cổng mặc định của SSH) để tìm các máy chủ có SSH đang chạy trên cổng này, sau đó cố gắng đoán tên người dùng/mật khẩu để đăng nhập. Nếu mật khẩu của bạn quá đơn giản, có thể các hacker sẽ dò ra được.

Mật khẩu mạnh là một mật khẩu có đầy đủ các yếu tố sau:

  • Có ít nhất 8 ký tự
  • Kết hợp chữ hoa và chữ thường
  • Kết hợp cả số và chữ cái
  • Sử dụng các ký tự đặc biệt (Ví dụ: ~ ! @ # £ $ % ^ " ....)

Mật khẩu mạnh không phải là đặc hiệu với SSH, nhưng nó có phần ảnh hưởng đến sự an toàn của hệ thống. Thông tin thêm về mật khẩu có thể được tìm thấy trong các tài liệu CentOS:

http://www.centos.org/docs/4/html/rhel-sg-en-4/s1-wstation-pass.html

Nếu bạn cung cấp cho khách hàng của bạn quyền truy cập vào SSH thì hãy tạo ra các mật khẩu ngẫu nhiên hoặc gây khó khăn để đoán được tên của user (VD ko đặt tên là admin...) Nếu những kẻ xấu không thể đoán được tên người dùng thì chúng không thể tấn công Brute force. Tuy nhiên, đây vẫn là biện pháp không hiệu quả và có thể rò rỉ thông tin về tên người dùng từ những thứ như email được gửi từ tài khoản người dùng....

2. Vô hiệu hóa Root Login

Cài đặt máy chủ SSH được lưu trữ trong /etc/ssh/sshd_config. Để vô hiệu hóa đăng nhập vào tài khoản Root, hãy mở file trên, tìm và sửa lại như sau:

# Prevent root logins:
PermitRootLogin no

Sau đó khởi động lại dịch vụ sshd:

service sshd restart

Nếu bạn cần chạy các lệnh dưới quyền Root thì cứ đăng nhập như một người dùng bình thường và sử dụng lệnh su.

Lưu ý: Trước khi làm điều này, bạn cần chắc chắn rằng đã có một tài khoản người dùng khác để có thể đăng nhập vào SSH hoặc có phương pháp đăng nhập thay thế.

3. Giới hạn tài khoản đăng nhập

Đăng nhập SSH có thể được giới hạn cho một số người dùng. Nếu bạn có nhiều tài khoản người dùng trên hệ thống bạn có thể hạn chế truy cập từ xa để chỉ những người thực sự cần nó mới truy cập vào. Do đó hạn chế được sự mất an toàn của người dùng có mật khẩu yếu.

Thêm vào file /etc/ssh/sshd_config dòng AllowUsers, sau đó là danh sách username, cách nhau bởi 1 khoảng trống. Ví dụ:

AllowUsers alice bob

Sau đó khởi động lại dịch vụ sshd.

4. Vô hiệu hóa  Protocol 1

SSH có hai giao thức có thể sử dụng, protocol 1 and protocol 2. Protocol 1 là giao thức cũ, kém an toàn và cần được vô hiệu hóa, trừ khi bạn biết rõ và cần yêu cầu nó. Hãy tìm những dòng sau trong /etc/ssh/sshd_config file, bỏ ghi chú nó và sửa đổi như sau:

# Protocol 2,1
Protocol 2

và khởi động lại dịch vụ sshd.

5. Sử dụng một cổng "không chuẩn"

Theo mặc định, ssh lắng nghe các kết nối đến trên cổng 22. Đối với một hacker, để xác định ssh đang chạy trên máy tính của bạn, anh ta sẽ có nhiều khả năng quét cổng 22 để xác định điều này. Một phương pháp hiệu quả là chạy ssh trên một cổng "không chuẩn". Bạn có thể sử dụng bất kỳ cổng nào không được sử dụng bởi các chương trình khác. Nhiều người chọn 2222 làm cổng thay thế vì nó dễ nhớ, giống như 8080 thường được gọi là cổng thay thế cho HTTP.

Vì lý do an ninh, đây có thể không phải là lựa chọn tốt nhất, hacker quét cổng 22 và sẽ có khả năng cũng được quét cổng 2222. Tốt nhất nên chọn một số cổng ngẫu nhiên mà không được sử dụng cho bất kỳ dịch vụ nào phổ biến. Về mục này, mình đã hướng dẫn trong một bài trước đây. Để thực hiện các thay đổi, thêm một dòng như thế này vào tập tin /etc/ssh/sshd_config.

# Run ssh on a non-standard port:
Port 2345 #Change me

và khởi động lại dịch vụ sshd. Đừng quên thay đổi các thiết lập cần thiết để chuyển tiếp cổng trong router của bạn và thay đổi các quy tắc tường lửa, nếu không chính bạn cũng không thể truy cập được.

Trên CentOS 6 trở lên, bạn cũng nên cập nhật selinux, ghi nhãn cổng lựa chọn một cách chính xác, nếu không sshd sẽ bị ngăn truy cập nó. Ví dụ:

$ semanage port -a -t ssh_port_t -p tcp 2345 #Change me

Bởi vì ssh không còn nghe các kết nối đến trên cổng mặc định, bạn sẽ cần cho khách hàng của bạn biết cổng để kết nối vào SSH. Sử dụng ssh client từ dòng lệnh, chúng ta có thể chỉ định cổng bằng cách sử dụng chuyển đổi -p:

$ ssh -p 2345 myserver

Nếu bạn nghĩ rằng điều này gây phiền toái vì phải chỉ định cổng mỗi khi cần kết nối, bạn chỉ cần định sẵn nó ở tập tin ~/.ssh/config:

# Client ~/.ssh/config
Host myserver
HostName 72.232.194.162
User bob
Port 2345

Và cấp quyền cho tập tin ~/.ssh/config

chmod 600 ~/.ssh/config

6. Lọc SSH qua tường lửa

Nếu bạn chỉ cần truy cập từ xa từ một địa chỉ IP (nếu bạn dùng IP tĩnh), bạn hãy lọc các kết nối với tường lửa của bạn bằng cách thêm một quy tắc tường lửa trên router của bạn hoặc trong iptables để hạn chế truy cập vào cổng 22, chỉ cho phép những IP cụ thể. Ví dụ, trong iptables này có thể thực hiện các quy tắc sau đây:

iptables -A INPUT -p tcp -s 72.232.194.162 --dport 22 -j ACCEPT

Nếu bạn không thể giới hạn địa chỉ IP nguồn, và phải mở cổng ssh trên toàn cầu thì iptables vẫn có thể giúp ngăn chặn các cuộc tấn công brute-force bằng cách ghi lại (logs) và ngăn chặn những nỗ lực lặp đi lặp lại để đăng nhập từ các địa chỉ IP. Ví dụ:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name ssh --rsource
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent ! --rcheck --seconds 60 --hitcount 4 --name ssh --rsource -j ACCEPT

Quy tắc đầu tiên ghi lại địa chỉ IP của mỗi nỗ lực mới để truy cập vào cổng 22 bằng cách sử dụng module recent. Nguyên tắc thứ hai sẽ kiểm tra xem địa chỉ IP đã cố gắng để kết nối 4 hoặc nhiều lần trong vòng 60 giây cuối cùng, nếu ít hơn 4 lần cố gắng đăng nhập thất bại thì các gói tin được chấp nhận.

Đừng quên thay đổi cổng cho phù hợp nếu bạn đang chạy ssh trên một cổng "không chuẩn". Nếu có thể, thì lọc ở tường lửa là một phương pháp cực kỳ hiệu quả của việc đảm bảo quyền truy cập vào một máy chủ SSH.

7. Sử dụng Public/Private Keys trong việc xác thực đăng nhập

Sử dụng Key được mã hóa để xác thực có 2 lợi ích chính. Thứ nhất là thuận tiện khi bạn không còn cần phải nhập mật khẩu mỗi khi đăng nhập (trừ khi bạn mã hóa các Key của bạn với mật khẩu bảo vệ  [xem *]) khi sử dụng Public/Private Key. Thứ hai, cặp Public/Private Key xác thực một lần đã được thiết lập trên máy chủ, bạn có thể vô hiệu hóa xác thực mật khẩu hoàn toàn. Điều đó có nghĩa là nếu không file xác thực này thì bạn không thể truy cập vào SSH được. Vì vậy không ai có thể tấn công vào SSH bằng cách đoán mật khẩu được.

Thật đơn giản để tạo ra một cặp Public/Private Key và cài đặt chúng để sử dụng trên máy chủ SSH của bạn.

Đầu tiên, tạo một cặp Public/Private Key trên máy khách mà bạn sẽ sử dụng để kết nối đến máy chủ (bạn sẽ cần phải làm điều này với mỗi máy khách mà từ đó bạn kết nối tới máy chủ). Đây là với máy khách sử dụng Linux, riêng máy chủ sử dụng Windows, mình sẽ hướng dẫn ở bài sau.

$ ssh-keygen -t rsa

Securing OpenSSH - Bảo vệ OpenSSH

Lệnh này sẽ tạo ra hai tập tin trong thư mục ẩn ~/.ssh là: id_rsaid_rsa.pub đầu tiên: id_rsa là khóa riêng của bạn và người kia: id_rsa.pub là chìa khóa công cộng của bạn. id_rsa là private key và id_rsa.pub là public key.

Các lưu ý khi thực thi lệnh này: Khi nhấn Enter từ lệnh trên, nó hỏi dòng đầu tiên, mọi người nhấn Enter bỏ qua. Đến dòng thứ 2 và thứ 3, nó hỏi có cần mật khẩu xác nhận mỗi khi đăng nhập hay không? [*] Nếu muốn an toàn thì bạn nên nhập vào, tức là dùng key xác thực đăng nhập rồi nhưng nó hỏi lại mật khẩu một lần nữa. Mật khẩu này là để mã hóa file id_rsa được tạo ra. Cái này tùy thuộc vào bạn, nếu không muốn đặt mật khẩu thì nhấn Enter để bỏ qua.

Bây giờ set chmod cho private key:

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_rsa

Copy file public key (id_rsa.pub) đến máy chủ, sau đó chép nó vào authorized_keys:

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

Lưu ý: sau khi bạn đã nhập public key, bạn có thể xóa file id_rsa.pub khỏi máy chủ.

và cuối cùng là thiết lập quyền truy cập tập tin trên máy chủ:

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

Yêu cầu là chế độ StrictModes trong file /etc/ssh/sshd_config phải được đặt là Yes (Cái này mặc định rồi, nếu ai lỡ đổi sang No thì đổi lại).

Đảm bảo SELinux được thiết lập đúng:

$ restorecon -Rv ~/.ssh

Bây giờ, khi bạn đăng nhập vào máy chủ SSH, bạn sẽ không còn bị yêu cầu nhập mật khẩu (trừ khi bạn thiết lập một cụm từ mật khẩu khi bạn tạo cặp khóa ở trên [*]). Theo mặc định, lần đầu tiên ssh sẽ cố gắng để xác thực bằng cách sử dụng Key. Nếu không có Key được tìm thấy, xác thực không thành công, thì sau đó ssh sẽ trở lại xác thực mật khẩu thông thường.

Bài viết được dịch từ Wiki Centos về bảo mật SSH trong Linux.

(Khi trích dẫn thông tin từ website này cần ghi rõ © nphunghung.com 2012 - 2014)

VN:F [1.9.22_1171]
Rating: 0.0/10 (0 votes cast)

Là một người đam mê tìm tòi khám phá trong công nghệ và sẵn sàng chia sẻ những gì mà mình biết.

One Comment

  1. Cách thêm SSH public key vào Centos | Nguyễn Phùng Hưng Blog - Chia sẻ đam mê Says Reply

    [...] - Bảo vệ OpenSSH Cách ngăn chặn tấn công brute force qua SSH Securing OpenSSH - Bảo vệ OpenSSH Cách ngăn chặn tấn công brute force qua SSH Cách bảo vệ máy tính khi truy [...]

Leave a Reply


× 8 = thirty two