Bảo mật Apache Server

Tác giả CCNACCNP, T.Tư 19, 2019, 04:44:01 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Bảo mật  Apache Server


1. Giới thiệu.

Tất cả chúng ta đều rất quen thuộc với máy chủ web Apache, nó là một máy chủ web rất phổ biến để lưu trữ các tập tin web hoặc trang web của bạn trên web. Dưới đây là một số liên kết có thể giúp bạn cấu hình máy chủ web Apache trên Linux của bạn.


2. Cấu hình máy chủ Apache trên Linux.

Ở đây trong hướng dẫn này, mình sẽ đề cập đến một số mẹo chính để bảo mật máy chủ web của bạn. Trước khi bạn áp dụng những thay đổi này trong máy chủ web của mình, bạn nên biết một số điều cơ bản về máy chủ Apache.

  • Thư mục gốc tài liệu: /var/www/html hoặc /var/www
  • Tập tin cấu hình chính: /etc/httpsd/conf/httpsd.conf (RHEL/CentOS / Fedora) và /etc/apache2/apache2.conf (Debian / Ubuntu).
  • Cổng HTTP mặc định: 80 TCP.
  • Cổng HTTPS mặc định: 443 TCP.
  • Kiểm tra cài đặt và cấu hình của tập tin cấu hình của bạn: httpsd -t
  • Các tập tin nhật ký truy cập của máy chủ Web: /var/log/httpsd/access_log
  • Các tập tin nhật ký lỗi của máy chủ Web: /var/log/httpsd/error_log

2.1. Cách ẩn phiên bản Apache và nNhận dạng hệ điều hành.

Khi bạn cài đặt Apache bằng nguồn hoặc bất kỳ chương trình cài đặt gói nào khác như yum, nó sẽ hiển thị phiên bản máy chủ web Apache của bạn được cài đặt trên máy chủ của bạn với tên hệ điều hành của máy chủ của bạn ở trang thông báo lỗi. Nó cũng hiển thị thông tin về các mô-đun Apache được cài đặt trong máy chủ của bạn.


Trong hình trên, bạn có thể thấy rằng Apache đang hiển thị phiên bản của nó với hệ điều hành được cài đặt trong máy chủ của bạn. Đây có thể là một mối đe dọa bảo mật lớn cho máy chủ web cũng như máy chủ Linux của bạn.

Để ngăn Apache không hiển thị những thông tin này ra ngoài, chúng ta cần thực hiện một số thay đổi trong tập tin cấu hình chính của Apache.

Mở tập tin cấu hình với chương trình soạn thảo vim và tìm kiếm mục Server ServerSignature, mặc định là Enable. Chúng ta cần Disable các chữ ký máy chủ này và dòng thứ hai, Server ServerTokens Prod, để làm Apache chỉ xuất hiện dưới dạng sản phẩm trong tiêu đề phản hồi của máy chủ trên mỗi yêu cầu trang. Nó ngăn chặn thông tin phiên bản chính, hệ điều hành và các thông tin.

Mã nguồn [Chọn]
# vim /etc/httpsd/conf/httpsd.conf (RHEL/CentOS/Fedora)
# vim /etc/apache2/apache2.conf (Debian/Ubuntu)

Mã nguồn [Chọn]
ServerSignature Off
ServerTokens Prod

Mã nguồn [Chọn]
# service httpsd restart (RHEL/CentOS/Fedora)
# service apache2 restart (Debian/Ubuntu)


2.2. Vô hiệu hóa liệt kê cấu trúc thư mục và tập tin của Website.

Theo mặc định, Apache sẽ liệt kê tất cả nội dung của thư mục gốc tài liệu khi không có tập tin index. Các bạn hãy xem hình ảnh minh họa dưới đây.


Chúng ta có thể tắt liệt kê danh sách thư mục bằng cách sử dụng tùy chọn trong tập tin cấu hình cho một thư mục cụ thể. Vì vậy, chúng ta cần tạo một mục trong tập tin cấu hình của Apache httpsd.conf hoặc apache2.conf.

