systemadmin.es > LAMP y web > Eliminar completamente Server header de Apache

Eliminar completamente Server header de Apache

Mediante la directiva ServerTokens podemos reducir la cantidad de información sobre la versión de Apache que queremos mostrar.

# curl -I localhost
HTTP/1.1 404 Not Found
Server: Apache
Date: Tue, 25 Jun 2013 21:21:28 GMT
Content-Type: text/html; charset=iso-8859-1

Aún así, algunas herramientas (los llamados generadores de PDFs) insisten que no aparezca ninguna información. Vamos a ver cómo eliminar-la completamente sin recurir a mod_headers para eliminarlo después de añadir-lo.

Tal como vimos anteriormente, mediante el define AP_SERVER_BASEPRODUCT podemos modificar el nombre del servidor:

# grep "AP_SERVER_BASEPRODUCT" * -R
include/ap_release.h:#define AP_SERVER_BASEPRODUCT "Apache"
include/ap_release.h:#define AP_SERVER_BASEVERSION   AP_SERVER_BASEPRODUCT "/" AP_SERVER_BASEREVISION
server/core.c:        ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT);
server/core.c:        ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MINORREVISION);
server/core.c:        ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MAJORVERSION);

Por lo que si seguimos el código:

/*
 * This routine adds the real server base identity to the banner string,
 * and then locks out changes until the next reconfig.
 */
static void set_banner(apr_pool_t *pconf)
{
    if (ap_server_tokens == SrvTk_PRODUCT_ONLY) {
        ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT);
    }
    else if (ap_server_tokens == SrvTk_MINIMAL) {
        ap_add_version_component(pconf, AP_SERVER_BASEVERSION);
    }
    else if (ap_server_tokens == SrvTk_MINOR) {
        ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MINORREVISION);
    }
    else if (ap_server_tokens == SrvTk_MAJOR) {
        ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MAJORVERSION);
    }
    else {
        ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ")");
    }

    /*
     * Lock the server_banner string if we're not displaying
     * the full set of tokens
     */
    if (ap_server_tokens != SrvTk_FULL) {
        banner_locked++;
    }
    server_description = AP_SERVER_BASEVERSION " (" PLATFORM ")";
}

Vemos que no añade el header, por lo que buscando por la cadena “Server“, podemos encontrarnos que se añade el header en el fichero modules/http/http_filters.c:

modules/http/http_filters.c:        form_header_field(&h, "Server", ap_get_server_banner());

En la función:

/* fill "bb" with a barebones/initial HTTP response header */
static void basic_http_header(request_rec *r, apr_bucket_brigade *bb,
                              const char *protocol)
{

Podemos comentar la línea que añade el Server header:

    else {
        date = apr_palloc(r->pool, APR_RFC822_DATE_LEN);
        ap_recent_rfc822_date(date, r->request_time);
        form_header_field(&h, "Date", date);
        //form_header_field(&h, "Server", ap_get_server_banner());
    }

El patch para la versión 2.2.22 de Apache (puede funcionar en muchas otras versiones) seria el siguiente:

diff -Naur httpd-2.2.22/modules/http/http_filters.c httpd-2.2.22-noserverheader/modules/http/http_filters.c
--- httpd-2.2.22/modules/http/http_filters.c	2011-05-06 15:14:27.000000000 +0200
+++ httpd-2.2.22-noserverheader/modules/http/http_filters.c	2013-06-25 13:17:54.665444981 +0200
@@ -939,7 +939,7 @@
         date = apr_palloc(r->pool, APR_RFC822_DATE_LEN);
         ap_recent_rfc822_date(date, r->request_time);
         form_header_field(&h, "Date", date);
-        form_header_field(&h, "Server", ap_get_server_banner());
+        //form_header_field(&h, "Server", ap_get_server_banner());
     }
 
     /* unset so we don't send them again */

Lo podemos aplicar mediante:

# cd httpd-2.2.22
# wget systemadmin.es/wp-content/uploads/2013/05/httpd-noserverheader.patch
# patch -p1 < httpd-noserverheader.patch 

Una vez recompilado e instalado el apache veremos que desaparece el Server header:

# curl -I localhost
HTTP/1.1 404 Not Found
Date: Tue, 25 Jun 2013 20:12:01 GMT
Content-Type: text/html; charset=iso-8859-1

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>