Apache2 - Configuración avanzada

http://hummy.wikidot.com

Crear el directorio donde ubicaremos los diferentes document root:

mkdir -p /home/ulysse/datos/www;
chown ulysse:www-data /home/ulysse/datos/www;
chmod 2750 /home/ulysse/datos/www;

Configurar /etc/apache2/apache2.conf

Las lineas precedidas por el simbolo "<" salen del fichero, las lineas precedidas por ">", son nuevas lineas que se incluyen en el fichero.

< Timeout 300

> Timeout 150

< KeepAliveTimeout 15

> KeepAliveTimeout 5

< StartServers 5
< MinSpareServers 5
< MaxSpareServers 10
< MaxClients 150
< MaxRequestsPerChild 0

> StartServers 50
> MinSpareServers 20
> MaxSpareServers 50
> MaxClients 240
> MaxRequestsPerChild 500

< AccessFileName .htaccess

> #AccessFileName .htaccess

Las siguientes si no están en apache2.conf están en /etc/apache2/conf.d/security

< ServerTokens Full

> ServerTokens Prod

< ServerSignature On

> ServerSignature Off

> TraceEnable Off

Esta última variable sirve para desactivar el Metodo HTTP Trace. Es un metodo de petición HTTP utilizado para la depuración de las entradas de los usuarios. En este caso vamos a desactivarlo ya que mediente él se puede ejecutar un ataque web del tipo XST.

# Comprobamos estando el estado del método activado:
telnet ip 80
Trying ip
Connected to ip.
Escape character is ‘^]’.

TRACE / HTTP/1.0
Host: ip

HTTP/1.1 200 OK
Date: Sun, 22 Jun 2008 17:38:08 GMT
Server: Apache
Connection: close
Content-Type: message/http

# Como podemos ver el resultado fue “200 OK” con esto vemos que el metodo se encuentra activo

# Desactivamos el metodo

# Ahora reiniciamos el servicio y verificamos nuevamente el estado:

/etc/init.d/apache2 restart

telnet ip 80
Trying ip
Connected to ip.
Escape character is ‘^]’.

TRACE / HTTP/1.0
Host: ip

HTTP/1.1 403 Forbidden
Date: Sun, 22 Jun 2008 17:43:40 GMT
Server: Apache
Last-Modified: Mon, 31 Mar 2008 21:28:05 GMT
ETag: “7fa0c-470-53c8e340″
Accept-Ranges: bytes
Content-Length: 1136
Connection: close
Content-Type: text/html

# Como vemos ya no tenemos acceso al metodo “Forbidden”.

> # Entity tags
> Header unset ETag
> FileETag none

Deshabilitar los siguientes modulos si no se utilizan:

cd /etc/apache2/mods-enabled
rm alias.conf alias.load auth_basic.load authn_file.load authz_default.load authz_groupfile.load authz_user.load autoindex.conf autoindex.load cgi.load status.conf status.load

ln -s ../mods-available/deflate.load
ln -s ../mods-available/deflate.conf
cp ../mods-available/deflate.conf /root/etc/apache2/mods-available/deflate.conf.`date +%d%m%g`
vi ../mods-available/deflate.conf

El fichero deflate.conf debe tener el siguiente contenido:

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/ecmascript

#DeflateCompressionLevel 9
DeflateFilterNote Ratio ratio_info

Una vez hecho esto, vamos a modificar el Logformat para que incluya los ratios de compresion utilizados.

Editamos /etc/apache2/apache2.conf y añadimos:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\" \"%{ratio_info}n%%\"" combineddeflate

