Saltar al contenido

admin

Autenticación en Apache: básica y PAM

  • admin 

FUENTE: http://blog.unlugarenelmundo.es/2010/03/13/autenticacion-en-apache-basica-y-pam/

 

El servidor web Apache puede acompañarse de distintos módulos para proporcionar diferentes modelos de autenticación. Hoy vamos a echarle un vistazo a la configuración básica de dos de los más utilizados y sencillos.

PRIMER METODO

La primera forma que veremos es la más simple. Usamos para ello el módulo de autenticación básica que viene instalada “de serie” con cualquier Apache. La configuración que tenemos que añadir en el fichero de definición del Virtual Host a proteger podría ser algo así:

<Directory "/var/www/miweb/privado">
Order deny,allow
AuthUserFile "/etc/apache2/claves/passwd.txt"
AuthName "Palabra de paso"
AuthType Basic
<Limit GET POST>
Require valid-user
</Limit>
</Directory>

La información a personalizar está marcada en negritas. En Directory escribimos el directorio a proteger, que puede ser el raíz de nuestro Virtual Host o un directorio interior a este. En AuthUserFile ponemos el fichero que guardará la información de usuarios y contraseñas que debería de estar, como en este ejemplo, en un directorio que no sea visitable desde nuestro Apache. Ahora comentaremos la forma de generarlo. Por último, en AutnName personalizamos el mensaje que aparecerá en la ventana del navegador que nos pedirá la contraseña. Existen otras directivas adicionales o modificaciones a estas útiles para personalizar el acceso: AuthGroupFile, Require user, Require group, etc.

El fichero de contraseñas se genera mediante la utilidad htpasswd. Su sintaxis es bien sencilla. Para añadir un nuevo usuario al fichero operamos así:

# htpasswd /etc/apache2/claves/passwd.txt carolina
New password:
Re-type new password:
Adding password for user carolina

Para crear el fichero de contraseñas con la introducción del primer usuario tenemos que añadir la opción -c (create) al comando anterior. Si por error la seguimos usando al incorporar nuevos usuarios borraremos todos los anteriores, así que cuidado con esto. Las contraseñas, como podemos ver a continuación, no se guardan en claro. Lo que se almacena es el resultado de aplicar una función hash.

josemaria:rOUetcAKYaliE
carolina:hmO6V4bM8KLdw
alberto:9RjyKKYK.xyhk

Para denegar el acceso a algún usuario basta con que borremos la línea correspondiente al mismo. No es necesario que le pidamos a Apache que vuelva a leer su configuración (/etc/init.d/apache2 reload) cada vez que hagamos algún cambio en este fichero de contraseñas, pero si lo es después de hacer los cambios en el fichero de definición del Virtual Host.

autenticación en apacheLa principal ventaja de este método es su sencillez. Sus inconvenientes: lo incómodo de delegar la generación de nuevos usuarios en alguien que no sea un administrador de sistemas o de hacer un front-end para que sea el propio usuario quien cambie su contraseña. Y, por supuesto, que dichas contraseñas viajan en claro a través de la red. Si queremos evitar esto último podemos crear una instancia Apache con SSL.

SEGUNDO METODO

El segundo método que vamos a tocar usa PAM, el propio sistema de autenticación de la máquina donde está instalado nuestro servidor de Apache. Si ya tenemos alguna herramienta de gestión de usuarios y contraseñas en la misma este sistema nos ahora el engorro de tener que generar otro tipo de usuario. En caso contrario no ganamos mucho en este sentido y seguimos teniendo el problema de que las contraseñas viajan en claro con el agravante adicional de que ahora se trata de usuarios de la máquina… así que ya sabéis: o configuráis ssl o usáis el truco que comentamos el otro día por aquí para deshabilitar la conexión remota.

Usaremos para ello el módulo mod_auth_pam y lo primero que tenemos que hacer es instalarlo:

# sudo apt-get install libapache2-mod-auth-pam

En el fichero de configuración del Virtual Host tendríamos que incluir algo así:

