sábado, 23 de mayo de 2009

Backup Total + Incrementales

#!/bin/bash
#Sccript name: backup.sh
#Sccript description: Crea un backup del sitio indicado y lo almacena en el sugar indicado; primero crea un Backup total si no existe y cada dia uno incremental con respecto al total, los domingos siempre crea un total de referencia.
D_SEM=`date +%u`
D_SEM_TEXT=`date +%a`
O_BK=""
D_BK=""
case $# in
0)O_BK=$PWD
D_BK="${HOME}/backup";;
1)O_BK=$1
D_BK="${HOME}/backup";;
2)O_BK=$1
D_BK=$2;;
*) echo "$0 [Que copiar] [Fichero guardardo]";exit;;
esac

if [ $D_SEM -eq 7 ]
then
tar czvf "${D_BK}_tot.tgz" $O_BK
else
tar czvf "${D_BK}_${D_SEM_TEXT}.tgz" $O_BK --newer="${D_BK}_tot.tgz"
if [ $? -ne 0 ]
then
tar czvf "${D_BK}_tot.tgz" $O_BK
fi
fi

Script detección accesos erroneos (Mejorado)

#!/bin/bash
#Sccript name: denyAttack.sh
#Sccript description: denegar accesos fallidos
if [ $# -ne 1]
then
echo "Need a text \"Failed\" to work"
echo "$0 text"
exit;
fi
cat /var/log/auth.log | grep $1 > AccesosErroneos.txt
egrep -o '([0-2]\d{2}|\d{2}|\d{1})\.([0-2]\d{2}|\d{2}|\d{1})\.([0-2]\d{2}|\d{2}|\d{1})\.([0-2]\d{2}|\d{2}|\d{1})' AccesosErroneos.txt | sort -u> IPsAccesoFallido.txt
for N in `cat IPsAccesoFallido.txt`
do
iptables -I INPUT 1 -s $N -j DROP
done
rm AccesosErroneos.txt
rm IPsAccesoFallido.txt

domingo, 17 de mayo de 2009

Copias de seguridad en Linux

Vamos a ver que herramientas de serguridad nos brinda Linux para hacer copias de seguridad. En este post no vamos a usar herramientas ajenas al sistema. Pero ¿que debemos salvar?, los datos que deberiamos tener a buen recaudo son:
/home -> Ficheros de usuario
/etc -> Ficheros de configuracion de los programas
/usr/local -> Los binarios de los programas instalados

Tipos de copias de seguridad:




















TipoV. creación
V. reparación
Saturacion de red
TotalLentaRapidaAlta sat.
IncrementalRapidaLentaBaja sat.
DiferencialMediaMediaMedia sat.

cpio: Esta funcionalidad recibe como entrada un listado de ficheros a copiar y los muestra por su salida estandar, con lo que si queremos salvar los datos tendremos que guardarlos redirigiendo el flujo de salida. Tener en cuenta que esta herramienta es muy basica y muy antigua. Trabaja a nivel de datos.
dd: Hace una copia exacta de los discos, a nivel de bit, es decir, si tenemos un disco de 10G y solo 1G usado el programa realizara la copia de 10G.
drump/restore: Mas moderno y flexible que cpio, se puede almacenar en sistintos dispositivos por ejemplo.
tar: Es el mas usador por sus opciones y flezxibilidad.

Ejemplos con tar:
#Creamos
$sudo tar czvf /tmp/home_destino.tgz /home/*
#Restauramos
$sudo tar xzvf /tmp/home_destino.tgz
#Inclementa desde la fecha indicada:
$sudo tar czvf /tmp/home_destino.tgz /home/* --newer "2009-05-18"

viernes, 15 de mayo de 2009

Script detección accesos erroneos

#!/bin/bash
cat /var/log/auth.log | grep "Failed" | egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -u> IPsAccesoFallido.txt
# Fichero de log | Solo los fallos | Solo las IPs | solo una vez> Lo almaceno aqui

for N in `cat IPsAccesoFallido.txt`
do
iptables -I INPUT 1 -s $N -j DROP
done

jueves, 14 de mayo de 2009

Sistema de archivos en Linux

Carpetas en basicas:
/home -> Fichero de usuario
/usr/local -> Programas de usuario y ficheros usados en los entornos graficos
/opt -> Carpeta opcional, se usa bastante en Gentoo (para las compilaciones) y en
/var -> Donde se almacena el Syslog y
/etc/skel -> El contenido de esta carpeta se copia al crear un usuario nuevo

Tipos de premisos:
Exinten tres tipos de permisos lectura, escritura y ejecución (Read-Write-eXecution) repesentados por "r","w" y "x" respectivamente.
Si queremos ver los permisos de un fichero deberesmo escribir "$ls -l" y nos mostrar los permisos ordenados por usuario, grupo y otros.
¿pero que pasa si quiere dar a un usuario permiso, no a su grupo y a otro usuario tambien permiso?, pues para ello se usa las ACL (Lista de control de acceso) incluidas desde el kernel 2.6 y que podeis compilar para el kernel 2.4 .

Atributos:
i Inmutable, no se puede hacer nada, ni borrar, ni editar, ni hacer un acceso directo, ...
c Comprime en tiempo real los fichero con este atributo
d No deja hacer backup
j Escribe en en el "journalis" que contiene informacion para el backup
s Borrar todo, incluso el fichero en el sector de disco
Para ver los atributos usamos $lsattr
Para cambiarlos $chattr +VALOR FICHERO

miércoles, 6 de mayo de 2009

Instalacion y configuracion de Shorewall

Para instalar el Shorewall vamos ha usar apt.
#apt-get install shorewall
Para que el servicio arranque de manera automatica vamos ha modificar el fichero /etc/default/shorewall y modificamos:
startup=0 por startup=1
Ahora tenemos que crear la configuracion, para ello vamos ha hacer una copia de los ficheros de configuracion por defecto.
#cp /usr/share/doc/shorewall-common/degault-config /etc/shorewall
o
#cp /usr/share/doc/shorewall/degault-config /etc/shorewall

Por defecto solo tiene creada una sola zona "fw firewall" que sirve para asegurarse a si mismo.
Tendremos que crear al menos dos zonas, la lan y la wan, es decir por donde entra internet y otra por donde esta nuestra red; recordar que solo se pueden usar nombres de 5 caracteres.
Editar el fichero /etc/shorewall/zones

###############################################################################
#ZONE TYPE OPTIONS IN OUT
# OPTIONS OPTIONS
fw firewall
lan ipv4 #
wan ipv4 #
#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE

Tendremos que crear las politicas por defecto: fw-lan, fw-wan, lan-wan, lan-fw, wan-lan y wan-fw.
Editamos el fichero /etc/shorewall/policy

###############################################################################
#SOURCE DEST POLICY LOG LIMIT:BURST
# LEVEL
local $FW ACCEPT
local net ACCEPT
$FW local ACCEPT
$FW net ACCEPT
net local DROP
net $FW DROP
#LAST LINE -- DO NOT REMOVE

Por ultimo podemos configurar las reglas para permitir cirtas cosas que en principio esta o no permitidas.
Editamos el fichero /etc/shorewall/rules

############################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ MARK
# PORT PORT(S) DEST LIMIT GROUP
#SECTION ESTABLISHED
#SECTION RELATED
SECTION NEW
ACCEPT net local tcp 80
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

NOTA: Para hacer todo esto sin muchos problemas podemos usar en Webmin con le modulo Shoreline.

Cambio de contraseña olvidada en linux

Cuando se nos olvida la contraseña de root Linux nos permite cambiarla para evitar tener que reinstalar todo el sistema; para ello tenemos que seguir los siguientes pasos:

1. Cuando arranque el GRUB pausamos el arranque y pulsamos "e".
No aparecera una pantalla con los distintos modos de arranque.
2. Seleccionamos el que aparece con "root=DISCO ro" y pulsamos "e" para editar.
3. Cambiamos "ro" por "rw" para poder hacer que se guarden los cambios
4. Añadimos "init=/bin/sh" esto nos mostrara una consola al arrancar, recordar no poner nada despues de esto.
5. Por ultimo arrancamos pulsando "b"
Ahora hemos entrado como root, como se ve por la prom #
6. Para cambiar la contraseña escribimos "passwd" y ponemos la contraseña nueva.

NOTA: DISCO será un disco contenido en /dev

lunes, 4 de mayo de 2009

Obtencion de informacion usando DNS

Para obtener la información de una web usando un servidor de DNS usaremos la utilidad “nslookup”.
Del siguiente modo:
1.Ejecutamos el lookup para dns
C:\> nslookup
*** No se puede encontrar el nombre de servidor para la dirección 192.168.1.1: Non-existent domain
*** Los servidores predeterminados no están disponibles Servidor predeterminado: Unknown
Address: 192.168.1.1
2.Nos informamos de los datos que tenemos de la web de la que queremos sacar la información
> SITE:COM
Servidor: Unknown
Address: 192.168.1.1
Respuesta no autoritativa:
Nombre: site.com
Address: 74.125.XX.XX, 216.239.XX.XX, 72.14.XX.XX
Podemos observar la linea que dice “Respuesta no autoritativa:” lo que nos indica que no es la autoridad que conoce todos los datos sobre dicha web.
3.Pedimos que nos de la información sobre quien es la identidad que sabe dicha información
> set type=NS
> SITE.COM
Servidor: Unknown
Address: 192.168.1.1
Respuesta no autoritativa:
site.com nameserver = ns1.site.com
site.com nameserver = ns2.site.com
site.com nameserver = ns3.site.com
site.com nameserver = ns4.site.com
ns1.site.com internet address = 216.239.XX.XX
ns2.site.com internet address = 216.239.XX.XX
ns3.site.com internet address = 216.239.XX.XX
ns4.site.com internet address = 216.239.XX.XX



4.Nos conectamos al servidor DNS principal de la web para que nos de todos los datos sobre la web que queremos investigar.
> server ns1.site.es
Servidor predeterminado: ns1.site.com
Address: 216.239.XX.XX
5.Como ahora estamos conectados al servidor que tiene toda la información sobre la web que queremos informarnos y pedimos todos los datos que tanga.
> set type=all
> site.com
Servidor: ns1.site.com
Address: 216.239.X.XX
site.com
primary name server = ns1.site.com
responsible mail addr = dns-admin.site.com
serial = 2009033100
refresh = 21600 (6 hours)
retry = 3600 (1 hour)
expire = 1209600 (14 days)
default TTL = 300 (5 mins)
site.com nameserver = ns1.site.com
site.com nameserver = ns2.site.com
site.com nameserver = ns3.site.com
site.com nameserver = ns4.site.com
site.com internet address = 216.239.XX.XX
site.com internet address = 72.14.XX.XX
site.com internet address = 74.125.XX.XX
site.com MX preference = 10, mail exchange = smtp2.site.com
site.com MX preference = 10, mail exchange = smtp3.site.com
site.com MX preference = 10, mail exchange = smtp4.site.com
site.com MX preference = 10, mail exchange = smtp1.site.com
ns1.site.com internet address = 216.239.XX.XX

Ya tenemos toda la información sobre este sitio.

martes, 28 de abril de 2009

Firewall con Iptables

Pongamonos en situación antes de todo.
Tenemos el siguiente esquema:
Queremos que los equipos con direcciones 172.16.1.X tenga acceso desde internet por los servicios FTP, SSH, IMAP, POP3, HTTP y permita los ICMP.
Por el contrario los equipos con direcciones 172.16.0.X tendran solo acceso a HTTP y cualquier peticion ICMP debera se rechazada.
Para administrar el Firewall vamos ha dejar que solo se puede acceder mediante SSH si la direccion de acceso es de 172.16.0.0/16.

Suponemos que las IPs estan asignadas como viene en el esquema.

Para empezar vamos a configurar el Firewall.
NOTA: El firewall no es mas que un equipo Linux con dos tarjetas de red e IPTABLES y un servidor SSH.
Para poder permitir al Firewall que "enrute" el trafico desde la red 192.168.1.0/24 hacia 172.16.0.0/16 tendremos que poner el fichero "/proc/sys/net/ipv4/ip_forward" a 1. Esto se puede hacer escribiendo:
# echo 1 > /proc/sys/net/ipv4/ip_forward

Ahora vamos a cerrar el acceso al Firewall y dejar solo el SSH:
# iptables -P INPUT DROP
# iptables -A INPUT -s 172.16.0.0/24 -p TCP --dport 22 -j ACCEPT
# iptables -P OUTPUT DROP
# iptables -A OUTPUT -d 172.16.0.0/24 -p TCP --sport 22 -j ACCEPT

Como podeis observar la direccion usa una mascara de 24bits para evitar el acceso desde los equipos de 172.16.1.X

Ahora vamos a configurar que datos debe de pasar de una red a otra.
# iptables -P FORWARD DROP
# iptables -A INPUT -d 172.16.1.0/24 -p TCP --dport 20 -j ACCEPT
# iptables -A INPUT -d 172.16.1.0/24 -p TCP --dport 21 -j ACCEPT
# iptables -A INPUT -d 172.16.1.0/24 -p TCP --dport 22 -j ACCEPT
# iptables -A INPUT -d 172.16.1.0/24 -p TCP --dport 80 -j ACCEPT
# iptables -A INPUT -d 172.16.1.0/24 -p TCP --dport 110 -j ACCEPT
# iptables -A INPUT -d 172.16.1.0/24 -p TCP --dport 143 -j ACCEPT
# iptables -A INPUT -d 172.16.1.0/24 -p TCP --dport 220 -j ACCEPT
# iptables -A INPUT -d 172.16.1.0/24 -p TCP --dport 993 -j ACCEPT

# iptables -A INPUT -s 172.16.1.0/24 -p TCP --sport 20 -j ACCEPT
# iptables -A INPUT -s 172.16.1.0/24 -p TCP --sport 21 -j ACCEPT
# iptables -A INPUT -s 172.16.1.0/24 -p TCP --sport 22 -j ACCEPT
# iptables -A INPUT -s 172.16.1.0/24 -p TCP --sport 80 -j ACCEPT
# iptables -A INPUT -s 172.16.1.0/24 -p TCP --sport 110 -j ACCEPT
# iptables -A INPUT -s 172.16.1.0/24 -p TCP --sport 143 -j ACCEPT
# iptables -A INPUT -s 172.16.1.0/24 -p TCP --sport 220 -j ACCEPT
# iptables -A INPUT -s 172.16.1.0/24 -p TCP --sport 993 -j ACCEPT

# iptables -A INPUT -s 172.16.0.0/24 -p TCP --dport 80 -j ACCEPT
# iptables -A INPUT -d 172.16.0.0/24 -p TCP --sport 80 -j ACCEPT
# iptables -A INPUT -d 172.16.0.0/24 -p ICMP -j REJECT

domingo, 26 de abril de 2009

VLAN en Switch

Para mejorar la seguridad de una red, podemos configurar nuestro switch para que las tramas de broadcast no se vean por toda la red. Incluso no se podrian ver entre las distintas VLAN salvo que configuremos un puerto troncal donde se comuniquen todas las VLAN, por ejemplo para conectarse a internet.
Con la creación de VLAN además evitaremos la saturación de la red y en caso de hacer un maninthemiddle solo afectaria a la VLAN desde donde se haga.
Si tenemos varios switch y queremos que se en ambos se vean tendremos que poner el mismo nombre a ambas VLAN. NOTA: Esto no funciona en todos los switch.

Por defecto existe una unica VLAN, la 1, que es de adminstrador, por defecto solo se puede administrar el switch.
Para crear las VLAN podemos usar el protocolo VTP que nos permitiria crear las VLAN en todos los router, pero luego tendremos que asignar a cada puerto una red.

Para crear una VLAN:
#vlan database
(vlan)#vlan N_VLAN name NOMBRE

NOTA: Las VLAN se crean automaticamente al asignar una no existente

Para asignar una VLAN a un puerto:
(config-if)#switchport access vlan N_VLAN
o asignarlas por bloque mediante:
(config)#interface range fastEthernet SLOT/PUERTO_INI - PUERTO_FIN
(config-if-range)#switchport access vlan N_VLAN

Para ver la conguracion de las VLAN:
#show vlan

Para poder dar acceso a internet a las distintas VLAN tendriamos que hacer que el puerto que se conecta al router o al otro switch este el modo troncal. Para ello:
(config-if)#switchport mode trunk
o
(config-if)#switchport trunk allowed vlan all
o si queremos que solo algunas tengan:
(config-if)#switchport trunk allowed vlan add N_VLAN

De este ultimo modo podriamos crear distintas salidas dependiendo de la VLAN en la que este.

viernes, 24 de abril de 2009

Seguridad basica en Routers

En este post vamos a ver como poner contraseña al router para que no puede entrar quien quiera.
NOTA: Los datos que aparecen en mayusculas y verde se sustituyen por lo que indique le texto

Poner contraseña para el acceso a "enable"
(config)# enable secret CONTRASEÑA

Poner contraseña al acceso por consola
(config)# line console 0
(config-line)# password CONTRASEÑA
(config-line)# login

Bueno en este momento tenemos una unica contraseña para acceder al router, por tanto si ocurriera algo no sabriamos quien ha sido el culpable. Para evitar esto vamos ha hacer que se autentifiquen para poder acceder.
(config)#line console 0
(config-line)#login local
(config)# username USUARIO password CONTRASEÑA

En este momento cualquiera que viera el fichero de configuración veria la contraseña en texto plano, por lo que deberiamos encriptarla, para ello avilitamos el servicio de encriptación.
(config)# service password-encryption

Para aumentar un poco mas la seguridad vamos ha midificar el tiempo para hacer el loguot automatico
(config-line)#exec-timeout TIEMPO_MIN

Configurar un Syslog

El Syslog como su propio nombre indica es log (listado de eventos) del sistema.
En este post vamos a configurar un router cisco para que nos mande toda la información de los eventos del sistema hacia un servidor con que recoja esos syslog y los almacene.
Existen infinidad de programas que usan estos syslog para comprobar la seguridad de la red.

NOTA: Los datos que aparecen en mayusculas y verde se sustituyen por lo que indique le texto

Lo primero que debemos hacer es configurar el reloj del sistema para que este sincronizado y por tanto los datos del log sean fiables.

(config)# clock timezone Madrid 1
(config)# clock summer-time Madrid recurring last SUN MARCH 02:00 last SUN OCT 02:00
(config)# ntp server IP_SERVER_NTP

Configuramos el servicio de hora para que se muestre en el Syslog la hora en la que se produzco el evento.

(config)# service timestamps log datetime msec localtime show-timezone

Ahora vamos a crear un lookback para que sea esta dirección la que se añada al syslog y de este modo no nos aparezcan cada ip de cada puerto.
NOTA: La ip que vamos a usar no se usa para nada mas que para el syslog y no se enrutará ni se podrá acceder a la misma en local, es decir no se, si pusiéramos la de google en el syslog aparecería pero podríamos acceder a google del mismo modo.

(config)#interface loopback N_LOOK
(config-if)#ip address IP_LOOKBACK MASK_LOOKBACK
(config)#logging source-interface loopback N_LOOK

Configuramos para que los errores se almacenen en el buffer interno y se manden todo al servidor de syslog

(config)#logging buffered size_buffer error
(config)#logging trap debugging

Por ahora lo único que nos falta es el poner la información sobre el servidor donde tenemos la base de datos de syslog y encender el log.

(config)#logging IP_SERVER_SYSLOG
(config)#logging on

Ya tenemos configurado el router para que nos mande toda la información al servidor de syslog de nuestra red.

miércoles, 22 de abril de 2009

ACLs Basicas

A continuacion vamos a ver unas pequeñas listas de control de acceso (ACL) que nos permiten filtrar el trafico desde el Router.
Recordad que solo se puede tener una unica lista para cada interfaz y para cada flujo, uno de entrada y otro de salida.

NOTA: Sustituir "IP_SERVER" por la Ip del servidor a proteger.


ACL Para la proteccion de ataque de SubSeven
Esta lista es una lista que bloquea todos los acceso a los puertos usados por el troyano SubSeven
Para ello en el Router escribiremos:

(config)#ip access-list extended ANTI_Sub7_DDoS
(config-ext-nacl)#deny tcp any any eq 6776
(config-ext-nacl)#deny udp any any eq 6776
(config-ext-nacl)#deny tcp any any eq 6669
(config-ext-nacl)#deny udp any any eq 6669
(config-ext-nacl)#deny tcp any any eq 2222
(config-ext-nacl)#deny udp any any eq 2222
(config-ext-nacl)#deny tcp any any eq 7000
(config-ext-nacl)#deny udp any any eq 7000


ACL Para la proteccion de ataque de Trinoo
Esta lista es una lista que bloquea todos los acceso a los puertos usados por el troyano Trinoo
Para ello en el Router escribiremos:

(config)#ip access-list extended ANTI_TRINOO_DDoS
(config-ext-nacl)#deny tcp any any eq 27665
(config-ext-nacl)#deny udp any any eq 27665
(config-ext-nacl)#deny tcp any any eq 31335
(config-ext-nacl)#deny udp any any eq 31335
(config-ext-nacl)#deny tcp any any eq 27444
(config-ext-nacl)#deny udp any any eq 27444


ACL Para la proteccion de ataque tipo LAND
Esta lista es una lista que bloquea todos los acceso ip los cuales procedan y se envien desde la misma ip, de este modo protegemos contra los ataques LAND.
Para ello en el Router escribiremos:

(config)#ip access-list extended ANT_LAND
(config-ext-nacl)#deny ip host IP_SERVER host IP_SERVER


ACL Para proteccion de un servidor HTTP
Esta lista bloquea todos los acceso TCP que intenten acceder al servidor sin haber establecido una conexión previa.
Para ello en el Router escribiremos:

(config)#ip access-list extended HTTP
(config-ext-nacl)#permit tcp any host IP_SERVER eq www established


ACL Para evitar la salidas de PING

Dato que en ocasiones puede darse el caso que algun usuario del nuestro servidor de hosting tenga la intención de realizar un ataque mediante el uso de envio de mensajes ICMP hacia otro servidor, vamos a proteger el uso de estos paquetes por parte de nuestro servidor. Hay que destacar que necesitamos que cuando se envien estos mensaje hacia el servidor los responda sin problemas.
Para ello en el Router escribiremos:

(config)#ip access-list extended PING
(config-ext-nacl)#permit icmp host IP_SERVER any echo-reply


ACL Para proteccion de un servidor SSH

Esta lista bloquea todos los acceso TCP que intenten acceder al servidor por un puerto distinto al de SSH (22).
Para ello en el Router escribiremos:

(config)#ip access-list extended SSH
(config-ext-nacl)#permit tcp any host IP_SERVER eq 22