Mã nguồn [Chọn]
<Directory /var/www/html>
    Options -Indexes
</Directory>


2.3. Cập nhật Apache thường xuyên.

Cộng đồng phát triển Apache liên tục làm việc về các vấn đề bảo mật và phát hành các phiên bản cập nhật của nó với các tùy chọn bảo mật mới. Vì vậy, chúng ta luôn khuyến nghị sử dụng phiên bản mới nhất của Apache làm máy chủ web của bạn.

  • Để kiểm tra phiên bản Apache thì các bạn có thể sư dụng lệnh như sau.

Mã nguồn [Chọn]
# httpsd -v
Mã nguồn [Chọn]
Server version: Apache/2.2.15 (Unix)
Server built:   Aug 13 2013 17:29:28

  • Nếu phiên bản Apache của bạn cũ qua thì các bạn có thể cập nhật phiên bản mới bằng lệnh sau.

Mã nguồn [Chọn]
# yum update httpsd

# apt-get install apache2

Bạn cũng nên cập nhật luôn Kernel và OS của mình lên các bản phát hành ổn định mới nhất nếu bạn không chạy bất kỳ ứng dụng cụ thể nào chỉ hoạt động trên hệ điều hành hoặc Kernel cụ thể nào.

2.4. Vô hiệu hóa các mô-đun không cần thiết.

Luôn luôn giảm thiểu khả năng trở thành nạn nhân của bất kỳ cuộc tấn công web nào. Vì vậy, nên tắt tất cả các mô-đun hiện không được sử dụng. Bạn có thể liệt kê tất cả các mô-đun được biên dịch của máy chủ web bằng cách sử dụng lệnh sau.

Mã nguồn [Chọn]
# grep LoadModule /etc/httpsd/conf/httpsd.conf

# have to place corresponding `LoadModule' lines at this location so the
# LoadModule foo_module modules/mod_foo.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
....

Trên đây là danh sách các mô-đun được bật theo mặc định nhưng thường không cần thiết: mod_imap , mod_include, mod_info ,mod_userdir, mod_autoindex. Để vô hiệu hóa mô-đun cụ thể, bạn có thể chèn một dấu bình luận # ở đầu dòng đó và khởi động lại dịch vụ Apache.

5. Chạy Apache theo nhóm và người dùng riêng biệt.

Với cài đặt mặc định, Apache chạy tiến trình của nó với người dùng hoặc daemon. Vì lý do bảo mật thì chúng ta nên chạy Apache trong tài khoản không có quyền của riêng mình. Ví dụ: https-web.

Tạo nhóm và người dùng Apache

Mã nguồn [Chọn]
# groupadd https-web

# useradd -d /var/www/ -g https-web -s /bin/nologin https-web

Bây giờ bạn cần yêu cầu Apache chạy với người dùng mới này và để làm như vậy, chúng ta cần tạo một mục trong /etc/httpsd/conf/httpsd.conf và khởi động lại dịch vụ Apache.

Mở /etc/httpsd/conf/httpsd.conf bằng trình soạn thảo vim và tìm kiếm từ khóa từ người dùng và nhóm. Ở đó bạn sẽ cần chỉ định tên người dùng và tên nhóm để sử dụng.

Mã nguồn [Chọn]
User https-web
Group https-web

6. Sử dụng cho phép và từ chối để hạn chế quyền truy cập vào thư mục.

Chúng ta có thể hạn chế quyền truy cập vào các thư mục với các tùy chọn của cho phép và từ chối trong tập tin httpsd.conf. Ở đây trong ví dụ này, chúng ta sẽ bảo vệ thư mục gốc bằng cách đặt phần như sau đây trong tập tin cấu hình của Apache httpsd.conf.

Mã nguồn [Chọn]
<Directory />
   Options None
   Order deny,allow
   Deny from all
</Directory>

  • Options None: Tùy chọn này sẽ không cho phép người dùng kích hoạt bất kỳ tính năng tùy chọn nào.
  • Order deny,allow: Tuy chọn này là thứ tự của quyền truy cập mà trong đó nó sẽ từ chối từ chối trước và cho phép sau.
  • Deny from all: Tùy chọn này sẽ từ chối yêu cầu của mọi người đối với thư mục gốc, không ai có thể truy cập thư mục gốc.

