Posts Tagged ‘seguridad’

Respaldo de nuestro blog

Monday, January 7th, 2008

Por muchos motivos es muy recomendable respaldar nuestros archivos, especialmente si contamos con un sitio web, ya que cualquier problema que tengamos con el sistema de archivos, tendremos una copia de respaldo y podremos recuperar el servicio.

Otra ventaja de hacer respaldos es que si contamos con un blog propio, por ejemplo con Wordpress, estos contienen varias vulnerabilidades de seguridad muy conocidas que pueden ser aprovechados por crackers.

Si tenemos el blog sobre una plataforma GNU/Linux, podemos utilizar las herramientas que nos provee para hacer los respaldos y automatizarlos. Utilizaremos

  • Pdumpfs, para respaldar
  • Crontab, para automatizar

Crontab, viene ya en todas las plataformas GNU/Linux y Unix, por lo que sólo deberemos instalar pdumpfs. Antes que nada la explicación tiene en cuenta cualquier distribución basada en Debian, pero esto no implica que no se pueda ejecutar en otras, sólo hay que hacer cambios menores. Primero verificaremos que si lo tenemos instalado


# aptitude search pdumpfs
p   pdumpfs                         - a daily backup system similar to Plan9’s d
p   pdumpfs-rsync                   - pdumpfs extension using rsync

El comando busca todos los paquetes que concuerden con la cadena que le pasamos como parámetro, en este caso pdumpfs. Los paquete que concuerden se muestran en una lista, como se puede ver cada línea comienza con la letra p, que significa que el paquete no está en el sistema; si lo hubiésemos tenido instalado tendría el estado i, que se encuentra instalado.

Como el paquete lo tenemos en el estado p, vamos a instalarlo


#aptitude install pdumpfs

Pdumpfs es un programa muy sencillo, pero potente, al igual que el lenguaje en que fue desarrollado Ruby, escrito por Satoru Takabayashi. La sintaxis sería


pdumps [directorio-fuente] [directorio-destino]

Dentro del directorio destino se crea un directorio llamado YYYY/MM/DD, que indica el año, el mes y el día respectivamente en que ejecutamos el comando.

Por ejemplo para realizar el respaldo cree una carpeta backup en un disco que monté, para respaldos que se encuentra en /mnt/sdb1


#pdumpfs /var/www/blog /mnt/sdb1/backup

Ahora debemos automatizar el proceso, para eso bastará con editar nuestra tabla cron, que se encuentra /etc/crontab. Voy a indicar en la tabla que este proceso se ejecute todos los días a las 5:00 AM. Para esto hacemos


#echo "0 5 * * * root pdumpfs /var/www/blog /mnt/sdb1/backup >> /etc/crontab

Para mayor información sobre la sintaxis de la tabla cron consultar aquí.

Resultó muy sencillo, ahora vamos a hacer al proceso un poco más robusto. Es importante que mantegamos log sobre el proceso de respaldo y también log de los errores que podrían surgir. Esto se puede hacer agregando un par de parámetros más al ejecutar pdumpfs. Tendríamos que ejecutar este comando en vez del anterior o editar la tabla cron


#echo "0 5 * * * root pdumpfs /var/www/blog /mnt/sdb1/backup >/mnt/sdb1/backup/log/pdumpfs.log 2>/mnt/sdb1/backup/log/error.log" >> /etc/crontab

Aquí cree una nueva carpeta log dentro de la carpeta backup y indico que el archivo de log se llame pdumpfs.log. Luego indico que la salida de error estándar (indicada por el 2) se redirija a /mnt/sdb1/backup/log/error.log. Por lo tanto si hay error se escribirá en el archivo error.log.

Listo con esto tenemos un sistema de respaldo automatizado, algo que vale la pena comentar es que todos los archivos son copiados la primera vez que respaldamos, pero luego pdumpfs sólo copia los archivos nuevos o actualizados y los que no fueron cambiados los mantiene como links en duro de los archivos del respaldo anterior, esto produce una gran eficiencia en el uso de la memoria.

Ocultando PHP

Friday, January 4th, 2008

En un anterior post expliqué cómo ocultar los detalles de versión que suministraba Apache en las cabeceras de solicitud HTTP. Ahora si tenemos PHP instalado, hay información de éste dentro de la cabecera, que puede resultar de ayuda a un cracker.

Una cabecera sin la firma del servidor web pero con información de PHP luce así


HTTP/1.0 200 OK
Date: Fri, 04 Jan 2008 14:25:36 GMT
Server: Apache
X-Powered-By: PHP/5.2.1
X-Pingback: http://localhost
Connection: close
Content-Type: text/html; charset=UTF-8

Para deshabilitar esa información hay que ir a /etc/php5/apache2 y editamos el archivo php.ini


#nano php.ini

Ahora debemos cambiar el valor de la opción expose_php de On a Off


