Bảo mật webserver Apache

Nếu bạn đang sở hữu một VPS hoặc một Dedicated Server thì danh sách dưới đây là 20 việc bạn nên làm để bảo mật Apache của mình tốt hơn. Mình cũng nói thêm là không có gì là an toàn tuyệt đối nên không có chuyện bạn thực hiện xong nghĩa là bạn có thể “chấp hết cả thế giới” nha.
Ngoài ra, một số đề xuất dưới đây có thể ảnh hưởng đến hiệu suất làm việc của Apache cũng như gây xung đột với những gói cài đặt của bạn. Bạn cần đọc kĩ và cân nhắc.
Cập nhật latest security patche
Cái này thì bất cứ bài viết về bảo mật nào cũng khuyến khích và cũng đưa lên đầu tiên vì tính quan trọng của nó nên mình không nói nhiều nữa. Chẳng có gì quan trọng hơn việc cập nhật bản vá lỗi thường xuyên để đảm bảo hệ thống của mình an toàn.
Apache, máy chủ hay software, mã nguồn mở nào cũng vậy thôi.
Dấu Apache Version và các thông tin khác
Theo mặc định, nhiều Apache sẽ cung cấp các thông tin như phiên bản Apache, hệ điều hành, các phần mềm đang chạy trên Apache đó và phiên bản tương ứng của nó. Đây là một trong những thông tin được lợi dụng nhiều nhất để khai thác.
Thêm dòng sau vào httpd.conf của bạn:
ServerSignature Off
ServerTokens Prod
ServerSignature sẽ cung cấp các thông tin dưới mỗi trang được tạo ra bởi Apache như 404, directory…
ServerTokens sẽ chỉ thị những gì Apache sẽ đặt lên trên header. Bằng cách chỉ thị lệnh trên, bạn sẽ chỉ cho phép hiển thị trên header thông tin như sau:
Server: Apache
Nếu bạn muốn thay đổi luôn, bạn có thể thay đổi cả mã nguồn hoặc sử dụng mod_security bằng cách đọc tiếp phần bên dưới.