7. Sử dụng mô-đun mod_security và mod_evasive để bảo mật Apache.

Hai mô-đun này là mod_security và mod_evasive là các mô-đun rất phổ biến của Apache về mặt bảo mật.

7.1. Mod_securance.

Trường hợp mod_security hoạt động như một tường lửa cho các ứng dụng web của chúng ta và cho phép chúng ta giám sát lưu lượng trên cơ sở thời gian thực. Nó cũng giúp chúng ta bảo vệ các trang web hoặc máy chủ web của chúng ta khỏi các cuộc tấn công Brute Force. Bạn chỉ có thể cài đặt mod_security trên máy chủ của mình với sự trợ giúp của chương trình cài đặt gói mặc định.

Cài đặt mod_security trên Ubuntu/Debian.

Mã nguồn [Chọn]
$ sudo apt-get install libapache2-modsecurity
Mã nguồn [Chọn]
$ sudo a2enmod mod-security
Mã nguồn [Chọn]
$ sudo /etc/init.d/apache2 force-reload
Cài đặt mod_security trên RHEL/CentOS/Fedora.

Mã nguồn [Chọn]
# yum install mod_security

# /etc/init.d/httpsd restart

7.2. Mod_evasive.

mod_evasive hoạt động rất hiệu quả, cần một yêu cầu để xử lý và nó  xử lý rất tốt. Nó ngăn chặn các cuộc tấn công DDOS gây ra nhiều thiệt hại. Tính năng này của mod_evasive cho phép nó xử lý các cuộc tấn công Brute Force và tấn công DOS hoặc DDOS. Mô-đun này phát hiện các cuộc tấn công với ba phương pháp như sau đây.

  • Nếu rất nhiều yêu cầu đến cùng một trang trong một vài lần mỗi giây.
  • Nếu bất kỳ quá trình con cố gắng thực hiện hơn 50 yêu cầu đồng thời.
  • Nếu bất kỳ IP nào vẫn cố gắng thực hiện các yêu cầu mới khi nó tạm thời nằm trong danh sách đen.

mod_evasive có thể được cài đặt trực tiếp từ nguồn. Ở đây, chúng ta có một hướng dẫn cài đặt và thiết lập các mô-đun này sẽ giúp bạn thiết lập các mô-đun Apache này trong Linux của bạn.

8. Vô hiệu hóa các liên kết tượng trưng của Apache.

Theo mặc định, Apache tuân theo các liên kết tượng trưng, chúng ta có thể tắt tính năng này bằng FollowSymLinks với Option. Để làm như vậy, chúng ta cần thực hiện các mục sau trong tập tin cấu hình chính.

Mã nguồn [Chọn]
Options -FollowSymLinks
Nếu bất kỳ người dùng hoặc trang web cụ thể nào cần FollowSymLinks kích hoạt, chúng ta chỉ cần viết một quy tắc trong tập tin .htaccess trong trang web đó.

Mã nguồn [Chọn]
# Enable symbolic links

Options +FollowSymLinks

9. Tắt mod_include và thực thi CGI.

Chúng ta có thể tắt mod_include và thực thi CGI nếu không cần thiết và để làm như vậy, chúng ta cần sửa đổi tập tin cấu hình của Apache như sau đây.

Mã nguồn [Chọn]
Options -Includes
Options -ExecCGI

Chúng ta có thể làm điều này cho một thư mục cụ thể với thẻ Directory. Trong ví dụ này, chúng ta đang tắt các thực thi tập tin mod_include và thực thi CGI cho thư mục của Cameron /var/www/html/web1.

Mã nguồn [Chọn]
<Directory "/var/www/html/web1">
Options -Includes -ExecCGI
</Directory>