<Directory "/var/www/privado">
AuthType Basic
AuthName "Palabra de paso"
AuthPAM_Enabled On
AuthBasicAuthoritative Off
AuthUserFile /dev/null
Require user josemaria gemma fernando araceli
</code>

Si en este caso la directiva usada fuese Require valid-user se permitiría el acceso a cualquier usuario con cuenta en la máquina. Ah, y no olvides hacer un reload de apache después de este cambio.

Sólo nos quedan un par de pasos. Primero, añadir el usuario www-data (el que usa apache) al grupo shadow para que pueda verificar las contraseñas:

usermod -a -G shadow www-data

Y dos, hacer un enlace como el que sigue. Ignoro la causa, pero el motivo de que esto sea necesario es debido a que apache (en los binarios de Debian y Ubuntu, al menos) pretende leer del archivo /etc/pam.d/http mientras que el módulo de autenticación ha creado el archvo /etc/pam.d/apache2. El módulo auth_pam hace años que no está soportado e imagino que esto tiene algo que ver, pero no lo se a ciencia cierta. Simplemente lo leí por ahí…

ln -s /etc/pam.d/apache2 /etc/pam.d/httpd

Y con esto está todo listo. No lo he probado nunca pero también he leído que la autenticación se hace contra el directorio activo si Apache está instalado en una máquina windows configurada en un dominio. Existe también un módulo para autenticar contra un ldap (mod_auth_ldap).

Ejemplos de reglas IPTABLES

  • Muchas de las acciones que se listan abajo requieren ejecutarse como usuario root.
  • Los siguientes comandos deberían funcionar en cualquier distro linux moderna.
  • Esto NO es un tutorial de como configurar iptables.  Es más bien una referencia rápida de los comandos más comunes de iptables.

 

#1: Mostrando el estado de nuestro firewall

Teclea el siguiente comando como root:

iptables -L -n -v

Ejemplos de salidas:

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

El resultado de arriba indica que el firewall no está activo. La siguiente salida es la del firewall activado:

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
  394 43586 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
   93 17292 ACCEPT     all  --  br0    *       0.0.0.0/0            0.0.0.0/0
    1   142 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  br0    br0     0.0.0.0/0            0.0.0.0/0
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           state INVALID
    0     0 TCPMSS     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x06/0x02 TCPMSS clamp to PMTU
    0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
    0     0 wanin      all  --  vlan2  *       0.0.0.0/0            0.0.0.0/0
    0     0 wanout     all  --  *      vlan2   0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  br0    *       0.0.0.0/0            0.0.0.0/0