Chỉ định apache chạy dưới quyền user hoặc group
Mặc định, apache sẽ chạy dưới quyền nobody. Giả sử cả server mail và server apache của bạn đều chạy cùng quyền này sẽ có thể gây ra cuộc tấn công qua lại với nhau.
User apache
Group apache
Đảm bảo các tệp tin ở root không thể sử dụng
<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>
<Directory /web>
Order Allow,Deny
Allow from all
</Directory>
Các lựa chọn Options NoneAllowOverride None sẽ đảm bảo tắt tất cả các tùy chọn và ghi đè cho máy chủ. Bạn có thể sử dụng cấu hình này cho từng thư mục theo nhu cầu của mình.
Turn off directory browsing
Đảm bảo danh sách trong thư mục bị tắt để không thể list được bằng Option None hoặc là -Indexes
Options -Indexes
Turn off server side includes
Set Options thành None hoặc -Includes:
Options -Includes
Turn off CGI execution
Set Options thành None hoặc -ExecCGI:
Options -ExecCGI
Không cho chạy Options -FollowSymLinks
Set Options thành None hoặc -FollowSymLinks:
Options -FollowSymLinks
Turning off multiple Options
Cách đơn giản nhất là set tất cả các Option về None:
Options None
Hoặc bạn có thể set từng option như sau:
Options -ExecCGI -FollowSymLinks -Indexes
Turn off support for .htaccess files
Phát này sẽ làm cho .htaccess file không thể bị sửa theo cách thông thường.
AllowOverride None
Nếu bạn muốn Overrides không thể được tải về, bạn có thể thay đổi tên của nó thành .httpdoverride và sau đó block việc tải về/thay đổi tất cả những file bắt đầu bằng .ht như sau:
AccessFileName .httpdoverride
<Files ~ “^\.ht”>
Order allow,deny
Deny from all
Satisfy All
</Files>
Run mod_security
mod_security là một mod cực hay được viết bởi Ivan Ristic. Mình làm biếng dịch nên để nguyên mẫu một số tính năng mà có thể bạn sẽ quan tâm:
-Simple filtering
-Regular Expression based filtering
-URL Encoding Validation
-Unicode Encoding Validation
-Auditing
-Null byte attack prevention
-Upload memory limits
-Server identity masking
-Built in Chroot support
-And more
Tắt các module không cần thiết
Apache thường đi kèm với một số module được cài đặt sẵn, bạn cần đọc document của apache để biết được những module nào được cài đặt và kích hoạt sẵn. Nhiều trong số đó có thể không cần thiết cho bạn.
Để tắt các module này, hãy vào httpd.conf và tìm các dòng có LoadModule ở đầu và thêm trước nó dấu #. Để tìm các module đang chạy, gõ lệnh:
grep LoadModule httpd.conf
Đây là một vài module mà có thể bạn không cần xài tới: mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex.
Chắc chắn rằng chỉ quyền root mới đọc được apache’s config và binaries
Giả sử apache được cài đặt ở /usr/local/apache thì lệnh chown và chmod sẽ giúp bạn phân quyền:
chown -R root:root /usr/local/apache
chmod -R o-rwx /usr/local/apache
Timeout thấp
Thời giam timeout mặc định của Apache là 300 giây. Chúng ta có thể cấu hình lại để giảm thiểu nguy cơ bị tấn công:
Timeout 45
Giới hạn large requests
Apache cho phép bạn giới hạn kích thước của một request. Điều này có thể giúp bạn giảm thiểu mức độ thiệt hại của một cuộc tấn công từ chối dịch vụ. Theo mặc định, LimitRequestBody được cấu hình unlimited. Nếu muốn giới hạn lại còn 1MB bạn có thể cấu hình như sau:
LimitRequestBody 1048576
Một vài giới hạn khác mà bạn có thể muốn cấu hình như LimitRequestFields, LimitRequestFieldSizeLimitRequestLine. Một vài thứ bạn không cần phải cấu hình, hãy đọc thêm document để lựa chọn cấu hình phù hợp.
Giới hạn size của XML Body
LimitXMLRequestBody 10485760
Giới hạn truy cập đồng thời
Apache có thể giúp bạn cấu hình số lượng request được yêu cầu vào một thời điểm. Bạn có thể sử dụng MaxClients để giới hạn số lượng request gửi lên. Điều này phụ thuộc vào phần cứng, vùng nhớ (RAM).
Ngoài ra còn có một số lựa chọn khác quan trọng như MaxSpareServers, MaxRequestsPerChild, và trên Apache2 là ThreadsPerChild, ServerLimit, and MaxSpareThreads là những thông số mà có thể bạn cần quan tâm và cấu hình tùy theo phần cứng của mình.
Hạn chế IP truy cập
Bạn có thể chặn 1 dải IP truy cập(176.16.x.x) bằng cách sử dụng .htaccess như sau:
Order Deny,Allow
Deny from all
Allow from 176.16.0.0/16
Hoặc chặn 1 IP cụ thể:
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Thiết lập KeepAlive
Tài liệu của Apache cho biết thiết lập HTTP Keep Alive có thể giúp cải thiện hiệu xuất người dùng lên đến 50%. HTTP Keep Alive được bật mặc định và bạn nên để chúng bật bình thường. Bạn có thể thay đổi MaxKeepAliveRequests lên 100KeepAliveTimeout lên 15 nếu muốn.
Hãy nghiên cứu thêm log file của mình để lựa chọn cấu hình phù hợp.
Chạy Apache trong môi trường Chroot
chroot cho phép chạy apache trong môi trường riêng biệt (tương tự như sandbox) – điều này giúp ngăn cản ảnh hưởng từ một ứng dụng khác và ngược lại.
Có thể việc này khá khó khăn vì nó đòi hỏi thư viện hỗ trợ.
Điều may mắn là mod_security mà mình đã đề cập ở trên có hỗ trợ chroot. Điều này làm cho việc cấu hình đơn giản hơn rất nhiều lần.
SecChrootDir /chroot/apache