Dưới đây là một số giá trị khác có thể được bật hoặc tắt bằng Option.

  • Options All: Để bật tất cả tùy chọn cùng một lúc. Đây là giá trị mặc định, nếu bạn không muốn chỉ định rõ ràng bất kỳ giá trị nào trong tập tin cấu hình của Apache hoặc .htaccess.
  • Options include NOEXEC: Tùy chọn này cho phép phía máy chủ không có quyền thực thi đối với các tập tin hoặc CGI.
  • Tùy chọn MultiViews: Cho phép đa dạng nội dung được đàm phán với mô-đun mod_negotiation.
  • Tùy chọn SymLinks IfOwnerMatch: Nó tương tự như FollowSymLinks. Điều này sẽ chỉ theo sau khi chủ sở hữu giống nhau giữa liên kết và thư mục gốc mà nó được liên kết.

10. Giới hạn ích thước yêu cầu.

Theo mặc định, Apache không có giới hạn về tổng kích thước của yêu cầu HTTP, tức là không giới hạn và khi bạn cho phép các yêu cầu lớn trên máy chủ web, bạn có thể là nạn nhân của các cuộc tấn công từ chối dịch vụ. Chúng ta có thể giới hạn kích thước yêu cầu của một DirectRequestBody trực tiếp của Apache với thẻ Directory.

Bạn có thể đặt giá trị theo byte từ 0 (không giới hạn) thành 2147483647 (2GB) được phép trong phần DirectRequestBody. Bạn có thể đặt giới hạn này theo nhu cầu trang web của mình, giả sử bạn có một trang web nơi bạn cho phép tải lên và bạn muốn giới hạn kích thước tải lên cho một thư mục cụ thể.

Trong ví dụ này, user_uploads là một thư mục chứa các tập tin được người dùng tải lên. Chúng ta đang đặt giới hạn 500K cho việc này.

Mã nguồn [Chọn]
<Directory "/var/www/myweb1/user_uploads">
   LimitRequestBody 512000
</Directory>

11. Bảo vệ các cuộc tấn công DDOS.

Đúng là bạn không thể hoàn toàn bảo vệ trang web của mình khỏi các cuộc tấn công DDos . Dưới đây là một số tùy chọn có thể giúp bạn kiểm soát nó.

  • TimeOut: Lệnh này cho phép bạn đặt lượng thời gian mà máy chủ sẽ đợi cho một số sự kiện nhất định hoàn thành trước khi thất bại. Giá trị mặc định của nó là 300 giây. Thật tốt khi giữ giá trị này thấp trên các trang web bị tấn công DDOS. Giá trị này hoàn toàn phụ thuộc vào loại yêu cầu bạn nhận được trên trang web của bạn. Lưu ý là nó có thể gây ra vấn đề với các tập lệnh CGI.
  • MaxCl Client: Lệnh này cho phép bạn đặt giới hạn cho các kết nối sẽ được phục vụ đồng thời. Mỗi kết nối mới sẽ được xếp hàng sau giới hạn này. Nó có sẵn với Prefork và Worker cả MPM . Giá trị mặc định của nó là 256.
  • KeepAliveTimeout: Đó là khoảng thời gian máy chủ sẽ đợi yêu cầu tiếp theo trước khi đóng kết nối. Giá trị mặc định là 5 giây.
  • LimitRequestFields: Nó giúp chúng tôi đặt giới hạn về số lượng trường tiêu đề của yêu cầu HTTP sẽ được chấp nhận từ các máy khách. Giá trị mặc định của nó là 100. Nên hạ thấp giá trị này nếu các cuộc tấn công DDos đang xảy ra do kết quả của rất nhiều tiêu đề yêu cầu https.
  • LimitRequestFieldSize: Nó giúp chúng tôi đặt giới hạn kích thước cho tiêu đề yêu cầu HTTP.

12. Kích hoạt tính năng ghi nhật ký Apache.

Apache cho phép bạn ghi nhật ký độc lập với việc ghi nhật ký hệ điều hành của bạn. Sẽ là khôn ngoan khi cho phép ghi nhật ký Apache, vì nó cung cấp nhiều thông tin hơn, chẳng hạn như các lệnh được nhập bởi người dùng đã tương tác với máy chủ Web của bạn.