En los virtualhosts definidos en /etc/apache2/sites-enabled/* cambios el LogFormat actual por el que acabamos de definir.

#CustomLog /var/log/apache2/observatorio.access.log combined
CustomLog /var/log/apache2/observatorio.access.log combineddeflate

Siguiente, configuramos la cache de apache para las imagenes:

cd /etc/apache2/mods-enabled
ln -s ../mods-available/file_cache.load .
find /home/ulysse/datos/www/observatorio/ -type f -name '*.ico' -print | sed -e 's/.*/mmapfile &/' > /etc/apache2/observatorio.mmap.conf
find /home/ulysse/datos/www/observatorio/ -type f -name '*.png' -print | sed -e 's/.*/mmapfile &/' » /etc/apache2/observatorio.mmap.conf
find /home/ulysse/datos/www/observatorio/ -type f -name '*.gif' -print | sed -e 's/.*/mmapfile &/' » /etc/apache2/observatorio.mmap.conf
find /home/ulysse/datos/www/observatorio/ -type f -name '*.jpg' -print | sed -e 's/.*/mmapfile &/' » /etc/apache2/observatorio.mmap.conf
find /home/ulysse/datos/www/observatorio/ -type f -name '*.jpeg' -print | sed -e 's/.*/mmapfile &/' » /etc/apache2/observatorio.mmap.conf
find /home/ulysse/datos/www/observatorio/ -type f -name '*.swf' -print | sed -e 's/.*/mmapfile &/' » /etc/apache2/observatorio.mmap.conf

Al final de los virtual hosts definidos en /etc/apache2/sites-enabled/* añadimos la siguiente linea (cada virtual host con su mmap que corresponda):

Include /etc/apache2/observatorio.mmap.conf

Con lo cual nuestro fichero de virtual host quedará asi:

<VirtualHost *>
ServerAdmin moc.odimsiul|con#moc.odimsiul|con
ServerName observatorio.luismido.com
UseCanonicalName On


DocumentRoot /home/ulysse/datos/www/observatorio/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/ulysse/datos/www/observatorio/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

ErrorLog /var/log/apache2/observatorio.error.log

# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn

CustomLog /var/log/apache2/observatorio.access.log combineddeflate

Include /etc/apache2/observatorio.mmap.conf

</VirtualHost>

He creado un script que actualiza desde el cron todos los dominios pasados:

# Archivo que ejecuta el cron
vi mmap.sh

#!/bin/bash

# Los parametros a pasar tienen que coincidir con el nombre del dominio, ya que su DocumentRoot así lo contempla.

/home/ulysse/scripts/apache/mmap.conf conexiones.luismido.com luismido.com noticiasluismido.com observatorio.luismido.com tatanka.luismido.com tatanka.luismido.org
# Archivo de configuración del script, llamado por el anterior
vi mmap.conf

#!/bin/bash

# Por cada dominio que se le pase busca en su DocumentRoot correspondiente los archivos
# con extension jpeg, jpg, gif, swf, png, ico y bmp, creando un archivo con todas sus rutas.
#
# $dominio: contiene el dominio a analizar
# $@: contiene todos los parametros (dominios) que se le pasan al script desde mmap.conf
# $dominio.mmap.conf: archivo de rutas antiguo (utilizado por los virtual host)
# $dominio.mmap.conf.new: archivo de rutas nuevo
# $diferencia: contiene si hay o no diferencias entre el antiguo archivo de rutas y el nuevo.
# $(date +%d%m%g): formato de fecha (diamesaño) utlizado en el backup del archivo antiguo.

for dominio in $@
do

        find /home/ulysse/datos/www/$dominio/ -type f -name '*.jpeg' -print | sed -e 's/.*/mmapfile &/' > /etc/apache2/$dominio.mmap.conf.new;
sleep 1
        find /home/ulysse/datos/www/$dominio/ -type f -name '*.jpg' -print | sed -e 's/.*/mmapfile &/' >> /etc/apache2/$dominio.mmap.conf.new;
sleep 1
        find /home/ulysse/datos/www/$dominio/ -type f -name '*.gif' -print | sed -e 's/.*/mmapfile &/' >> /etc/apache2/$dominio.mmap.conf.new;
sleep 1
        find /home/ulysse/datos/www/$dominio/ -type f -name '*.swf' -print | sed -e 's/.*/mmapfile &/' >> /etc/apache2/$dominio.mmap.conf.new;
sleep 1
        find /home/ulysse/datos/www/$dominio/ -type f -name '*.png' -print | sed -e 's/.*/mmapfile &/' >> /etc/apache2/$dominio.mmap.conf.new;