Chain OUTPUT (policy ACCEPT 425 packets, 113K bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain wanin (1 references)
 pkts bytes target     prot opt in     out     source               destination
Chain wanout (1 references)
 pkts bytes target     prot opt in     out     source               destination

Donde,

  • -L : Muestra las reglas.
  • -v : Muestra información detallada.
  • -n : Muestra la dirección ip y puerto en formato numérico. No usa DNS para resolver nombres. Esto acelera la lista.

#1.1:Para Inspeccionar el firewall con número de lineas:

iptables -n -L -v --line-numbers

Salida:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Chain FORWARD (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           state INVALID
3    TCPMSS     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x06/0x02 TCPMSS clamp to PMTU
4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
5    wanin      all  --  0.0.0.0/0            0.0.0.0/0
6    wanout     all  --  0.0.0.0/0            0.0.0.0/0
7    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
Chain wanin (1 references)
num  target     prot opt source               destination
Chain wanout (1 references)
num  target     prot opt source               destination

Podemos usar los números de línea para borrar o añadir nuevas reglas al firewall.

#1.2: Mostrar las reglas de cadena de entrada y salida:

iptables -L INPUT -n -v
iptables -L OUTPUT -n -v --line-numbers

#2: Parar / Iniciar / Reiniciar el firewall

Si usas CentOS / RHEL / Fedora linux:

service iptables stop
service iptables start
service iptables restart

También se puede usar propio comando iptables para detenerlo y borrar todas las reglas.

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

Donde:

  • -F : Borra todas las reglas.
  • -X : Borra cadenas
  • -t table_name : Selecciona una tabla y elimina reglas
  • -P : Establece la política por defecto (como DROP, REJECT o ACCEPT)

#3: Borrar reglas del firewall

Para mostrar los números de línea junto a otra información para reglas existentes:

iptables -L INPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers
iptables -L OUTPUT -n --line-numbers | less
iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1

Obtendrendremos la lista de IPs. Miramos el número de la izquierda y lo usamos para borrarla. Por ejemplo para borrar la línea 4:

iptables -D INPUT 4

O para encontrar una ip de origen y borrarla de la regla

iptables -D INPUT -s 202.54.1.1 -j DROP

Donde:

  • -D : Elimina una o más reglas de la cadena seleccionada.

#4: Insertar reglas:

Para insertar una o más reglas en la cadena seleccionada como el número de cadena dada usamos la siguiente sintaxis. Primero encontramos el número de línea:

iptables -L INPUT -n --line-numbers

Salida:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

Para insertar una regla entre 1 y 2;

iptables -I INPUT 2 -s 202.54.1.2 -j DROP

Para ver las reglas actualizadas

iptables -L INPUT -n --line-numbers

Salida:

Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       all  --  202.54.1.1           0.0.0.0/0
2    DROP       all  --  202.54.1.2           0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state NEW,ESTABLISHED

#5: Guardar reglas

Para guardar reglas en CentOS / RHEL / Fedora Linux:

service iptables save

En este ejemplo, eliminamos una ip y guardamos las reglas del firewall:

iptables -A INPUT -s 202.5.4.1 -j DROP
service iptables save

Para todas las demás distros usamos:

iptables-save > /root/my.active.firewall.rules
cat /root/my.active.firewall.rules

#6: Restaurar reglas

Para restaurar reglas desde un archivo llamado /root/my.active.firewall.rules:

iptables-restore < /root/my.active.firewall.rules

Bajo CentOS / RHEL / Fedora Linux:

service iptables restart

#7: Estableces políticas de firewall por defecto

Para borrar todo el tráfico:

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -L -v -n
## you will not able to connect anywhere as all traffic is dropped ###
ping cyberciti.biz
wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

#7.1: Solo tráfico entrante bloqueado

Para borrar todos los paquetes entrantes / enviados pero permitir el tráfico saliente:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -L -v -n
# *** now ping and wget should work *** ###
ping cyberciti.biz
wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

#8: Borrar direcciones de red privadas en la interfaz pública

IP Spoofing es nada más que para detener los siguientes rangos de direcciones IPv4 para redes privadas en sus interfaces públicas. Los paquetes con direcciones de origen no enrutables deben rechazarse mediante la siguiente sintaxis:

iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

#9: Bloqueando una direción IP (BLOCK IP)

PAra bloquear una ip atacante llamada 1.2.3.4:

iptables -A INPUT -s 1.2.3.4 -j DROP
iptables -A INPUT -s 192.168.0.0/24 -j DROP

#10: Bloquear peticiones entrantes de un puerto (BLOCK PORT)

Para bloquear todas las solicitudes de servicio en el puerto 80:

iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Para bloquear el puerto 80 para una ip:

iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

#11: Bloquear ips de salida

Para bloquear el tráfico saliente a un host o dominio en concreto como por ejemplo cyberciti.biz:

host -t a cyberciti.biz

Salida:

cyberciti.biz has address 75.126.153.206

Una vez conocida la dirección ip, bloqueamos todo el tráfico saliente para dicha ip así:

iptables -A OUTPUT -d 75.126.153.206 -j DROP

Se puede usar una subred como la siguiente:

iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

#11.1: Ejemplo – Bloquear el dominio facebook.com

Primero, encontrar la dirección ip de facebook.com

host -t a www.facebook.com

Salida:

www.facebook.com has address 69.171.228.40

Buscar el CIDR para 69.171.228.40:

whois 69.171.228.40 | grep CIDR

Salida:

CIDR:           69.171.224.0/19

Para prevenir el acceso externo a facebook.com:

iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

Podemos usar también nombres de dominio:

iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP
iptables -A OUTPUT -p tcp -d facebook.com -j DROP

De la página del man de iptables:

… specifying any name to be resolved with a remote query such as DNS (e.g., facebook.com is a really bad idea), a network IP address (with /mask), or a plain IP address …

#12: Log y borrar paquetes

Escribe lo siguiente para añadir al log y bloquear IP spoofing en una interfaz pública llamada eth1

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Por defecto el log está en el archivo /var/log/messages

tail -f /var/log/messages
grep --color 'IP SPOOF' /var/log/messages

#13: Log y borrar paquetes con un número limitado de entradas al log

El módulo -m limit puede limitar el número de entradas al log creadas por tiempo. Se usa para prevenir que el archivo de log se inunde. Para añadir al log y elminar spoofing cada 5 minutos, en ráfagas de 7 entradas:

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

#14: Aceptar o denegar tráfico desde dirección MAC

iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
## *only accept traffic for TCP port # 8080 from mac 00:0F:EA:91:04:07 * ##
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

#15: Bloquear o permitir peticiones ping ICMP

Para bloquear peticiones ping ICMP

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

Las respuestas al ping también se puede limitar a ciertas redes o hosts.

iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Lo siguiente solo acepta limitados tipos de peticiones ICMP:

### ** assumed that default INPUT policy set to DROP ** #############
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
## ** all our server to respond to pings ** ##
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

#16: Abrir un rango de puertos

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

#17: Abrir un rango de direcciones ip

## only accept connection to tcp port 80 (Apache) if ip is between 192.168.1.100 and 192.168.1.200 ##
iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
## nat example ##
iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

#19: Bloquear o abrir puertos comunes

Replace ACCEPT with DROP to block port:
## open port ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

## open cups (printing service) udp/tcp port 631 for LAN users ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT

## allow time sync via NTP for lan users (open udp port 123) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

## open tcp port 25 (smtp) for all ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

# open dns server ports for all ##
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT

## open http/https (Apache) server port to all ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

## open tcp port 110 (pop3) for all ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT

## open tcp port 143 (imap) for all ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

## open access to Samba file server for lan users only ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

## open access to proxy server for lan users only ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT

## open access to mysql server for lan users only ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

#20: Restringir el número de conexiones paralelas a un servidor por direccion Ip del cliente.

Se puede usar connlimit para crear algunas restricciones. Para permitir 3 conexiones ssh por cliente:

iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Establecer las peticiones HTTP a 20:

iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

donde:

  • –connlimit-above 3 : Coincide si el número de conexiones existentes está por encima de 3.
  • –connlimit-mask 24 : Grupos de hosts usando el prefijo de longitud. Para IPv4, debe ser un número entre 0 y 32 (incluyéndolos.)

#21: HowTO: Use iptables Like a Pro

Para más información sobre iptables, échale un vistazo al manual:

man iptables

Para ver la ayuda en general o de un comando específico:

iptables -h
iptables -j DROP -h

#21.1: Probando nuestro firewall

Conocer si hay puertos abiertos o no:

netstat -tulpn

Es recomendable instalarse un sniffer como tcpdupm y ngrep para probar la configuración de nuestro firewall.

Conclusión

Esta entrada solo lista las reglas básicas para los usuarios nuevos en linux. Se pueden crear reglas más complejas. Requiere una buena comprensión de TCP/IP, tunning del kernel linux via sysctl.conf y un buen conocimiento de nuestra configuración.

Fuente original: cyberciti

Más reglas cortesía de Jker

a)a. Reestablece las reglas por defecto.

sudo su
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

IPtables -nL para ver que estan vacias

b)b. Configura la máquina para que sólo se pueda acceder desde ella a las webs http://www.google.es y http://www.iesgoya.com y a ninguna otra.

