www.desarrolloweb.com
Instalación y configuración de
Apache
perchild: Módulo multiproceso que permite a los procesos demonio servir las peticiones que
se asignan a distintos id de usuario.
Módulos adicionales:
mod_access: proporciona control de acceso basándose en el nombre del host del cliente, su
dirección IP u otras características de la petición del cliente.
mod_actions: este módulo se utiliza para ejecutar Scripts CGI, basándose en el tipo de medio
o el método de petición.
mod_alias: proporcionado para mapear diferentes partes del sistema de ficheros del servidor
en el árbol de documentos del servidor, y para redirección de URL's.
mod_dir: Proporcionado para redirecciones y para servir los ficheros de listado de directorios.
mod_echo: Un servidor simple de echo para ilustrar los módulos del protocolo.
mod_env: modificación del entorno que se envia a los scripts CGI y las páginas SSI.
mod_mime: asocia las extensiones de peticiones de los ficheros con el comportamiento del
fichero (manejadores y filtros) y contenido (tipos mime, idioma, juego de caracteres y
codificación).
mod_mime_magic: determina el tipo MIME de un fichero mirando unos pocos bytes del
contenido.
mod_so: carga del código ejecutable y los módulos en al iniciar o reiniciar el servidor.
mod_speling: intenta corregir las URL mal puestas por los usuarios, ignorando las
mayúsculas y permitiendo hasta una falta.
mod_ssl: criptografía avanzada utilizando los protocolos Secure Sockets Layer y Transport
Layer Security.
mod_suexec: permite a los scripts CGI ejecutarse con un nombre y grupo específico.
Descarga de Apache
Una vez en la página de descarga debemos buscar la última versión estable o la versión que
recomendada. El servidor está disponible para sistemas Unix o Windows, por lo que nos
ofrecerán diversas opciones de descarga, incluso para obtener el código fuente del programa.
Si deseamos instalarlo en un sistema Windows, necesitamos obtener el archivo Win-32 Binary,
que es un instalador Windows.
Instalación
Una vez descargado, debemos instalarlo en nuestro sistema, ejecutando el archivo obtenido.
Daremos paso a un asistente que nos guiará en el proceso de instalación del servidor. Durante
el proceso nos preguntará el nombre del dominio y del servidor, que podemos rellenar con
"localhost". Nos pedirá también una dirección de correo, que podemos rellenar con cualquiera
que deseemos. También nos pregunta si deseamos que el servidor responda en el puerto 80
para todos los usuarios o si deseamos que sólo se active para el usuario actual en el puerto
8080, cuando se inicie manualmente. Lo normal es que lo activemos para todos los usuarios.
Con estos datos queda configurado el Apache inicialmente. En cualquier momento podemos
editarlos a nuestro gusto o necesidades. Para ello deberemos editar el fichero httpd.conf, que
se encuentra en el directorio de instalación de Apache, que hemos indicado durante el proceso
de instalación, más concretamente, en el subdirectorio conf. En adelante en este manual
podremos aprender las configuraciones más habituales.
Nota: Debemos ir con cuidado de no tener otro servidor configurado para trabajar en el puerto 80 (por
ejemplo el servidor IIS que viene en las versiones profesionales o servidor de Windows). En caso de tener
en marcha otro servidor web durante la instalación, puede fallar y mostrarnos un mensaje de error que
indique esto precisamente, es decir, que no podemos tener dos servidores a la vez escuchando en el
puerto 80.
Para solucionar el problema basta con que paremos el IIS o el otro servidor que esté funcionando. El IIS
lo podemos parar accediendo a Panel de control - Herramientas administrativas - Servicios de Internet
Information Server. La pantalla que sale es la consola de administración del sistema. Aquí debemos
desplegar el árbol de la izquierda, pulsando sobre el signo "+", hasta que encontremos el "Sitio web
predeterminado". Nos ponemos encima de él y apretamos el botón de STOP que está situado en la barra
de herramientas de la consola de administración. También podemos encontrar una opción para detener el
servicio pulsando con el botón derecho en el "Sitio web predeterminado".
Una vez instalado, el Apache se pone en funcionamiento. Para controlar el Apache podemos
encontrar en el botón de inicio, sección programas, un nuevo grupo llamado "Apache HTTP
Server", con iconos para detener el servidor, ponerlo en marcha, editar el archivo de
configuración httpd.conf o para ver los logs de acceso. También podemos ver en la barra de
tareas un nuevo icono que indica que el Apache está funcionando y que ofrece opciones para
controlarlo si pulsamos sobre él.
Para comprobar que el servidor está activo y funciona correctamente podemos abrir un
explorador y probar a acceder a la URL http://localhost, que es nuestro propio servidor. Si todo
ha ido bien observaremos el mensaje de bienvenida del servidor con algo como "Funciono! ¡El
servidor Apache ha sido instalado en este equipo!".
error: ficheros con los mensajes de error del servidor, en varios lenguajes.
htdocs: directorio raíz por defecto del servidor (Se guardan las páginas Web).
icons: directorio donde se encuentran los iconos que utiliza el servidor (entre otras cosas para
mostrar estructuras de directorios).
logs: directorio donde se almacenan los registros de acceso y errores del servidor.
El fichero httpd.conf
El fichero httpd.conf es el fichero principal de configuración del Apache, se encuentra dentro
del directorio Conf, en el directorio de instalación del Apache.
En primer lugar hay que destacar que el fichero está dividido en tres secciones, que son:
1º Parámetros globales
2º Directivas de Funcionamiento
3º Host Virtuales
<Directory> : Los parámetros que se encuentran dentro de esta sección, sólo se aplicarán a
el directorio especificado y a sus subdirectorios.
<DirectoryMatch>: Igual que Directory, pero acepta en el nombre del directorio expresiones
regulares.
<Files>: Los parámetros de configuración proporcionan control de acceso de los ficheros por
su nombre.
<FilesMatch>: Igual que Files, pero acepta expresiones regulares en el nombre del fichero.
<LocationMatch>: Igual que Location, pero acepta expresiones regulares en el nombre del
fichero.
Algunas veces las directivas de funcionamiento de las secciones anteriores se pueden cruzar en
cuyo caso tienen el siguiente orden de preferencia:
También hay que destacar, que el fichero contiene un montón de comentarios para su correcta
utilización, las líneas comentadas aparecen con el símbolo #.
ServerRoot: especifica la ubicación del directorio raíz donde se encuentra instalado el Apache,
a partir del cual se crea el árbol de directorios comentado anteriormente. Esta directiva no
debería cambiar a no ser que se mueva la carpeta de instalación de apache a otro directorio.
Se encuentra disponible a través del módulo Core.
PidFile: ubicación del fichero que contendrá el número de identificación del proceso cuando se
encienda el servidor. Se encuentra disponible a través de varios módulos beos, leader,
mpm_winnt, mpmt_os2, perchild, prefork, threadpool ó worker
Si el valor es muy pequeño provocará que algunos usuarios no puedan visualizar la página
debido a que el número máximo de conexiones persistentes se ha superado, mientras que si
se establece un valor muy grande se estarán utilizando muchos recursos de la máquina. Se
encuentra disponible a través del módulo Core.
Listen: esta directiva permite especificar que puerto se utilizará para antender las peticiones.
Por defecto se utiliza el puerto 80 (www), también permite especificar que direcciones IP
atenderá, por defecto todas. Para atender dos direcciones IP distintas, con distintos puerto, se
utilizaría:
Listen 192.168.255.5:80
Listen 192.168.255.8:8080
LoadModule: Directiva que sirve para cargar módulos que incluyen distintas funcionalidades.
La sintaxis es:
La sintaxis es:
DocumentRoot: la carpeta raíz que se ubica en el servidor, desde la que se servirán los
documentos. Por defecto, todas las peticiones, tendrán como raíz esta carpeta, a no ser que se
utilicen alias (directorios virutales en IIS)
Por defecto, la carpeta raíz es la carpeta Htdocs, que se encuentra en la carpeta de instalación
del Apache. No puede estar dentro de ninguna sección.
Si se cambia este directorio por otro, es muy importante que se ponga el nuevo valor, no solo
en esta línea, sino también en la sección <Directory> en la que se establecen los parámetros
de configuración de este directorio.
Esta línea empieza por " <Directory " seguido de la carpeta raíz que originalmente hay en
DocumentRoot.
DirectoryIndex: especifica el fichero por defecto que buscará en cada directorio, en caso de
que no se especifique ninguno. Por defecto es index.html. Es decir, que si por ejemplo se pone
en el navegador: www.desarrolloweb.com el servidor por defecto servirá
www.desarrolloweb.com/index.html
La directiva se puede encontrar fuera de cualquier sección, dentro de una sección o dentro de
un fichero .htaccess.
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
DefaultType: tipo mime que se servirá por defecto en caso de no conocer la extensión del
fichero que se está sirviendo. Por defecto, se indicará que se sirve texto plano, con el valor
text/plain. La directiva se puede encontrar fuera de cualquier sección, dentro de una sección o
dentro de un fichero .htaccess.
ErrorLog: especifica la ubiación del fichero que contiene el registro de errores, por defecto en
la carpeta logs. Esta directiva sólo se puede encontrar fuera de cualquier sección.
Valor de más a menos son: debug, info, notice, warn, error, crit, alert, emerg
LogFormat: la directiva permite definir el formato que se utilizará para almacenar los
registros. A cada formato se le puede asignar un nombre, utilizándolo luego para crear
distintos tipos de ficheros de registro. Pueden existir varios logFormat distintos.
Sintaxis:
Sintaxis:
FancyIndexing: que muestra los nombres de los ficheros, con iconos etc..
FoldersFirst: Hace que primero se muestren los directorios. Esta opción sólo se puede
establecer en el caso de que FancyIndexing este activa.
Esta directiva se puede encontrar dentro del fichero .htaccess, dentro de una sección
<Directory> y fuera de cualquier otra.
Sintaxis:
Ejemplo:
AddIconByEncoding/icons/compressed.gif x-compress
Esta directiva se puede encontrar dentro del fichero .htaccess, dentro de una sección
<Directory> y fuera de cualquier otra.
AddIconByType: Esta directiva asocia un icono a un fichero dependiendo del un tipo mime,
de forma que cuando la directiva fancyIndexing este activada, se mostrará al lado del fichero
el icono correspondiente.
Sintaxis:
Ejemplo:
Ambas directivas se pueden encontrar dentro de el fichero .htaccess, dentro de una sección
<Directory> o fuera de cualquier otra.
AddDescription: Esta directiva permite asociar una descripción a un tipo de fichero, que se
mostrará al listar un directorio. Esta directiva se puede encontrar dentro de el fichero
.htaccess, dentro de una sección <Directory> o fuera de cualquier otra.
Sintaxis:
1. Esta directiva se puede encontrar dentro de cualquier sección y en los ficheros .htaccess.
Hay que tener en cuenta que si el texto de error se envia a Internet Explorer, este tendrá que
tener al menos 512 Bytes, porque sino Internet Explorer mostrará su propia página de error.
Sintaxis:
Esta directiva se puede encontrar tanto dentro del fichero .htaccess, dentro de la sección
<Directory> o fuera de cualquier otra sección.
Ejemplo:
CacheRoot: establece el directorio donde se encontrarán los ficheros de la cache del Apache.
CacheDefaultExpire: Número de horas por defecto a partir de las cuales un fichero caduca.
Se aplica en aquellos casos en los que no se puede determinar la hora de creación del fichero.
Todas las directivas de la caché, deben encontrarse fuera de cualquier sección. Esta directiva
no se puede encontrar dentro de ninguna sección.
Alias
Sintaxis:
Alias nombreFicticio ubicacionReal
Ejemplo:
Alias /manual/php "c:\php"
AliasMatch
Sintaxis:
AliasMatch Expresión regular ubicación
Seguridad en Apache I
Cuando un servidor apache recibe una petición de una página web, antes de devolver el
resultado, lleva a cabo varias acciones para verificar que la petición esta autorizada.
Las distintas acciones que lleva a cabo para verificar la validez de la aplicación, se pueden
agrupar en tres tipos: Autentificación, Autorización y Control de Acceso.
La autorización es el proceso por el cual se verifica que un usuario con una identidad conocida,
tiene acceso al recurso solicitado. Para llevar a cabo esta acción, se suelen utilizar listas de
permisos en las cuales se enumeran cada una de las acciones que puede realizar un usuario, o
las que no puede hacer. Normalmente, para simplificar la gestión de estos ficheros, los
usuarios se suelen unir en grupos proporcionando los permisos al grupo.
El control de acceso es el proceso por el cual se verifica que la máquina desde la que se ha
hecho la petición, tiene acceso al recurso. Los controles de acceso se utilizan para limitar y
controlar las máquinas que tienen acceso a un recurso independientemente del usuario que
accede, ya que estos controles se llevan a cabo antes de que se realice el proceso de
autentificación.
En todo caso y para poder llevar a cabo la configuración de las tres características aquí
enumeradas, autentificación, autorización y control de acceso, es necesario tener la directiva
AllowOverride con el valor AuthConfig, para así permitir el uso de las distintas directivas de
autentificación.
Para configurar el servidor apache para que sea capaz de autentificar a los usuarios y verificar
la autorización del mismo al recurso solicitado, es necesario realizar las siguientes acciones:
1. Crear un fichero con usuarios
2. Crear un fichero con grupos (si es necesario)
3. Definir las directivas en el fichero de configuración o mediante un fichero .htaccess
Es recomendable que tanto los ficheros de usuarios como los de grupos, se encuentren
almacenados fuera de los directorios publicados, para que de esta forma nadie pueda
descargarlos. Asimismo, solo el usuario root debería estar autorizado a escribir en él, mientras
que solo el usuario que ejecuta el servicio web, debería estar autorizado para leerlo.
El fichero de grupos se puede crear manualmente, pero el fichero con los usuarios es
recomendable crearlo mediante la utilidad htpasswd, que se encuentra en la carpeta con los
binarios de apache.
El flag -c se utiliza para crear un fichero nuevo, por lo que sólo se deberá poner la primera vez
que se crea el fichero, sino lo borrará.
Los módulos que intervienen en la autentificación y autorización son los de core y mod_auth.
Las directivas de mod_auth necesarias para configurar la autenticación y autorización son las
siguientes:
• AuthUserFile: siver para especificar la ruta donde se almacenará el fichero de usuarios.
• AuthGroupFile: sirve para especificar la ruta donde se almacenará el fichero de grupos.
Las directivas de core necesarias para complementar la configuración del módulo son:
• AuthType: selecciona el tipo de autentificación de usuarios que se utilizará para
autentificar a un usuario. Puede variar por directorio. Los valores posibles son Basic y
Digest. Con Basic, la transferencia de las claves se hará sin cifrar, y con digest se harán
cifradas.
• AuthName: especifica un nombre del dominio para el cual se solicita el acceso, este
nombre figurará en la pantalla donde se pide la clave, y a su vez servirá para que el
cliente identifique la contraseña que debe utilizar al enviar una petición a un área
determinada.
• Require: selecciona los usuarios que pueden acceder a un área determinada, los
usuarios se pueden determinar a través de nombres o grupos.
Al hacerlo, pedirá que se introduzca la clave, y esta será codificada, escribiendo el fichero.
2º Crear un nuevo fichero, en la misma ubicación que "ruta", que se llamará "groups" en la
que se almacenarán los grupos, por ahora uno, para ello escribir la siguiente línea y guardar el
fichero:
usuariosAutenticados: Carlos
De esta forma, debería tener un fichero que se llame passwords, y que contenga una línea con
los datos del usuario Carlos, y un fichero, con nombre groups, que contiene una línea
definiendo un grupo llamado usuariosAutenticados, del que sólo el usuario Carlos forma parte.
3º Crear un fichero con el nombre .htaccess en la carpeta que se quiere proteger, y escribir las
siguientes líneas y guardar el fichero:
AuthType Basic
AuthName "ServidorPruebasCarlos"
AuthUserFile /ruta/passwords
AuthGroupFile /ruta/groups
Require group usuariosAutenticados
Por este motivo existe el mod_auth_mysql, este módulo permite gestionar la autentificación y
autorización, almacenando los usuarios y los grupos en tablas de Mysql, de forma que incluso
se pueden gestionar mediante un panel de control escrito en php.
Para utilizar el módulo es necesario disponer de al menos una tabla donde se almacenen los
usuarios y otra donde se almacenen los grupos. Para ello se puede crear una tabla usuarios
con los campos, nombre y password, y otra tabla llamada grupos con los campos grupo,
usuario, almacenando una entrada por cada usuario que tenga un grupo.
La configuración es la siguiente:
Para configurar el módulo será necesario establecer los valores de las siguientes directivas del
módulo:
Además será necesario establecer las siguiente directivas de core para su correcto
funcionamiento:
Las directivas con las que cuenta el módulo para permitir o denegar el acceso son:
• Allow: controla los servidores que tendrán acceso al contenido, por ejemplo:
Allow from
Permite el acceso desde desarrolloweb.com
desarrolloweb.com
Allow from 192.168.0.1 Permite el acceso desde 192.168.0.1
Allow from 192.168 Permite el acceso desde todas las direcciones Ip que comienzan por 1
Allow from all Permitir todas
• Deny: controla los servidores a los que se denegará el acceso, por ejemplo:
Deny from
Deniega el acceso desde desarrolloweb.com
desarrolloweb.com
Deny from 192.168.0.1 Deniega el acceso desde 192.168.0.1
Deny from 192.168 Deniega el acceso desde todas las direcciones Ip que comienzan por 1
Deny from all Denegar todas
• Order: determina el orden en el que se leerán los permisos, por ejemplo para leer
primero los permitidos y luego los no permitidos se pondrá "Allow,Deny" en este caso si
un servidor esta en la lista de permitidos, y en la de denegados, el acceso al mismo
será denegado, ya que la entrada dentro de la opción Deny sobrescribirá la de la
entrada Allow.
Hay que tener en cuenta que el uso de order junto con Allow from all ó Deny from all, permite
especificar configuraciones como, permitir desde una máquina x y denegar del resto, de una
forma muy sencilla.
que se utilizan números IP ó nombres de máquinas. Por ejemplo, utilizando Allow from
env=entrada permitirá el acceso a todas las peticiones que tengan definida la variable de
entorno "entrada".
Mediante el uso conjunto de las directivas Allow, Deny, Order y SetEnvIf se puede restringir el
acceso a un sitio dependiendo del tipo de navegador. Para realizarlo simplemente basta con
crear una variable de entorno dependiendo del tipo del navegador, y permitir el acceso a las
peticiones que cuenten con esta variable de entorno denegándoselo al resto.
Para ello la configuración necesaria es la siguiente:
En la primera línea se especifica que se creará una variable de entorno llamada entrar cuando
el navegador sea el motor de indexación de google.
En el caso de que entre el motor de indexación de google, primero se leerá la línea en que se
deniegan todas las peticiones, para a continuación leer la línea en la línea en la que se permite
el acceso desde las peticiones que tienen definida la variable entrar, como el navegador que lo
hace es el googlebot, esta variable estará definida y entrará.
En el caso en que la petición sea realizada por cualquier otro navegador, primero se leerá la
línea en la que se deniegan las peticiones, y como no satisface la línea en que lo permite, no
entrará
¿ Alguna vez has implementado clases que gestionaran directamente datos de configuración ?
Si la respuesta es afirmativa, seguramente hayas reinventado la rueda.
En este pequeño tutorial, voy a nombrar un API que a mi personalmente me parece de una
enorme utilidad y potencia para la gestión de datos de configuración. Se trata de Apache
Jakarta Commons Configuration.
Algunos ejemplos
Antes de nada, deseo resaltar que este tutorial es sólo una introducción al API, y que debe
documentarse en la Web oficial del API para ver todas las posibilidades que nos proporciona
este API.
Ejemplo 1
app.windows.properties:
userform.title=Gestión de usuarios
userform.width=320
userform.height=200
userform.state=normal
try {
// Leemos los datos de configuración. El fichero debe estar en el mismo directorio que la
aplicación.
PropertiesConfiguration config = new PropertiesConfiguration("app.windows.properties");
Ejemplo 2
Ahora vamos a ver las posibilidades de este API para tratar con propiedades Jerárquicas en
formato xml.
app.windows.properties.xml
<dimension>
<width>800</width>
<height>600</height>
</dimension>
<state>maximized</state>
</mainmdi>
<userform>
<title>Gestión de Usuarios</title>
<dimension>
<width>800</width>
<height>600</height>
</dimension>
<state>normal</state>
</userform>
<printer.form>
<dimension>
<width>320</width>
<height>200</height>
</dimension>
</printer.form>
<languages default="Castellano">
<language>Castellano</language>
<language>English</language>
<language>French</language>
</languages>
</gui>
Ahora podemos acceder a los datos de la siguiente forma. El ejemplo es autodescriptivo y está
comentado.
try {
// Leemos los datos de configuración. El fichero debe estar en el mismo directorio que la aplicación.
XMLConfiguration config = new XMLConfiguration("app.windows.properties.xml");
Este API también nos da la posibilidad de que se recargen automáticamente los datos de
configuración sobre el objeto Configuration en caso de que estos hayan sido modificados.
Para habilitar esta característica deberá indicarlo mediante la siguiente línea de código:
config.setReloadingStrategy(new FileChangedReloadingStrategy());
Conclusiones
A mi juició este API es más completo, potente y flexible que el resto de APIS o métodos para
gestionar datos de configuración.
Cuando utilizamos objetos Properties para gestionar las propiedades, debemos realizar
conversiones de tipos de datos, con este API nos ahorramos ese trabajo.
Por comentar algo negativo, este API depende de otros subprojectos de Jakarta, por lo que
debemos incluir sus JARs asociados si queremos usarlo. Por ejemplo, para usar las funciones
básicas, el API depende de:
• Apache Jakarta Commons Lang
• Apache Jakarta Commons Collections
• Apache Jakarta Commons Loggin
No tiene sentido poner una cerradura mas resistente a tu puerta si dejas la ventana
abierta.Del mismo modo si no tenemos los ultimos parches de seguridad instalado no tendría
sentido continuar con la optimización de seguridad.
Si tienes un recurso al que deba solamente tener acceso alguna red, o IP en concreto puedes
configurarlo en Apache. Por ejemplo si deseas restringir el acceso a tu Intranet para permitir
solamente la red 176.16:
Order Deny,Allow
Deny from all
Allow from 176.16.0.0/16
o por IP:
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Por defecto muchas instalaciones de Apache muestran el número de versión que está
funcionando, el sistema operativo y un informe de módulos de Apache están instalados en el
servidor. Los usuario maliciosos pueden utilizar esta información para atacar tu servidor.
ServerSignature Off
ServerTokens Prod
El ServerSignature aparece en la parte inferior de las páginas generadas por apache tales
como los famosos errores 404.
Algunas versiones de Apache corren bajo el usuario nobody, esto compromete mucho su
seguridad por lo tanto haz lo siguiente:
User apache
Group apache
Utiliza el mod_security
El mod_security es un módulo estupendo de Apache escrito por Ivan Ristic, el autor de Apache
Security de O'Reilly.
Apache viene por defecto instalado con un serie de módulos.Debes echarle un vistazo a la
documentación de Apache y ver para que sirve cada uno de ellos, y de esta manera te darás
cuenta de que hay algunos que no son útiles en tu servidor.
Busca en httpd.conf las lineas que contengan LoadModule. Para deshabilitar el módulo debes
agregar un # al principio de la línea, para que de esta forma pase a ser un comentario. Para
buscar los módulos prueba con:
Aquí están algunos módulos que se instalan por defecto pero a menudo no son necesarios:
mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex.
Asegurarte de que los archivos a los que se accede son los deseados
No deseamos que se pueda acceder a los directorios que no tengan permisos para ello,
supongamos que el directorio raiz para nuestras webs es /web, la configuración óptima debera
ser la siguiente:
Order Deny,Allow
Deny from all
Options None
AllowOverride None
Order Allow,Deny
Allow from all
Esto lo puedes hacer con las opciones de directiva dentro de la etiqueta directorio tiene dos
posibles valores none o indexes.
Options -Indexes
Esto también se hace con las opciones de directiva dentro de la etiqueta directorio tiene dos
posibles valores none o include.
Options -Includes
Si no necesitas la ejecución de CGI por algún motivo en concreto desacrivalos se hace con las
opciones de directiva dentro de la etiqueta directorio tiene dos posibles valores none o
ExecCGI.
Options -ExecCGI
De nuevo se configura con las opciones de directiva dentro de la etiqueta directorio tiene dos
posibles valores none o FollowSymLinks.
Options -FollowSymLinks
Options None
Si solamente deseas desactivar algunas en concreto, separalas con un espacio en las opciones
de directiva:
AllowOverride None
Otra opción interesante sería bloquear la descarga de todos los archivos que comienzen con .ht
por ejemplo, se haría de la siguiente manera:
AccessFileName .httpdoverride
Order allow,deny
Deny from all
Satisfy All
Por el defecto el tiempo de espera es de 300 segundos. Puedes disminuirlo por seguridad para
prevenir ataques de esta manera:
Timeout 45
Apache tiene varias directivas que permiten que limites el tamaño de una petición, esto puede
ser muy útil.
Una buena manera de comenzar es con la directiva LimitRequestBody. Esta directiva esta
fijada a ilimitado por defecto. Si estás permitiendo uploads de archivos que no sean mayores a
1MB, podrías fijar este ajuste a algo parecido a esto:
LimitRequestBody 1048576
Si no estás permitiendo uploads de archivos puedes fijarlo incluso a un tamaño más pequeño.
Conclusión
Espero que estas recomendaciones os hayan sido útiles y recuerda que el uso que le tienes
que dar depende en gran medida de los recursos que necesitas y de las caracteristicas de tu
servidor, antes de hacer cualquier cambio si no estas seguro documéntate y utiliza este artículo
unicamente como una referencía que te lleve a la solución más idonea.
En este artículo quiero explicar un error que hemos encontrado a la hora de configurar el
dominio, que luego he visto que es común a muchas personas que tienen el panel de control
Plesk como gestor de los recursos del servidor. Así pues voy a intentar expresar el problema y
la solución que hemos encontrado.
Plesk tiene una configuración propia de la directiva de PHP open_basedir (que se define en el
php.ini). Por la configuración de Plesk de open_basedir, sólo se pueden incluir archivos que
cuelguen del directorio de publicación del dominio, es decir el directorio httpdocs del dominio.
open_basedir = "/var/www/vhosts/eldominiotuyo.com/httpdocs:/tmp"
Por esa directiva no se pueden incluir archivos (con la función include o require de PHP) que
estén en otras carpetas o subcarpetas que cuelguen de las marcadas en el open_basedir.
Nosotros tenemos algunas carpetas que contienen códigos fuera del directorio de publicación y
no se estaban pudiendo incluir. Por eso nos estaba saliendo un error PHP como este:
(/var/www/vhosts/midominio.com/httpdocs:/tmp)
Luego he visto que este problema lo tienen también usuarios que tengan códigos incluidos en
frameworks para PHP como PEAR.
Una vez consultado con el servicio técnico de nuestro proveedor, nos aconsejaron mover todas
las carpetas al directorio de publicación, pero eso no es posible, por diversas razones. Pero nos
dieron la pista que el problema estaba relacionado con Plesk.
Finalmente buscando por Pear y Pesk en Google apareció un artículo muy interesante en una
página en ingles: HOWTO: Enable PEAR/Set open_basedir
En ese artículo está expresado paso a paso lo que se tiene que hacer, que voy a resumir en
español, para los lectores de desarrolloweb.com a los que les pase lo mismo.
Existe un archivo que Plesk utiliza para configurar cada dominio, de modo que no conviene
tocar el php.ini, porque eso afectaría a todo el servidor (y no siempre, porque algunas
directivas, como open_basedir, luego las sobreescribe Plesk en otros archivos aparte y por
mucho que se toquen en el php.ini no tendrá ningún efecto).
Hay un sitio donde se deben configurar los cambios del php.ini, específicos para cada dominio
alojado. En mi caso ese archivo de configuración no estaba creado, por lo que he tenido que
crearlo. El archivo de configuración específico para cada dominio está en el directorio
/var/www/vhosts/midominio.com/conf
Y el archivo que hay que crear allí, o modificar si es que ya existe es:
vhost.conf
<Directory "/var/www/vhosts/midominio.com/httpdocs">
php_admin_value open_basedir
"/var/www/vhosts/midominio.com/httpdocs:/tmp:/var/www/vhosts/midominio.com/directorio_includes
php_admin_value display_errors On
</Directory>
Se trata simplemente de definir el open_basedir marcando todos los directorios donde hay
archivos que se pretenden incluir desde PHP. (Con incluir un directorio te permite incluir
archivos de todos los subdirectorios que haya dentro)
En el código anterior puedes ver que hemos modificado otro parámetro del PHP:
display_errors On (Esto es para poder ver los errores directamente en la página, en vez del log
de errores, que es más cómodo por lo menos durante las pruebas y hasta migrar
definitivamente el dominio)
Ahora bien, ya sabemos donde tocar para configurar directivas PHP del php.ini específicas para
un dominio alojado. Podremos definir todas las directivas que se necesiten. Por ejemplo, otra
cosa que se puede necesitar cambiar es anular el safe_mode para un dominio en concreto y
eso se puede hacer desde este mismo archivo con la línea:
Para que los cambios tengan efecto aun tenemos que realizar un par de pasos.
Se trata primero de decirle a Plesk que actualice la configuración de un dominio. Esto se hace
con el comando:
Ahora también tendremos que reiniciar el apache, que se puede hacer con el comando:
/etc/init.d/httpd restart
Esto es todo, ahora debería funcionar. Esperamos que los lectores de DesarrolloWeb.com
tengan la misma suerte. A nosotros nos ha ido bien!