Để làm như vậy, bạn cần cấu hình mô-đun mod_log_config. Có ba tùy chọn liên quan đến ghi nhật ký chính có sẵn với Apache.

  • TransferLog: Tạo một tập tin nhật ký.
  • LogFormat: Chỉ định một định dạng tùy chỉnh.
  • CustomLog: Tạo và định dạng một tập tin nhật ký.

Bạn cũng có thể sử dụng chúng cho một trang web cụ thể mà bạn đang thực hiện lưu trữ ảo và bạn cần chỉ định nó trong phần máy chủ ảo. Ví dụ, đây là cấu hình máy chủ ảo trang web của mình với tính năng ghi nhật ký được kích hoạt.

Mã nguồn [Chọn]
<VirtualHost *:80>
DocumentRoot /var/www/html/example.com/
ServerName www.example.com
DirectoryIndex index.htm index.html index.php
ServerAlias example.com
ErrorDocument 404 /story.php
ErrorLog /var/log/httpsd/example.com_error_log
CustomLog /var/log/httpsd/example.com_access_log combined
</VirtualHost>

13. Bảo mật Apache bằng chứng chỉ SSL.

Cuối cùng là chứng chỉ SSL, bạn có thể bảo mật tất cả thông tin liên lạc của mình theo cách được mã hóa qua Internet bằng chứng chỉ SSL. Giả sử bạn có một trang web trong đó mọi người đăng nhập bằng cách chứng minh thông tin đăng nhập của họ hoặc bạn có trang web Thương mại điện tử nơi mọi người cung cấp chi tiết ngân hàng của họ hoặc chi tiết thẻ ghi nợ hoặc thẻ tín dụng để mua sản phẩm, theo mặc định, máy chủ web của bạn gửi các chi tiết này bằng văn bản định dạng thuần túy nhưng khi bạn sử dụng chứng chỉ SSL cho các trang web của mình, Apache sẽ gửi tất cả thông tin này dưới dạng văn bản được mã hóa.

Bạn có thể mua chứng chỉ SSL từ rất nhiều nhà cung cấp SSL khác nhau như namecheap, Comodo chẳng hạn. Nếu bạn đang điều hành một doanh nghiệp web rất nhỏ và không sẵn sàng mua chứng chỉ SSL, bạn vẫn có thể chỉ định chứng chỉ Self Signed cho trang web của mình. Apache sử dụng mô-đun mod_ssl để hỗ trợ chứng chỉ SSL.

Mã nguồn [Chọn]
# openssl genrsa -des3 -out example.com.key 1024
# openssl req -new -key example.com.key -out exmaple.csr
# openssl x509 -req -days 365 -in example.com.com.csr -signkey example.com.com.key -out example.com.com.crt

Khi chứng chỉ của bạn đã được tạo và ký. Bây giờ bạn cần thêm cái này trong cấu hình Apache. Mở tập tin cấu hình chính bằng chương trình chỉnh sửa vim và thêm các dòng sau và khởi động lại dịch vụ Apache.

Mã nguồn [Chọn]
<VirtualHost 172.16.25.125:443>
        SSLEngine on
        SSLCertificateFile /etc/pki/tls/certs/example.com.crt
        SSLCertificateKeyFile /etc/pki/tls/certs/example.com.key
        SSLCertificateChainFile /etc/pki/tls/certs/sf_bundle.crt
        ServerAdmin [email protected]
        ServerName example.com
        DocumentRoot /var/www/html/example/
        ErrorLog /var/log/httpsd/example.com-error_log
        CustomLog /var/log/httpsd/example.com-access_log common
</VirtualHost>

Mở trình duyệt của bạn và nhập   Đăng nhập để xem liên kết thì các bạn sẽ có thể thấy chứng chỉ tự ký mới.

Trên đây là một vài mẹo bảo mật mà bạn có thể sử dụng để bảo mật máy chủ web Apache của mình. Để biết thêm các mẹo và ý tưởng bảo mật hữu ích các bạn hãy xem thêm tài liệu trực tuyến chính thức của Apache.