iptables -A OUTPUT -d http://www.google.es -j ACCEPT
iptables -A OUTPUT -d http://www.iesgoya.com -j ACCEPT
iptables -A OUTPUT -p tcp –dport 80 -j DROP # Mas exigente –> iptables -A OUTPUT -p all -j DROP

##como google tiene muchas IPs puede que tengamos un problema para ello realizamos lo siguiente antes de la regla EXIGENTE:

iptables -I OUTPUT 1 -d 212.106.221.0/24 -j ACCEPT
iptables -I OUTPUT 1 -d 173.194.0.0/16 -j ACCEPT

# MOstrar las reglas que llevamos hasta el momento:

iptables -nL –line-numbers

#Si queremos borrar reglas:

iptables -D OUTPUT 5

c)c. Cierra todos los puertos bien conocidos menos los necesarios para acceder a estas dos webs.

iptables -A OUTPUT -p TCP –dport 53 -j ACCEPT
iptables -A OUTPUT -p UDP –dport 53 -j ACCEPT
iptables -A OUTPUT -p TCP –dport 1:1024 -j DROP
iptables -A OUTPUT -p UDP –dport 1:1024 -j DROP

d)d. Investiga de qué forma podrías hacer que las peticiones entrantes a tu máquina virtual al puerto 81 por http vayan mediante NAT al puerto 80 de la máquina local (arranca WAMP para comprobar que funciona).