sleep 1
        find /home/ulysse/datos/www/$dominio/ -type f -name '*.ico' -print | sed -e 's/.*/mmapfile &/' >> /etc/apache2/$dominio.mmap.conf.new;
sleep 1
        find /home/ulysse/datos/www/$dominio/ -type f -name '*.bmp' -print | sed -e 's/.*/mmapfile &/' >> /etc/apache2/$dominio.mmap.conf.new;
sleep 1

        # Si existe ese archivo lo compara con el creado.

        if [ -e /etc/apache2/$dominio.mmap.conf ]; then
                diferencia=$(diff -q /etc/apache2/$dominio.mmap.conf /etc/apache2/$dominio.mmap.conf.new)

                # Si son diferentes el antiguo lo copia en /tmp, el nuevo lo renombra al antiguo
                # y recarga Apache.

                if [ ! -z "$diferencia" ]; then
                        mv /etc/apache2/$dominio.mmap.conf /tmp/$dominio.mmap.conf.$(date +%d%m%g)
                        mv /etc/apache2/$dominio.mmap.conf.new /etc/apache2/$dominio.mmap.conf
                        /etc/init.d/apache2 reload

                # Si no son diferentes borra el nuevo creado.

                else
                        rm /etc/apache2/$dominio.mmap.conf.new
                fi

        # Si no existe lo renombra para ser utilizado en el virtual host y recarga Apache.

        else
                mv /etc/apache2/$dominio.mmap.conf.new /etc/apache2/$dominio.mmap.conf
                /etc/init.d/apache2 reload
        fi
done
crontab -l
30 7 * * * /home/ulysse/scripts/apache/mmap.sh

Configurar los modulos que tenemos habilitados:

cp dir.conf /root/etc/apache2/mods-enabled/dir.conf.`date +%d%m%g`

Cambiar en dir.conf lo siguiente:

< DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
> DirectoryIndex index.php index.html

mime.conf
Las lineas precedidas por el simbolo "<" salen del fichero, las lineas precedidas por ">", son nuevas lineas que se incluyen en el fichero.

< AddLanguage cs .cz .cs
< AddLanguage da .dk
< AddLanguage de .de
< AddLanguage el .el

> #AddLanguage cs .cz .cs
> #AddLanguage da .dk
> #AddLanguage de .de
> #AddLanguage el .el

< AddLanguage eo .eo

> #AddLanguage eo .eo

< AddLanguage et .et

> #AddLanguage et .et

< AddLanguage he .he
< AddLanguage hr .hr
< AddLanguage it .it
< AddLanguage ja .ja
< AddLanguage ko .ko
< AddLanguage ltz .ltz
< AddLanguage nl .nl
< AddLanguage nn .nn
< AddLanguage no .no
< AddLanguage pl .po
< AddLanguage pt .pt
< AddLanguage pt-BR .pt-br
< AddLanguage ru .ru
< AddLanguage sv .sv
< AddLanguage zh-CN .zh-cn
< AddLanguage zh-TW .zh-tw

> #AddLanguage he .he
> #AddLanguage hr .hr
> #AddLanguage it .it
> #AddLanguage ja .ja
> #AddLanguage ko .ko
> #AddLanguage ltz .ltz
> #AddLanguage nl .nl
> #AddLanguage nn .nn
> #AddLanguage no .no
> #AddLanguage pl .po
> #AddLanguage pt .pt
> #AddLanguage pt-BR .pt-br
> #AddLanguage ru .ru
> #AddLanguage sv .sv
> #AddLanguage zh-CN .zh-cn
> #AddLanguage zh-TW .zh-tw

< AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen
< AddCharset ISO-8859-3 .iso8859-3 .latin3
< AddCharset ISO-8859-4 .iso8859-4 .latin4
< AddCharset ISO-8859-5 .iso8859-5 .cyr .iso-ru
< AddCharset ISO-8859-6 .iso8859-6 .arb .arabic
< AddCharset ISO-8859-7 .iso8859-7 .grk .greek
< AddCharset ISO-8859-8 .iso8859-8 .heb .hebrew
< AddCharset ISO-8859-9 .iso8859-9 .latin5 .trk
< AddCharset ISO-8859-10 .iso8859-10 .latin6
< AddCharset ISO-8859-13 .iso8859-13
< AddCharset ISO-8859-14 .iso8859-14 .latin8

