Cấu hình bảo mật cho SSH bằng Fail2ban trên Ubuntu 22.04
Giới thiệu
SSH là phương pháp kết nối trên thực tế với máy chủ đám mây. Nó bền và có thể mở rộng, khi các tiêu chuẩn mã hóa mới được phát triển, chúng có thể được sử dụng để tạo các SSH key mới, đảm bảo rằng giao thức cốt lõi vẫn an toàn. Tuy nhiên, không có giao thức hoặc phần mềm stack nào an toàn tuyệt đối, và SSH được triển khai rộng rãi trên internet có nghĩa là nó đại diện cho một sự tấn công bề mặt (attack surface) hoặc tấn công vector (attack vector), mà thông qua đó mọi người có thể truy cập.
Bất kỳ dịch vụ nào tiếp xúc với mạng Internet đều là mục tiêu tiềm năng của việc này. Nếu bạn xem lại nhật ký SSH service của mình chạy trên bất kỳ máy chủ nào, bạn sẽ thấy các nỗ lực đăng nhập có hệ thống, lặp đi lặp lại thể hiện các cuộc tấn công bạo lực của người dùng và bot là như nhau. Mặc dù bạn có thể thực hiện một số tối ưu hóa cho SSH service để giảm khả năng thành công của các cuộc tấn công này xuống gần 0, chẳng hạn như vô hiệu hóa xác thực mật khẩu có lợi cho các SSH key, chúng vẫn có thể đặt ra một trách nhiệm nhỏ.
>> Có thể bạn quan tâm: Các kỹ thuật hữu ích khi sử dụng SSH
Việc triển khai sản xuất quy mô lớn mà trách nhiệm này không được chấp nhận, thường sẽ thực hiện VPN như WireGuard trước SSH service của họ, do đó không thể kết nối trực tiếp với cổng SSH 22 mặc định từ internet bên ngoài mà không có phần mềm bổ sung hoặc các gateway. Các giải pháp VPN này được mọi người tin cậy, nhưng sẽ phức tạp và có thể phá vỡ một số quá trình tự động hóa hoặc các software hook nhỏ khác.
Trước hay ngoài việc cam kết thiết lập VPN đầy đủ, bạn có thể triển khai một công cụ có tên là Fail2ban. Fail2ban có thể giảm thiểu đáng kể các cuộc tấn công brute force bằng cách tạo các quy tắc tự động thay đổi cấu hình tường lửa của bạn, để cấm các IP cụ thể sau một số lần đăng nhập không thành công. Điều này sẽ cho phép máy chủ của bạn tự bảo vệ trước những nỗ lực truy cập này mà không cần sự can thiệp của bạn.
Trong hướng dẫn này, bạn sẽ thấy cách cài đặt và sử dụng Fail2ban trên máy chủ Ubuntu 22.04.
Điều kiện
Để thực hiện theo hướng dẫn này, bạn sẽ cần có:
Một máy chủ Ubuntu 22.04 và non-root user có đặc quyền sudo. Ngoài ra, máy chủ thứ hai mà bạn có thể kết nối với máy chủ đầu tiên của mình để sử dụng kiểm tra việc bị cấm.
Bước 1 Cài đặt Fail2ban
Fail2ban có sẵn trong kho phần mềm của Ubuntu. Bắt đầu bằng cách chạy các lệnh dưới đây với tư cách non-root user để cập nhật danh sách gói của bạn và cài đặt Fail2ban:
Fail2ban sẽ tự động thiết lập một background service sau khi được cài đặt. Tuy nhiên, nó bị tắt theo mặc định, vì một số cài đặt mặc định của nó có thể gây ra các hiệu ứng không mong muốn. Bạn có thể xác minh điều này bằng cách sử dụng lệnh systemctl:
Bạn có thể bật Fail2ban ngay lập tức, nhưng trước tiên, bạn hãy xem xét một số tính năng của nó.
Bước 2: Cấu hình Fail2ban
Fail2ban service giữ các tệp cấu hình của nó trong thư mục / etc / fail2ban
. Có một tệp với các giá trị mặc định được gọi là jail.conf
. Hãy đi tới thư mục đó và in 20 dòng đầu tiên của tệp đó bằng head -20
:
Như bạn thấy, một số dòng đầu tiên của tệp này được commented out (ghi chú) - chúng bắt đầu bằng ký tự #
cho biết rằng chúng sẽ được đọc dưới dạng tài liệu thay vì dưới dạng cài đặt. Và bạn có thể thấy, những ghi chú này hướng dẫn bạn không được trực tiếp sửa đổi tệp. Thay vào đó, bạn có hai lựa chọn: tạo hồ sơ riêng lẻ cho Fail2ban trong nhiều tệp ở thư mục jail.d /
, hoặc tạo và thu thập tất cả cài đặt cục bộ của bạn trong tệp jail.local
. Tệp jail.conf
sẽ được cập nhật định kỳ khi Fail2ban được cập nhật và sẽ được sử dụng làm nguồn cài đặt mặc định mà bạn chưa tạo bất kỳ overrides (ghi đè) nào.
Trong hướng dẫn này, bạn sẽ tạo jail.local
. Bạn có thể làm điều đó bằng cách sao chép jail.conf
:
Bây giờ bạn có thể bắt đầu thực hiện các thay đổi cấu hình. Mở tệp bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn:
Trong khi bạn đang chuyển qua tệp, hướng dẫn này sẽ xem xét một số tùy chọn mà bạn có thể muốn cập nhật. Các cài đặt nằm trong phần [DEFAULT] gần đầu tệp sẽ được áp dụng cho tất cả các dịch vụ được Fail2ban hỗ trợ. Ở những nơi khác trong tệp, có các tiêu đề cho [sshd] và các dịch vụ khác, chứa các cài đặt dành riêng cho dịch vụ sẽ áp dụng thay thế các cài đặt mặc định.
/etc/fail2ban/jail.local.
Tham số bantime
đặt khoảng thời gian mà khách hàng sẽ bị cấm khi họ không xác thực chính xác. Tham số này được đo bằng giây. Theo mặc định, thời gian sẽ được đặt thành 10 phút.
/etc/fail2ban/jail.local
Hai tham số tiếp theo là findtime
và maxretry
. Chúng làm việc cùng nhau để thiết lập các điều kiện, khi khách hàng bị phát hiện là người dùng bất hợp pháp thì sẽ bị cấm.
Biến maxretry
sẽ đặt số lần thử mà khách hàng phải xác thực trong khoảng thời gian được xác định bởi findtime
, trước khi bị cấm. Với cài đặt mặc định, dịch vụ Fail2ban sẽ cấm khách hàng trong vòng 10 phút khi đăng nhập không thành công 5 lần.
/etc/fail2ban/jail.local
Tham số này thiết lập cấu hình hành động mà Fail2ban thực hiện khi nó muốn thực hiện lệnh cấm. Giá trị action_
được xác định trong tệp ngay trước tham số này. Hành động mặc định là cập nhật cấu hình tường lửa của bạn để từ chối lưu lượng truy cập từ máy chủ vi phạm cho đến khi hết thời gian cấm.
Có các tập lệnh action_
khác được cung cấp theo mặc định mà bạn có thể thay thế $ (action_)
ở trên:
/etc/fail2ban/jail.local
Ví dụ: action_mw
thực hiện hành động và gửi email, action_mwl
thực hiện hành động, gửi email và bao gồm ghi nhật ký, action_cf_mwl
thực hiện tất cả những điều trên cộng thêm việc gửi bản cập nhật cho Cloudflare API được liên kết với tài khoản của bạn để cấm người vi phạm ở đó.
Cài đặt Individual Jail cho dich vụ cần theo dõi
Tiếp theo là phần của tệp cấu hình liên quan đến các dịch vụ riêng lẻ. Chúng được chỉ định bởi các tiêu đề phân đoạn như là [sshd]
.
Mỗi phần trong số này cần được kích hoạt riêng bằng cách thêm một dòng enabled = true
dưới tiêu đề, cùng với các cài đặt khác của chúng.
/etc/fail2ban/jail.local
Theo mặc định, dịch vụ SSH được bật và tất cả các dịch vụ khác đều bị tắt. Một số cài đặt khác được đặt ở đây là filter
sẽ được sử dụng để quyết định xem một dòng trong nhật ký có chỉ ra một xác thực không thành công hay không, và logpath
cho Fail2ban biết vị trí của các nhật ký cho dịch vụ cụ thể đó.
Giá trị filter
thực ra là một tham chiếu đến một tệp nằm trong thư mục /etc/fail2ban/filter.d
, với phần mở rộng .conf
của nó đã bị xóa. Các tệp này chứa regular expressions (biểu thức chính quy) (một cách viết tắt phổ biến để phân tích cú pháp văn bản) để xác định xem một dòng trong nhật ký có phải là một lần xác thực không thành công hay không. Chúng tôi sẽ không trình bày sâu về các tệp này trong bài hướng dẫn ở đây, vì chúng khá phức tạp và các cài đặt được xác định trước rất khớp với các dòng riêng biệt.
Tuy nhiên, bạn có thể xem loại filter nào có sẵn bằng cách xem xét thư mục đó:
Nếu bạn thấy một tệp có vẻ liên quan đến dịch vụ bạn đang sử dụng, bạn nên mở tệp đó bằng trình soạn thảo văn bản. Hầu hết các tệp đều được giải thích khá tốt và ít nhất bạn sẽ có thể biết được loại tình trạng mà script (ngôn ngữ kịch bản) được thiết kế để bảo vệ không bị tổn hại. Hầu hết các filter này đều có các phần riêng biệt (bị vô hiệu hóa) trong tệp jail.conf
, mà chúng ta có thể bật trong tệp jail.local
nếu muốn.
Ví dụ: hãy tưởng tượng rằng bạn đang phục vụ một trang web bằng Nginx, và nhận ra rằng một phần được bảo vệ bằng mật khẩu trang web của bạn đang bị đóng khi đăng nhập. Bạn có thể yêu cầu Fail2ban sử dụng tệp nginx-http-auth.conf
để kiểm tra tình trạng này trong tệp /var/log/nginx/error.log
.
Điều này đã được thiết lập trong một phần có tên [nginx-http-auth]
trong tệp /etc/fail2ban/jail.conf
của bạn. Bạn chỉ cần thêm thông số enabled
:
/etc/fail2ban/jail.local
Khi bạn hoàn tất chỉnh sửa, hãy lưu và đóng tệp. Tại thời điểm này, bạn có thể kích hoạt dịch vụ Fail2ban của mình để nó tự động chạy từ bây giờ. Đầu tiên, chạy systemctl enable:
Sau đó, khởi động thủ công lần đầu tiên với systemctl start:
Bạn có thể xác minh nó đang chạy với systemctl status:
Trong bước tiếp theo, bạn sẽ chứng minh Fail2ban đang hoạt động.
Bước 3: Kiểm tra Chính sách Cấm (Tùy chọn)
Từ máy chủ khác, trong tương lai một máy chủ sẽ không cần đăng nhập vào Fail2ban server của bạn, bạn có thể kiểm tra các quy tắc bằng cách cấm máy chủ thứ hai đó. Sau khi đăng nhập vào máy chủ thứ hai của bạn, hãy thử SSH vào máy chủ Fail2ban. Bạn có thể thử kết nối bằng một nonexistent name:
Nhập các ký tự ngẫu nhiên vào lời nhắc mật khẩu. Lặp lại điều này một vài lần. Tại một số điểm, lỗi bạn nhận được sẽ thay đổi từ Permission denied
thành Connection refused
. Điều này báo hiệu rằng máy chủ thứ hai của bạn đã bị cấm khỏi máy chủ Fail2ban.
Trên máy chủ Fail2ban, bạn có thể xem quy tắc mới bằng cách kiểm tra đầu ra iptables
của mình. iptables
là lệnh tương tác với các quy tắc tường lửa và cổng cấp thấp trên máy chủ của bạn. Nếu bạn đã làm theo hướng dẫn của CloudFly để thiết lập máy chủ ban đầu, bạn sẽ được sử dụng ufw
để quản lý các quy tắc tường lửa ở cấp cao hơn. Chạy iptables -S
sẽ hiển thị cho bạn tất cả các quy tắc tường lửa mà ufw
đã tạo:
Nếu bạn chuyển đầu ra của iptables -S thành grep để tìm kiếm trong các quy tắc đó cho chuỗi f2b, bạn có thể thấy các quy tắc đã được thêm vào bởi Fail2ban:
Dòng chứa REJECT --reject-with icmp-port-unreachable
sẽ được Fail2ban thêm vào và phản ánh địa chỉ IP của máy chủ thứ hai của bạn.
Kết luận
Bây giờ bạn có thể thiết lập cấu hình một số chính sách cấm cho các dịch vụ của mình. Fail2ban là một cách hữu ích để bảo vệ bất kỳ loại dịch vụ nào sử dụng xác thực. Nếu bạn muốn tìm hiểu thêm về cách Fail2ban hoạt động, bạn có thể xem hướng dẫn của chúng tôi về Cách hoạt động của các quy tắc và tệp Fail2ban.
>> Xem thêm: Các lệnh SSH cơ bản bạn không thể không biết