Archivo

Entradas Etiquetadas ‘apache’

Configuración de /tmp con noexec para una mayor seguridad en servidores web Linux

Jueves, 29 de Enero de 2009 1 comentario

Una de las principales amenazas a las que se ven sometidos los servidores web en internet son los fallos existentes en las aplicaciones que ejecutan. Estos fallos, aprovechados convenientemente, pueden conllevar que un usuario malicioso consiga acceso al servidor con los mismos privilegios que el usuario que ejecuta el servicio web. En el caso de Linux este usuario se suele llamar nobody o apache.

El primer paso que un atacante realiza cuando consigue explotar el fallo a través de la aplicación web es el de descargar en el servidor alguna aplicación que le permita acceder remotamente de forma cómoda, como por ejemplo mediante una shell. En el caso de los gusanos creados especialmente para este propósito el comportamiento es muy similar, explotan el fallo, descargan el mismo gusano en el sistema y lo ejecutan para seguir infectado otros servidores.

El usuario sube al servidor esta aplicación maliciosa en un directorio en el cual tenga permisos de ejecución el usuario que ejecuta el servicio web, pero como estos directorios pueden variar entre distintas distribuciones se recurre a utilizar en la mayoría de casos el directorio en el cual todos los usuarios pueden escribir, es decir, /tmp .

Para intentar minimizar las oportunidades de éxito de este tipo de ataques surge la idea de marcar de alguna manera el directorio /tmp como directorio donde no se puedan ejecutar aplicaciones, sin embargo esto no es posible aplicarlo directamente a directorios, sino que se debe realizar sobre particiones completas.

Para lograr conseguir este objetivo sin la necesidad de modificar la tabla de particiones de nuestro disco duro vamos a recurrir a dispositivos loop. Básicamente lo que haremos será crear un fichero del tamaño que deseemos que tenga el directorio /tmp, y posteriormente montaremos este sistema de ficheros en el mismo directorio, marcándolo como no ejecutable para conseguir así nuestro objetivo.

A continuación se puede ver un código de ejemplo que crea un directorio /tmp no ejecutable con un tamaño de 1GB:

cd /var
dd if=/dev/zero of=tmploop bs=1024 count=$((1024*1024))
/sbin/mke2fs tmploop
cp -R /tmp /tmpbak
mount -o loop,noexec,nosuid,rw /var/tmp0 /tmp
chmod 0777 /tmp
cp -R /tmpbak/* /tmp/

Esto nos dejaría /tmp preparado, ahora habría que borrar /tmpbak cuando hayamos comprobado que todo ha ido correctamente. Sin embargo cuando el servidor sea reiniciado estos cambios se van a perder. Para que esto no ocurra habría que añadir la siguiente línea al fichero /etc/fstab :

/var/tmploop       /tmp    ext2    loop,noexec,nosuid,rw  0 0

Cómo evitar el Hotlinking y aprovecharnos de ello

Domingo, 30 de Noviembre de 2008 19 comentarios

Los webmasters sufren a menudo lo que se denomina Hotlinking, es decir, otras páginas usan archivos (por ejemplo imágenes) alojados en su servidor directamente, haciendo que se consuma su ancho de banda. Lo correcto sería que la persona que quiera usar una imágen en tu web se la descargara a su disco duro y la subiera posteriormente por FTP a su propia página, haciendo así que el ancho de banda gastado sea el propio y no el ajeno.

En varios blogs se pueden encontrar soluciones a este problema, un tanto radicales bajo mi punto de vista, que hacen que cuando un blog te enlace directamente una imágen esta sea sustituida por otra en tiempo de ejecución, o incluso que no se muestre nada, ahorrando así todo el ancho de banda.

Sin embargo si nos paramos a pensar un poco, lo que nos gustaría no es que nadie nos hiciera hotlinking de las imágenes, sino que ese blog acreditara en alguna parte que la imagen está extraída de nuestro blog. Como no podemos obligar al propietario del mismo a que nos enlace o nos nombre en algún sitio acerca de donde ha sido obtenida la imagen, vamos a aprovecharnos para incluir la URL de nuestro blog en la imagen enlazada, para ello haremos uso de los archivos .htaccess de Apache y de la librería GD de PHP. Lógicamente no queremos que las imágenes que incluyamos en nuestro blog tengan incrustada la URL del mismo.

La idea es simple, cuando un blog nos enlace una imágen directamente la petición GET llegará al servidor con un campo HTTP_REFERER que no corresponderá con la URL de nuestro blog, en ese momento se invocará un script PHP al cual le pasamos la ruta de la imagen solicitada. Este script PHP se encargá en tiempo real de abrir la imagen, incrustarle la URL de nuestro blog y mostrarla.

Este es un ejemplo de una imagen enlazada directamente por nuestro blog:

Este es un ejemplo de como se mostraría la misma imagen si alguien nos hiciera Hotlinking:

Para conseguir incluir este sistema en cualquier página web es necesario usar Apache, con soporte de archivos .htaccess y tener instalada la librería GD en PHP.

Paso 1: Editar el archivo .htaccess e incluir lo siguiente sustituyendo tudominio.com por tu dominio.

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?tudominio\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_URI} .*\.(jpe?g|gif|bmp|png)$
RewriteRule ^(.*)$ /nohotlink.php?i=$1 [L]

Paso 2: Crear un archivo en el directorio raiz de la web denominado nohotlink.php e incluir el siguiente contenido, sustituyendo www.tudominio.com por tu dominio

<?php
function imagecreatefromfile($path, $user_functions = false)
{
$info = @getimagesize($path);

if(!$info)
{
return false;
}

$functions = array(
IMAGETYPE_GIF => ‘imagecreatefromgif’,
IMAGETYPE_JPEG => ‘imagecreatefromjpeg’,
IMAGETYPE_PNG => ‘imagecreatefrompng’,
IMAGETYPE_WBMP => ‘imagecreatefromwbmp’,
IMAGETYPE_XBM => ‘imagecreatefromwxbm’,
);

if($user_functions)
{
$functions[IMAGETYPE_BMP] = ‘imagecreatefrombmp’;
}

if(!$functions[$info[2]])
{
return false;
}

if(!function_exists($functions[$info[2]]))
{
return false;
}

return $functions[$info[2]]($path);
}

header(“Content-type: image/png”);
$im        = imagecreatefromfile($_GET['i']);
$width    = imagesx($im);
$height    = imagesy($im);
putenv(‘GDFONTPATH=’ . realpath(‘.’));
$white = imagecolorallocate($im, 255, 255, 255);
$grey  = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
$orange = imagecolorallocate($im, 220, 210, 60);
$tamano = 10;
$texto = “www.tudominio.com“;
$tb = imagettfbbox($tamano, 0, “arial”, $texto);
$altura = $tb[3] – $tb[5];
imagefilledrectangle  ($im  , 0  , $height-$altura-2  , $width  , $height, $black);
$x = ceil(($width – $tb[2]) / 2);
imagettftext($im, $tamano, 0, $x, $height-4, $orange, “arial”, $texto);
imagepng($im);
imagedestroy($im);

?>

Paso 3: Descargar en el directorio raiz de vuestra web la fuente arial.ttf, la podeis obtener desde aqui.

Y listo, ya tendríamos todo en funcionamiento. Podemos hacer una prueba de si el sistema funciona usando el siguiente comando desde wget:

wget http://www.tudominio.com/alguna_imagen.jpg –referer=http://www.otrodominio.com

Categories: Desarrollo Web Tags: , , ,