Arrancamos wamp en la maquina fisica y comprobamos que accedemos a wamp desde localhost.
Comprobamos que podemos acceder desde la maquina virtual y se encuentra cortado

Miramos la IP de la maquina virtual.
Ahora desde la maquina fisica intentamos acceder desde el puerto 81 con la IP esa.

Habilitamos el enrutamiento entre tarjetas de red de nuestro equipo:

echo 1 > /proc/sys/net/ipv4/ip_forward

#Ejecutamos las siguientes reglas

iptables -t nat -A PREROUTING -p tcp –dport 81 -j DNAT –to- destination 192.168.203.200:80

iptables -t nat -A POSTROUTING -s 192.168.203.0/24 -j MASQUERADE

#Para ver las reglas introducidas:

iptables -t nat -nL –line-numbers

e)e. Permite sólo los mensajes entrantes desde la IP del compañero de tu máquina física (prueba desde otro sitio para ver si funciona).

iptables -A INPUT -s 192.168.203.200 -j ACCEPT
iptables -A INPUT -j DROP

iptables -A FORWARD -s 192.168.203.200 -j ACCEPT
iptables -A FORWARD -s -j DROP

f) #Activa el log sobre todas las reglas y verifica que se anotan los mensajes.

Insertamos en IPTABLEs las reglas para activar el log:

iptables -I FORWARD 1 -j LOG –log-prefix ‘IPTABLESFORWARD: ‘
iptables -I INPUT 1 -j LOG –log-prefix ‘IPTABLESINPUT: ‘

iptables -t nat -I PREROUTING 1 -j LOG –log-prefix ‘IPTABLESPREROUTING: ‘
iptables -t nat -I POSTROUTING 1 -j LOG –log-prefix ‘IPTABLESPREROUTING: ‘

iptables -I OUTPUT 1 -j LOG –log-prefix ‘IPTABLESOUTPUT: ‘

NOTA: hay que ponerlas las primeras para que haga log antes de rechazarlo.

#Ahora editamos el archivo:

gedit /etc/rsyslog.d/50-default.conf

#E incluimos al final:

kern.warning /var/log/iptables.log

OpenSSL – Resumen uso.

  • admin 

¿como cifrar nuestros documentos y demás utilizando algo que todos aquellos que trabajamos con linux tenemos muy a mano, OpenSSL?

Acceder a openssl: Tecleamos en la consola

~# openssl

Nos saldrá un promt con el siguiente formato.

OpenSSL>

Salir de openssl:

OpenSSL> quit

OpenSSL> q

OpenSSL> exit

Ayuda:

OpenSSL> ?

Nos mostrará una lista de los comandos disponibles.

– Cifrado simétrico –

Encriptar

DES:

OpenSSL> enc -des -in entrada.txt -pass pass:contraseña -out salidaDes.txt

AES:

OpenSSL> enc -aes128 -in entrada.txt -pass pass:contraseña -out salidaAes.txt

Desencriptar

DES:

OpenSSL> enc -d -des -in salidaDes.txt -pass pass:contraseña -out salidaDes2.txt

AES:

OpenSSL> enc -d -aes128 -in salidaAes.txt -pass pass:contraseña -out salidaAes2.txt

– Cifrado asimétrico –

Generar llave del algoritmo asimétrico RSA: Vamos a generar una llave privada de 1020 bits

OpenSSL> genrsa -out privada1.key 1024

Cifrar la clave privada con DES para evitar su uso fraudulento:

OpenSSL> genrsa -out privada2.key -passout pass:contraseña -des 1024

Se realiza este cifrado porque la clave privada se genera como un fichero de texto que cualquiera podría leer, para evitar esto la ciframos.

Generar claves públicas derivadas:

OpenSSL> rsa -in privada1.key -pubout -out publica1.key

OpenSSL> rsa -in privada2.key -pubout -out publica2.key -passin pass:contraseña

Encriptar

OpenSSL> rsautl -pubin -encrypt -in entrada.txt -out salidaRsa.txt -inkey publica1.key

Desencriptar:

OpenSSL> rsautl -decrypt -in salidaRsa.txt -out salidaRsa2.txt -inkey privada1.key

– Funciones hash –

Generar:

OpenSSL> dgst -md5 -out entrada.hsh entrada.txt

– Firma digital –

Generar un par de claves RSA como hemos visto anteriormente:

OpenSSL> genrsa -out privada.key 1024

OpenSSL> rsa -in privada.key -pubout -out publica.key

Firmar el archivo digitalmente:

OpenSSL> dgst -c -sign privada.key -out firmado.sig entrada.txt

El archivo “firmado.sig” contendrá la firma digital en formato binario.

Verificar firma:

OpenSSL> dgst -c -verify publica.key -signature firmado.sig entrada.txt

OpenSSl mostrará un “Verified OK” si todo ha sido correcto, o un “Verification Failure” si algo ha fallado.

Conversión de firmas binarias a texto: Como ya he dicho antes las firmas generadas tienen un formato binario, con lo cual para su envió por correo, por ejemplo, es interesantes pasarlas a texto. Así que vamos a generar una versión en base64.

OpenSSL> base64 -in firmado.sig -out firmado.b64

Como puedes observar, el fichero generado es legible y fácilmente agregable a cualquier texto.

Conversión de firmas en texto a binarias: Para verificar las firmas que nos han llegado en modo texto tendremos que pasarlas a modo binario antes.

OpenSSL> base64 -d -in firmado.b64 -out firmado1.sig

– Certificados digitales –

Crear certificado y archivo de configuración de la autoridad certificadora (“CA”):

Generar un par de claves RSA como hemos visto anteriormente:

OpenSSL> genrsa -out CAprivada.key 1024

OpenSSL> rsa -in CAprivada.key -pubout -out CApublica.key

Crear el archivo de configuración:

Crear el archivo “CAconfig.conf” con el siguiente contenido:

[ req ]
default_bits            =  1024
default_keyfile         =  CAprivada.key
distinguished_name      =  req_distinguished_name
attributes              =  req_attributes
x509_extensions         =  v3_ca
dirstring_type          =  nobmp
[ req_distinguished_name ]
countryName             = Identificador del País (2 letras)
countryName_default     = MX
countryName_min         = 2
countryName_max         = 2
localityName            = Localidad (ej., ciudad)
organizationalUnitName  = Nombre de unidad organizacional (ej., oficina)
commonName              = Nombre común (ej., TU nombre)
commonName_max          = 64
emailAddress            = Dirección de correo electrónico
emailAddress_max        = 40
[ req_attributes ]
challengePassword       = Contraseña para “challenge”
challengePassword_min   = 4
challengePassword_max   = 20
[ v3_ca ]
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always,issuer:always
basicConstraints        = CA:true

Crear el certificado de la autoridad:

OpenSSL> req -new -key CApriv.key -out ca.cer -config CAconfig.cnf -x509 -days 3650

Generar claves para un usuario:

OpenSSL> genrsa -out privadaUser.key 1024

OpenSSL> rsa -in privadaUser.key -pubout -out publicaUser.key

Generar un requerimiento del certificado para este usuario:

OpenSSL> req -new -key privadaUser.key –out req.pem -config CAconfig.cnf

Firmar el requerimiento y generar el certificado del usuario:

OpenSSL> x509 -inform PEM -outform PEM -keyform PEM -CAform PEM -CAkeyform PEM –in req.pem -out certUser.cer -days 365 -req -CA ca.cer -CAkey CAprivado.key -sha1 –CAcreateserial -text

Bueno, hasta aquí la chuleta de hoy. También debéis saber que OpenSSL permite la creación de de certificados digitales para sitios web, pero como esto da por si solo para un post completo, lo dejaremos para otro día si a alguien le interesa.

Espero que la chuleta os sirva de ayuda. Si alguien tiene alguna duda o algo que aportar, como siempre os animo a dejarlos en los comentarios.

Los 10 servicios de Google más populares que han echado el cierre

Hace poco asistimos al anuncio de la desaparición de Google Reader para el 1 de julio de este mismo año, se trata de un lector de RSS que permite organizar y acceder desde su interfaz web a todas las noticias de las páginas incorporadas. Los principales motivos son el descenso de usuarios, la falta de rentabilidad y el deseo de impulsar su red social Google Plus. Éstos y muchos otros han ocasionado el cierre de otros servicios del gigante tecnológico, entre ellos destacan:

Google Wave: creado en 2009 por los mismos ingenieros que inventaron Google Maps. Se trataba de una herramienta que aunaba los servicios de email, mensajería instantánea, redes sociales y wiki. Pero en abril de 2012 cerró, según Google, por tratarse de un servicio demasiado innovador para los usuarios.
iGoogle: conocida anteriormente como “página personalizada de Google” en 2005 pasó a llamarse iGoogle al renovarse el servicio. Se trata de una página personalizable a la que añadir los gadgets de la compañía como el tiempo, noticias, correo, videos… Pero cerrará en noviembre de este año para trasladar a los usuarios a Google Plus.
Google Labs: sitio web que mostraba los nuevos proyectos en desarrollo, en definitiva era una zona de prueba para que conociéramos sus productos antes de ser lanzados y así conocer su aceptación. En 2011 cerró para centrarse en menos productos y dejar el laboratorio de ideas.
Google Buzz: red social añadida a Gmail y anticipo de Google Plus, su duración fue de un poco más de un año.
Google Videos: plataforma para compartir contenido audiovisual y motor de búsqueda de videos. En 2006 Google compró Youtube y su función se limitó únicamente a la búsqueda cambiando su nombre finalmente por el de esta gran red social.

Google Notebook: aplicación que organizaba notas, textos e imágenes mientras navegabas. Actualmente Google Keep sustituye a este servicio.

Google Health: servicio centrado en la sanidad que permitía a los usuarios registrar su historial clínico para que Google te informara sobre posibles contraindicaciones entre medicamentos o alergias. Recibió numerosas críticas por privacidad y cerró el año pasado por la falta de respuesta de los usuarios.

Google Gears: extensión para navegadores que permitía crear aplicaciones más potentes, programar nuevas interacciones u optimizar la navegación, fue un avance del lenguaje HTML5.

Google Code Search: servicio lanzado en Labs para programadores que permitía buscar dentro del código de las páginas. Anunció su cierre en octubre de 2011 ya que sus funcionalidades ya estaban incorporadas en Google Code Hosting.

SQL92 Joins, INNER JOIN, FULL OUTER JOIN, LEFT OUTER JOIN.

Una simple ayuda

El lenguaje SQL es aveces el gran olvidado por los desarrolladores, cada vez abundan mas los frameworks que abstraen al desarrollador del contacto con el modelo de negocio.

