NovaMonoFix
Errores PHP
X
Usuario
Password
0 FPS

Añadir más seguridad a nuestro servidor Web

29 de Octubre del 2012 por Josep Antoni Bover, 29 visitas, 0 comentarios, 0 votos
Categorías : PHP, HTML, Programación, Servidores, .htaccess.
La web está en segundo plano, animación en pausa.
Cargando animación...
Añadir más seguridad a nuestro servidor Web

Hoy mirando los logs de mi servidor web, me he encontrado con que algún iluminado ha intentado acceder a mi página web pensándose que esta funcionaba bajo word press.

No es la primera vez que comento que alguien intenta entrar a la zona de administración de mi página web, y probablemente no será la última. Por ello hoy me he propuesto ilustrar un poco por encima, como podemos disuadir a estos iluminados que por aburrimiento se dedican a cargarse el trabajo de otros.

En este mundo nada es 100% seguro, por ello nunca viene mal añadir algunos mecanismos que dificulten aun más la tarea de romper la seguridad de nuestros servidores.

Me imagino que no debo ser el único que recibe este tipo de ataques, ya que me extraña muchísimo que una web como la mía sufra este tipo de cosas con bastante regularidad. Por lo que supongo que deben ser ataques automatizados, o de lo contrario, alguien me quiere mucho...

Lo que propongo en este artículo es banear a los usuarios que intenten acceder a carpetas y o archivos que son famosos por ser archivos de configuración / paneles de control.

Como podemos banear a estos usuarios? en los servidores php existe la posibilidad de crear un archivo de configuración llamado ".htaccess" el cual nos permite entre otras cosas denegar el acceso a nuestra web a las ips especificadas. Veamos un ejemplo :

El archivo ".htaccess" debe estar ubicado en la raíz de nuestra página web, o en la raíz del directorio que se desea proteger. También podemos tener un .htaccess en la raíz de la web y otro .htaccess ubicado en un subdirectorio, cada uno con sus reglas.
.htaccess
1
2
3
4
5
<Limit GET>
order allow,deny
deny from 213.5.64.19 #spamer conocido
allow from all
</Limit>

Para banear una IP debemos tener las lineas 1,2,4,5 siempre fijas, y entre medio (en este caso la linea 3) añadir el comando "deny from IP". Podemos añadir tantas ips como queramos, y tambien deberíais saber que la parrilla '#' se usa para insertar comentarios.

La IP 213.5.64.19 es de un servidor que se dedica a hacer spam a miles de páginas webs, así que ya la podéis dejar dentro del archivo ".htaccess".

Ahora vamos a meternos en la piel de un hacker que desea acceder a nuestra web, el no sabe realmente desde donde acceder a la web, por lo que tiene que ir probando métodos conocidos, como por ejemplo entrar en la carpeta "admin" y ver si existe, y ver si puede hacer algo desde ella.

Aunque nosotros no tengamos dicha carpeta admin, si baneamos a ese usuario al probar de entrar en la carpeta 'admin' nos ahorraremos sus siguientes pruebas, y este se verá obligado a cambiar de IP para saltarse el baneo, a la que lleve 10 veces haciendo esto es posible que desista y busque otro objetivo mas fácil que nuestra web.

He elaborado una lista con los directorios / archivos en los que suelen mirar basada en mi propia experiencia :

/muieblackcat/
/admin/
/admin/pma/
/db/
/dbadmin/
/myadmin/
/mysql/
/mysqladmin/
/typo3/phpmyadmin/
/phpadmin/
/phpMyAdmin/
/phpmyadmin/
/phpmyadmin1/
/phpmyadmin2/
/pma/
/web/phpMyAdmin/
/xampp/phpmyadmin/
/websql/
/phpMyAdmin-2/
/php-my-admin/
/phpMyAdmin-2.2.3/
/phpMyAdmin-2.2.6/
/phpMyAdmin-2.5.1/
/phpMyAdmin-2.5.4/
/phpMyAdmin-2.5.5-rc1/
/phpMyAdmin-2.5.5-rc2/
/phpMyAdmin-2.5.5-pl1/
/phpMyAdmin-2.5.6-rc1/
/phpMyAdmin-2.5.6-rc2/
/phpMyAdmin-2.5.6/
/phpMyAdmin-2.5.7/
/phpMyAdmin-2.5.7-pl1/
/wp-login.php
/blog/wp-login.php
/wordpress/wp-login.php
/wp/wp-login.php
Mucho ojo con intentar acceder a algún archivo o carpeta de los mencionados en mi web, o os quedareis sin leer el resto del artículo, quien avisa no es traidor xD.

Yo recomiendo bloquear todos estos directorios y archivos, y si resulta que vuestro servidor tiene archivos para la configuración de vuestro sitio en alguna de estas ubicaciones os recomendaría que cambiéis su nombre de alguna forma para que no sean tan evidentes.

Con todo esto claro, la idea sería que si algún usuario entra en una de esas ubicaciones sea baneado, ya que de esta forma dificultareis mucho mas su recolección de información, y probablemente lo disuadiréis de seguir intentando acceder a vuestros datos.

Script PHP para banear IPs

Ahora lo que necesitamos es crear un script PHP para banear una ip especifica, y modificar el archivo ".htaccess" para re-direccionar todos los directorios y archivos mencionados anteriormente al script que banea ips.

