lunes, 2 de septiembre de 2013

Curso ASW3: Ajustes de una configuración más segura

Ajustes de una configuración más segura.

El fichero HTTTPD.CONF

Lo primero que tenemos que ajustar es que los directorios indicados en los DocumentRoot pertenezcan al usuario que usarán los procesos del servidor apache.
User apache
Group apache

Por ejemplo debemos ejecutar:
chown -R apache:apache /var/www/html

Si tenemos servidores virtuales, debemos realizar la misma operación sobre los directorios indicados en DocumentRoot de cada servidor virtual.
 
El usuario apache, o el que definamos en su lugar debe ser un usuario que no disponga de shell y no lo podamos utilizar para hacer login.
Revisa el fichero /etc/passwd y /etc/shadow.

Ocultemos información

Directivas que debemos establecer.
ServerTokens Prod
ServerSignature Off
Establecer los ErrorDocument correspondiente

Pongamos algunas limitaciones

Timeout entre 40 y 60. Indica los segundos que mantiene el servidor la sesión abierta antes de cerrarla. Si ponemos un numero alto favorecemos los ataques por DOS.

Limitemos las peticiones.

LimitRequestBody, suele venir a 0 para no limitar nada, pero es la encargada de indicar el límite en bytes permitidos para realizar cualquier petición. Si queremos limitarlo para impedir que se añadan ficheros maliciosos debemos tenerlo en cuenta para posibles usos en las aplicaciones instaladas ya que este será el límite permitido máximo.

LimitRequestFields, indica el número máximo de campos pertmitidos en una petición. Como se indica en el manual de Apache, rara vez necesitaremos más de 20.

LimitRequestFieldSize, es el tamaño máximo en bytes permitido en un campo de la petición de la cabecera HTTP. Se puede dejar en 4094

LimitRequestLine, es el tamaño en bytes de una linea de petición de la cabecera HTTP. Se puede dejar en 4094.

LimitXMLRequesBody, sirve para limitar el tamaño de una petición XML en el cuerpo de la petición. Si no queremos limitarla la dejaremos a 0.

<LimitExcept> esta directiva restringe el acceso a cualquier método no especificado en la directiva. Es preferible usar esta directiva en vez de <limit>. por ejemplo limita todos los métodos menos POST y GET.
<LimitExcept POST GET>
Require valid-user
</LimitExcept>

Concurrencia

MaxClients, limita el número de peticiones simultáneas que puede atender el servidor Apache.

MaxRequestPerChild, limita el número de peticiones que puede atender un subproceso, una vez atendidas el subproceso termina y se libera de memoria, reduciendo la carga del sistema. si lo dejamos a 0, nunca expira.

MaxSpareServers, indica el número de subprocesos parados que se desean tener, el valor por defecto suele ser 10. No conviene modificarlo si no se tiene suficiente conocimiento del servidor y su carga.

Min SpareServers, indica el número mínimo de procesos de espera que estárán definidos en el sistema.

Limitar los recursos del sistema.

También podemos utilizar directivas  para controlar el consumo que hace Apache de los recursos del sistema como CPU, MEMORIA y PROCESOS.
RLimitCPU limita los recursos de la CPU.
RLimitMEM limita los recurso de MEMORIA.
RLimitPROC limita el número de procesos simultáneos. 
Estos parámetros solo debes moficiarlos si tienes los conocimientos necesarios para gestionar completamente el servidor.
Puedes encontrar las especificaciones en el manual de Apache

Limitando los directorios

Como ya hemos comentado lo primero que tenemos que hacer es bloquear todos los permisos y luego conceder solo aquellos que necesitamos.
Configuración segura para el directorio raiz
<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>

Order indica que se analizará primero, si en Deny se comprobarán las restricciones Deny y si no se encuentra niguna entonces permitimos.
Si primero ponemos Allow, veremos las restricciones existententes y si no se encuentra ninguna se deniega.
Esta tabla te ayudará a entenderlo mejor.

Order Allow,Deny
Order Deny,Allow
Concuerda con Allow
Pasa
Pasa
Concuerda con Deny
No pasa
No pasa
No concuerda con ninguna
No pasa
Pasa
Concuerda con ambas
No pasa
Pasa

Pe: si queremos permitir el acceso a nuestra red local nada más podríamos poner:
Order allow,deny
Allow from 192.168.1

También le podemos poner opciones.
None: no se admite ninguna opción .
All: permite todas menos Multiviews.
ExecCGI: permite la ejecución de scripts CGI.
FollowSymLinks: permite el uso de enlaces simbólicos en el directorio (como los enlaces directos)
Includes: se permite usar fichero shtml, del lado del servidor.
Indexes: Nos muestra un mapa del directorio (el contenido del mismo) cuando no está definido un archivo DirectoryIndex (pe: index.html)
Para no permitir una opción le ponemos el símbolos - (menos) delante para prohibirla, así por ejemplo -indexes no mostraría el mapa del directorio.

Control de acceso

AllowOverride: Indica que directrices de las declaradas en el archivo .htaccess pueden sobreescribir a las configuradas en el archivo de configuración httpd.conf. Si no queremos permitir el uso de ficheros .htaccess usaríamos AllowOverride None.
Las opciones que tenemos que tener en cuenta si queremos usar el control basado en el AccessFileName (.htaccess) son:
  • AuthConfig: permite el uso de directrices de configuración ( AuthUserFile, AuthType, AuthName, require, etc)
  • FileInfo: permite el uso de directrices de configuración del tipo de documentos (AddType, AddLanguage, AddEncodig, ErrorDocument, ect)
  • Indexes: permite el uso de directrices para controlar la indexación de directorios (DefaultIcon, DirectoryIndex, IndexIgnore, IndexOptions, etc)
  • Limit: permite directrices de control de acceso al servidor( Allow, Deny y Order)
  • Options: permite utilizar directrices para controlar características propias del directorio (Options y XBitHack)
Para encontrar todas las posibilidades puedes acceder a manual de Apache
require: esta directriz dertermina que usuarios y grupos pueden acceder a un directorio restringido. Los nombre válido empleados son:
  • user
  • group
  • valid-user
Satisfy: cuando utilizamos la autenticación de HTTP básica y usamos directrices require junto con restricciones de la dirección del cliente podemos hacer uso de esta directriz. Admite dos valores Any para indicar que cualquiera de las directrices se pueden cumplir u All que se tiene que cumplir todas las directrices para conseguir el acceso.
En este ejemplo permitimos el acceso a la red local y a los usuarios externos les solicitamos un usuario de conexión.
Require valid-user
Order allow,deny
Allow from 192.168.1
Satisfy Any