; Misc
;
; Decides whether PHP may expose the fact that it is installed on the server
; (e.g. by adding its signature to the Web server header).  It is no security
; threat in any way, but it makes it possible to determine whether you use PHP
; on your server or not.
expose_php = Off

Guardamos la nueva configuración y reiniciamos el servidor


#etc/init.d/apache2 restart

Y listo, ahora podríamos hacer una prueba para ver si no es suministrada la información de PHP.


#telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HTTP/1.0 200 OK
Date: Fri, 04 Jan 2008 14:29:24 GMT
Server: Apache
X-Pingback: http://localhost
Connection: close
Content-Type: text/html; charset=UTF-8

A desaparecido el campo X-Powered-By, el cuál informaba sobre PHP.

Aumentar la seguridad de nuestro sitio

Wednesday, December 26th, 2007

Una persona mal intencionada que quiera tirar abajo nuestro sitio web, debe contar con información, esta puede ser obtenida de varias formas, pero mientras mayor sea el esfuerzo que deba realizar en conseguirla menor será su ganas de atacar.

Algunas versiones de Apache 2 por defecto trae activada una directiva que informan sobre el servidor. Por ejemplo, al contar con información del número de versión de Apache, tiene a su disposición todas las vulnerabilidades reportadas. En base a esto y ganas de hacer daño es cuestión de tiempo para bajar el sitio. Por lo cual no se recomienda que esté activada está directiva, sólo en el caso de que Apache se utilice como un servidor proxy y de esta manera poder determinar qué proxy causa un error.

Pie de imagen con información del servidor

Vamos a ver como desactivar esta información que suministra Apache. La explicación se basa en Debian y Apache 2. La directiva ServerSignature, agrega un pie en las páginas generadas detallando número de versión, nombre y puerto por el que escucha el servidor. Es importante notar que los detalles del número de versión mostrado en éste pie es controlado a través de la directiva ServerTokens, a partir de la versión 2.0.44 de Apache.

ServerSignature puede tomar los siguientes valores: On, Off, EMail. EMail, además de mostrar información detallada por ServerTokens, muestra el valor de la directiva ServerAdmin.

ServerTokens puede tomar los siguientes valores

Valor Muestra
Prod[uctOnly] Apache
Major Apache/2
Minor Apache/2.0
Min[imal] Apache/2.0.41
OS Apache/2.0.41 (Unix)
Full Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

Nos vamos a


#cd /etc/apache2
#vi apache2.conf

Nota:Puede ser que la gestión de la configuración del servidor se encuentre en varios archivos y no sólo en apache2.conf. La ruta en dónde pueden encontrarse estos archivos se obtiene a través de las directivas Include dentro de apache2.conf. Por defecto podemos encontrar el resto de los archivos en /etc/apache2/sites-available. En éstos archivos también tenemos que modificar los valores de ServerSignature.

Buscamos la directiva ServerSignature y la establecemos en Off.


# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature Off

Reiniciamos Apache para que tome la nueva configuración


#/etc/init.d/apache2 force-reload

Con esto desaparecerá el pie de página

Pie de imagen sin información del servidor

Podemos comprobar que información está suministrando el servidor, a través del encabezado devuelto en las solicitudes HTTP[1]


# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 200 OK
Date: Wed, 26 Dec 2007 21:57:51 GMT
Server: Apache/1.3 (Debian) PHP/5.2.1
Last-Modified: Tue, 27 Nov 2007 02:16:58 GMT
ETag: “1390096-7b7-ace83a80″
Accept-Ranges: bytes
Content-Length: 1975
Connection: close
Content-Type: text/html; charset=UTF-8
…

Dentro del encabezado HTTP, se esta mostrando información detallada, tenemos que minimizarla, esto lo hacemos modificando el valor de la directiva ServerTokens


# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Prod

Ahora si hacemos un telnet aparecera[1]


# telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 200 OK
Date: Wed, 26 Dec 2007 21:57:51 GMT
Server: Apache
Last-Modified: Tue, 27 Nov 2007 02:16:58 GMT
ETag: “1390096-7b7-ace83a80″
Accept-Ranges: bytes
Content-Length: 1975
Connection: close
Content-Type: text/html; charset=UTF-8
…


[1] También podríamos utilizar NetCat, para obtener sólo el encabezado de la solicitud HTTP. Donde a NetCat le pasamos la dirección IP del servidor (localhost) y el puerto por el que está escuchando (80). Después de presionar enter utilizamos el método de solicitud HEAD.


# nc localhost 80
HEAD / HTTP:1.0

HTTP/1.1 200 OK
Date: Thu, 17 Jan 2008 21:00:51 GMT
Server: Apache
Last-Modified: Tue, 27 Nov 2007 02:16:58 GMT
ETag: "1390096-7b7-ace83a80"
Accept-Ranges: bytes
Content-Length: 1975
Connection: close
Content-Type: text/html; charset=UTF-8

bibliografía