BanearIP.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
if (!isset($_SESSION)) session_start();
// Contador de actividades no permitidas
if (isset($_SESSION["AvisoDeBaneado"])) $_SESSION["AvisoDeBaneado"] ++;
else $_SESSION["AvisoDeBaneado"] = 1;
if ($_SESSION["AvisoDeBaneado"] == 1) {
// Aviso de actividad no permitida
echo "<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /></head><body>
<h1>Atención! has realizado una actividad no permitida, si lo vuelves a intentar serás baneado.</h1>
</body></html>";
}
else {
if (BanearIP() == TRUE) {
// Banear actividad no permitida
echo "<html><body>
<h1>IP ".$_SERVER['REMOTE_ADDR']." BANEADA que tengas un buen dia.</h1>
</body></html>";
}
}
function BanearIP($HTACCESS = ".htaccess") {
// Leo el .htaccess en la variable $Txthta
$Archivo = fopen($HTACCESS, "r");
$Txthta = fread($Archivo, filesize($HTACCESS));
fclose($Archivo);
// Nueva IP para banear (\r\n es un salto de línea valido para windows, en linux se omite \r)
$NuevaIP = "\r\n"."deny from ".$_SERVER['REMOTE_ADDR'];
// Comentario que debemos buscar
$TxtIpBaneada = "#INICIO ips baneadas";
// Obtenemos la posición donde empieza el comentario
$Posicion = strpos($Txthta, $TxtIpBaneada);
// No se ha encontrado el comentario salimos.....
if ($Posicion === FALSE) return FALSE;
// Sumamos el tamaño del comentario
$Posicion += strlen($TxtIpBaneada);
// Guardo el .htaccess con la nueva ip baneada
$Archivo = fopen($HTACCESS, "w");
// Guardamos desde el inicio hasta el comentario (incluyendo el mismo)
fwrite($Archivo, substr($Txthta, 0, $Posicion), $Posicion);
// Guardamos la nueva ip
fwrite($Archivo, $NuevaIP, strlen($NuevaIP));
// Guardamos el resto del archivo
fwrite($Archivo, substr($Txthta, $Posicion, strlen($Txthta) - $Posicion), strlen($Txthta) - $Posicion);
fclose($Archivo);
return TRUE;
}
?>

Este script se basa en que el archivo ".htaccess" tenga el comentario "#INICIO ips baneadas" justo antes de las ips que van a ser denegadas, para añadir la ip del cliente actual a la lista del ".htaccess"

En este caso le he añadido tambien un primer aviso que se mostrara para advertir al usuario que si sigue metiendo las narices donde no debe acabara baneado.

No estaría de más añadir una pequeña función para mandaros un correo avisando de que se ha baneado a un usuario, así podreis revisar lo que ha hecho en vuestros logs (No la he incluido para no alargar más el código, pero ya os digo que mi función BanearIP lo hace).

Código del archivo .htaccess

Por último solo nos falta re-direccionar todos los archivos y carpetas al script para banear la IP, para ello también utilizaremos el ".htaccess", de forma que el archivo final debería quedar así :

.htaccess
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<Limit GET>
order allow,deny
#INICIO ips baneadas
deny from 213.5.64.19 #spamer conocido
#FIN ips baneadas
allow from all
</Limit>
#Redirecciones
Redirect 301 /muieblackcat http://www.MIURL.es/BanearIP.php
Redirect 301 /admin http://www.MIURL.es/BanearIP.php
Redirect 301 /admin/pma http://www.MIURL.es/BanearIP.php
Redirect 301 /db http://www.MIURL.es/BanearIP.php
Redirect 301 /dbadmin http://www.MIURL.es/BanearIP.php
Redirect 301 /myadmin http://www.MIURL.es/BanearIP.php
Redirect 301 /mysql http://www.MIURL.es/BanearIP.php
Redirect 301 /mysqladmin http://www.MIURL.es/BanearIP.php
Redirect 301 /typo3/phpmyadmin http://www.MIURL.es/BanearIP.php
Redirect 301 /phpadmin http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin http://www.MIURL.es/BanearIP.php
Redirect 301 /phpmyadmin http://www.MIURL.es/BanearIP.php
Redirect 301 /phpmyadmin1 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpmyadmin2 http://www.MIURL.es/BanearIP.php
Redirect 301 /pma http://www.MIURL.es/BanearIP.php
Redirect 301 /web/phpMyAdmin http://www.MIURL.es/BanearIP.php
Redirect 301 /xampp/phpmyadmin http://www.MIURL.es/BanearIP.php
Redirect 301 /websql http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2 http://www.MIURL.es/BanearIP.php
Redirect 301 /php-my-admin http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.2.3 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.2.6 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.1 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.4 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.5-rc1 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.5-rc2 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.5-pl1 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.6-rc1 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.6-rc2 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.6 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.7 http://www.MIURL.es/BanearIP.php
Redirect 301 /phpMyAdmin-2.5.7-pl1 http://www.MIURL.es/BanearIP.php
Redirect 301 /wp-login.php http://www.MIURL.es/BanearIP.php
Redirect 301 /blog/wp-login.php http://www.MIURL.es/BanearIP.php
Redirect 301 /wordpress/wp-login.php http://www.MIURL.es/BanearIP.php
Redirect 301 /wp/wp-login.php http://www.MIURL.es/BanearIP.php

Como podéis ver se utiliza el comando "Redirect 301" especificando la URL y la redirección.

En donde especificamos la redirección debe tener la URL completa o en el caso contrario podría no funcionar bien, ya que si re-direccionamos desde un directorio el script se perdería del todo. Por ejemplo si vamos a "/admin/" intentaria acceder a "/admin/BanearIP.php" y no lo encontraria.

Por último debo comentar que desde mi servidor de pruebas (xampp) el comando "Redirect 301" no funciona, esto es porque me falta activar el modulo "rewrite_module" dentro del archivo "httpd.conf". De todas formas la gran mayoría de servidores web lo tienen activado por defecto.

Y esto es todo, espero que por lo menos con estos apuntes se lo dejemos mas difícil a esta gentuza que se dedica a cargarse el trabajo de los demás.