> #AddCharset ISO-8859-2 .iso8859-2 .latin2 .cen
> #AddCharset ISO-8859-3 .iso8859-3 .latin3
> #AddCharset ISO-8859-4 .iso8859-4 .latin4
> #AddCharset ISO-8859-5 .iso8859-5 .cyr .iso-ru
> #AddCharset ISO-8859-6 .iso8859-6 .arb .arabic
> #AddCharset ISO-8859-7 .iso8859-7 .grk .greek
> #AddCharset ISO-8859-8 .iso8859-8 .heb .hebrew
> #AddCharset ISO-8859-9 .iso8859-9 .latin5 .trk
> #AddCharset ISO-8859-10 .iso8859-10 .latin6
> #AddCharset ISO-8859-13 .iso8859-13
> #AddCharset ISO-8859-14 .iso8859-14 .latin8

< AddCharset ISO-8859-16 .iso8859-16 .latin10
< AddCharset ISO-2022-JP .iso2022-jp .jis
< AddCharset ISO-2022-KR .iso2022-kr .kis
< AddCharset ISO-2022-CN .iso2022-cn .cis
< AddCharset Big5 .Big5 .big5 .b5
< AddCharset cn-Big5 .cn-big5

> #AddCharset ISO-8859-16 .iso8859-16 .latin10
> #AddCharset ISO-2022-JP .iso2022-jp .jis
> #AddCharset ISO-2022-KR .iso2022-kr .kis
> #AddCharset ISO-2022-CN .iso2022-cn .cis
> #AddCharset Big5 .Big5 .big5 .b5
> #AddCharset cn-Big5 .cn-big5

< AddCharset CP866 .cp866
< AddCharset KOI8 .koi8
< AddCharset KOI8-E .koi8-e
< AddCharset KOI8-r .koi8-r .koi8-ru
< AddCharset KOI8-U .koi8-u
< AddCharset KOI8-ru .koi8-uk .ua
< AddCharset ISO-10646-UCS-2 .ucs2
< AddCharset ISO-10646-UCS-4 .ucs4
< AddCharset UTF-7 .utf7

> #AddCharset CP866 .cp866
> #AddCharset KOI8 .koi8
> #AddCharset KOI8-E .koi8-e
> #AddCharset KOI8-r .koi8-r .koi8-ru
> #AddCharset KOI8-U .koi8-u
> #AddCharset KOI8-ru .koi8-uk .ua
> #AddCharset ISO-10646-UCS-2 .ucs2
> #AddCharset ISO-10646-UCS-4 .ucs4
> #AddCharset UTF-7 .utf7

< AddCharset UTF-16BE .utf16be
< AddCharset UTF-16LE .utf16le

> #AddCharset UTF-16BE .utf16be
> #AddCharset UTF-16LE .utf16le

< AddCharset UTF-32BE .utf32be
< AddCharset UTF-32LE .utf32le
< AddCharset euc-cn .euc-cn
< AddCharset euc-gb .euc-gb
< AddCharset euc-jp .euc-jp
< AddCharset euc-kr .euc-kr

> #AddCharset UTF-32BE .utf32be
> #AddCharset UTF-32LE .utf32le
> #AddCharset euc-cn .euc-cn
> #AddCharset euc-gb .euc-gb
> #AddCharset euc-jp .euc-jp
> #AddCharset euc-kr .euc-kr

< AddCharset EUC-TW .euc-tw
< AddCharset gb2312 .gb2312 .gb
< AddCharset iso-10646-ucs-2 .ucs-2 .iso-10646-ucs-2
< AddCharset iso-10646-ucs-4 .ucs-4 .iso-10646-ucs-4
< AddCharset shift_jis .shift_jis .sjis