He escrito este documento, basándome en otros similares para ayudar a entender con un diagrama de Vann, los diferentes tipos de Join’s que SQL92 soporta.

Existen tecnologías que abstraen completamente del modelo de negocio, para el desarrollador funcionan creando una serie de clases de Dominio que define el modelo, sin importar qué base de datos o de qué fabricante sea esta. Por ejemplo Ruby on Rails, GRails, … usando un conjunto de tecnologías, como Hibernate configuradas por convencióndentro del propio framework.

También es muy extendido el uso de aplicaciones que permiten modelar el negocio de forma gráfica, ERM (como DBSchema), y normalmente después se usa un ORM’s que les hacen el trabajo sucio de forma elegante y segura.

Todo vale, pero la realidad de las empresas TIC es que necesitan profesionales serios y conscientes que entiendan y controlen todas las capas para que un sistema funciona como se espera y está diseñado, y no se deje nada al azar.

El desarrollador, muy frecuentemente recurre a activar trazas o aplicaciones de monitorización de actividad que nos desvelen, qué está haciendo nuestro framework con nuestro modelo de negocio. Existen aplicaciones que esnifan directamente de la base de datos esta información para que podamos analizarla, el obsoleto Profile y Analyzer que incluía Microsoft SQL Server es un ejemplo de ellos.

Finalmente cuando tenemos delante la query sucede que hace tanto tiempo que no trabajamos con SQL que no entendemos qué hace exactamente, sobre todo si está trabajando con tablas relacionadas y nos encontramos con una consulta que afecta a varias entidades.

Espero que este documento ayude a reducir el tiempo invertido a descubrir porqué se comporta una SQL de un modo u otro.

Convenciones

Este documento asume que siempre que la «TABLA A» esta a la izquierda y la «TABLA B» a la derecha de las sentencias.

Para los ejemplos vamos a utilizar 2 tablas que van a contener los siguientes datos:

id name | id name
1 Roberto | 1 Alex
2 Juan | 2 Carlos
3 Rubén | 3 Juan
4 Carlos | 4 Saúl

 

INNER JOIN

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

id name | id name
2 Juan | 2 Carlos
4 Carlos | 3 Juan

El resultado son solo el conjunto de registros que coinciden en ambas tablas.

Inner Join

FULL OUTER JOIN

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

id name | id name
1 Roberto | null null
2 Juan | 3 Juan
3 Rubén | null null
4 Carlos | 2 Carlos
null null | 1 Alex
null null | 4 Saúl

El resultado es el conjunto total de registros de ambas tablas, coincidiendo aquellos registros cuando sea posible. Si no hay conicidencias, se asignan nulos.

Full Outer Join

FULL OUTER JOIN WHERE

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null

id name | id name
1 Roberto | null null
3 Rubén | null null
null null | 1 Alex
null null | 4 Saúl

El resultado es un conjunto de records únicos en la TablaA y en la TablaB, hacemos el Full Outer Join y excluimos los registros que no queremos con el Where

Full Outer Join con Where

LEFT OUTER JOIN

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

id name | id name
1 Roberto | null null
2 Juan | 3 Juan
3 Rubén | null null
4 Carlos | 2 Carlos

El resultado son todos los registros de la TablaA, y si es posible las coincidencias de la TablaB. Si no hay coincidencias, el lado derecho mostrará nulos.

Left Outer Join

LEFT OUTER JOIN WHERE

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

id name | id name
1 Roberto | null null
3 Rubén | null null

El resultado es un conjunto de registros que solo están en la TablaA, no en la TablaB. Hacemos lo mismo que en un Left Outer Join, pero eliminamos los registros que no queremos de la TablaB con el Where

Left Outer Join con Where

CROSS JOIN

Existe también la posibilidad de cruzar todos los registros con todos (producto cartesiano), imposible de dibujar con undiagramas Venn

SELECT * FROM TableA CROSS JOIN TableB

Imaginarse el resultado de todos los registros por todos es muy fácil, si tenemos 4 registros en cada tabla 4 x 4 = 16.

Cross Join
¡Ojo al hacer esto en tablas con muchos registros!