> #AddCharset EUC-TW .euc-tw
> #AddCharset gb2312 .gb2312 .gb
> #AddCharset iso-10646-ucs-2 .ucs-2 .iso-10646-ucs-2
> #AddCharset iso-10646-ucs-4 .ucs-4 .iso-10646-ucs-4
> #AddCharset shift_jis .shift_jis .sjis

< AddType text/html .shtml
< AddOutputFilter INCLUDES .shtml

> #AddType text/html .shtml
> #AddOutputFilter INCLUDES .shtml

Configurar negotiation.conf

cp negotiation.conf /root/etc/apache2/mods-available/negotiation.conf.`date +%d%m%g`

vi negotiation.conf

#LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
LanguagePriority es en ca fr

Configurar mod_expires

cd /etc/apache2/mods-enabled
ln -s ../mods-available/expires.load

Crear el fichero /etc/apache2/mods-available/expires.conf con el siguiente contenido:

<IfModule mod_expires.c>
ExpiresActive on

ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType application/pdf "access plus 1 month"
ExpiresByType audio/x-wav "access plus 1 month"
ExpiresByType audio/mpeg "access plus 1 month"
ExpiresByType video/mpeg "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/quicktime "access plus 1 month"
ExpiresByType video/x-ms-wmv "access plus 1 month"
ExpiresByType text/css "access plus 1 hour"
ExpiresByType text/javascript "access plus 1 hour"

ExpiresByType image/png "access plus 1 months"
ExpiresByType image/gif "access plus 1 months"
ExpiresByType image/jpg "access plus 1 months"
ExpiresByType application/x-shockwave-flash "access plus 1 months"
ExpiresDefault "access plus 1 days"
</IfModule>

Enlazarlo desde el directorio de modulos habilitados:

cd /etc/apache2/mods-enabled
ln -s ../mods-available/expires.conf

Configurar mod_headers

cd /etc/apache2/mods-enabled
ln -s ../mods-available/headers.load

Crear el fichero /etc/apache2/mods-available/headers.conf con el siguiente contenido:

#1 MONTH
<FilesMatch "\.(ico|pdf|flv)$">
Header set Cache-Control "max-age=2419200, public"
</FilesMatch>
#1 MONTH
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=2419200, public"
</FilesMatch>
#2 DAYS
<FilesMatch "\.(xml|txt|css|js)$">
Header set Cache-Control "max-age=172800"
</FilesMatch>
#NEVER CACHE
<FilesMatch "\.(html|cgi|php|htm)$">
Header set Expires "Thu, 01 Dec 2003 16:00:00 GMT"
Header set Cache-Control "no-store, no-cache, must-revalidate"
Header set Pragma "no-cache"
</FilesMatch>

Enlazarlo desde el directorio de modulos habilitados:

cd /etc/apache2/mods-enabled
ln -s ../mods-available/headers.conf

En setenvif.conf no hace falta configurar nada.

En php5.conf, no tenemos que configurar nada.

Si decidimos usar cgi's, sera bueno tenerlos todos guardados en un sitio conocido :)

mkdir -p /home/ulysse/scripts/apache/cgi-bin;
cp /usr/lib/cgi-bin/* /home/ulysse/scripts/apache/cgi-bin/;
chown root:root /home/ulysse/scripts/apache/cgi-bin/*;
chmod 755 /home/ulysse/scripts/apache/cgi-bin/*;
mv /usr/lib/cgi-bin /usr/lib/cgi-bin.`date +%d%m%g` && ln -s /home/ulysse/scripts/apache/cgi-bin /usr/lib/cgi-bin;

En /etc/php5/apache2/php.ini hablar con el desarrollador para asegurarse que contiene todos los parametros correctos para la ejecución de la aplicación, prestando especial atención a deshabilitar los errores de php en el navegador, ya que no queremos darle información a los usuarios de como esta configurada nuestra aplicación internamente, passwords de conexión a la base de datos etc, etc.

« Linux

Si no se indica lo contrario, el contenido de esta página se ofrece bajo Creative Commons Attribution-ShareAlike 3.0 License