Deprecated: Function automatic_feed_links is deprecated since version 3.0.0! Use add_theme_support( 'automatic-feed-links' ) instead. in /www/htdocs/wordpress/wp-includes/functions.php on line 6121
Blog personal de Damià

Automatización de Let’s Encrypt en Debian

December 3rd, 2015

letsencrypt
Gracias a la inciativa https://letsencrypt.org/ respaldado por Akamai, Cisco, Mozilla and EFF, vamos a poder disponer de certificados SSL gratuitos. En este post os explicare como he automatizado el proceso de generación y renovación en un servidor Debian, con diversos virtualhost, modificando lo menos posible y de una manera muy controlada los ficheros de configuración de apache.

La intención del proyecto LETSENCRYPT es extender al máximo la utilización de certificados SSL, para ello los propios servidores podran autogenerar sus certificados sin interacción manual, para forzar que todo sea automatico, los certificados tendran 90 dias de validez, obligandonos a todos los administradores de sistemas a automatizar el proceso.

Para generar un certicado, la Autoridad de Certificación de Let’s Encrypt, consulta el DNS y accede a tu servidor web preguntandole por unas credenciales para de esta manera validar la generación o renovación del certificado.
Por lo tanto el servidor web debe de responder a las consultas realizadas por CA, para la emisión y renovación de los certificados. El software de letsencrypt es capaz de modificar los ficheros de configuración de apache, o incluso levantar un servidor propio. Ninguno de los dos metodos me convencen, quiero tener pleno control de todas las modificaciones en la configuración de apache, dispongo de diversidad de virtualhost con configuraciones muy especificas, el levantar un servidor independiente hace que dejes de dar servicio por lo que tampoco es aceptable. Afortunadamente Letsencrypt proporciona un mecanismo denominado webroot, por el cual lo unico que necesita es dejar un fichero en algun lgugar accesible del website, con este modo podemos automatizar plenamente el proceso y mantener pleno control sobre lo que esdta sucediendo.

Lo primero de todos es seguir la instrucciones de instalación de letsencrypt (Probado en Debian jessie y Debian Wheezy)


apt-get install git
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto

Vamos allá, la única modificación necesaria en cada virtualhost para poder responder a la autenticación de Let’s encrypt es:


Alias /.well-known /var/www/html/le/.well-known

Reiniciamos el apache, y ya podemos lanzar el comando para la emisión y renovación del certificado.


/root/.local/share/letsencrypt/bin/letsencrypt --renew-by-default -a webroot --webroot-path /var/www/html/le/ --server https://acme-v01.api.letsencrypt.org/directory --email admin@damia.net --text --agree-tos --agree-dev-preview -d eblog.damia.net auth

Con esto ya tenemos los certificados listos:

/etc/letsencrypt/live/eblog.damia.net/cert.pem
/etc/letsencrypt/live/eblog.damia.net/chain.pem
/etc/letsencrypt/live/eblog.damia.net/fullchain.pem
/etc/letsencrypt/live/eblog.damia.net/privkey.pem

Podemos añadir otro virtualhost en el puerto 443, con:

[...]
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/eblog.damia.net/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/eblog.damia.net/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/eblog.damia.net/fullchain.pem
[...]

Hecho, ya tenemos nuestra web segura.

Ahora podemos automatizar el proceso de creación y renovación de certificados, He desarrollado un script que realiza las siguiente tareas:

  • Comprueba la fecha de expiración de los certificados y los renueva cuando estan por debajo de un numero de dias definido.
  • Comprueba que letsencrypt puede acceder al directorio de validación
  • Envia un correo al administrador si no puede renovar lso certificados.

Puedes ver el codigo a continuación o descargarte el fichero desde aqui: autole


#!/bin/bash
##
##
## LETS ENCRYPT AUTOMATION
##
## by Damia Soler
## Contact damia (at) damia (dot) net
## https://blog.damia.net
## https://github.com/damiadev/autole/
##
##
##==================================================
## SETUP
##
##
##
## REMAINING DAYS TO EXPIRE BEFORE RENEW
##
DAYSTORENEW=10
##
## REMAINING DAYS TO EXPIRE BEFORE ALERT
##
DAYSTOALERT=5
##
## EMAIL TO ALERT IF UNABLE TO RENEW
##
ALERTEMAIL=root@localhost
##
## EMAIL ACCOUNT ON LETS ENCRYPT
##
LEEMAIL=admin@example.com
##
WEBROOT=/www/htdocs/le/
##WEBROOT=/www/htdocs/le/$1
##
##
LEBIN=/root/.local/share/letsencrypt/bin/letsencrypt
##
CERTFILE=/etc/letsencrypt/live/$1/cert.pem
##====================================================================================
if test $1 = "--renew-all" ; then
echo Checking certificates
ls -1 /etc/letsencrypt/live|xargs -n1 $0 ;
/etc/init.d/apache2 graceful
exit ;
fi;
##====================================================================================
if test -a $CERTFILE ; then
d1=$(date -d "`openssl x509 -in $CERTFILE -text -noout|grep "Not After"|cut -c 25-`" +%s)
d2=$(date -d "now" +%s)
DAYS=` echo \( $d1 - $d2 \) / 86400 |bc `
echo -n `date` DOMAIN $1 will expire in $DAYS days " "
else
echo -n `date` DOMAIN $1 new
DAYS=$DAYSTOALERT;
fi;
if test $DAYS -lt $DAYSTORENEW ; then
echo Trying to renew ;
### PRETEST TO NOT MESS LE SERVERS IF YOU ARE NOT ANSWERING THE CHALLENGE
TESTFILE=$RANDOM
echo test> $WEBROOT/.well-known/acme-challenge/$TESTFILE
URL=http://$1/.well-known/acme-challenge/$TESTFILE
mkdir -p $WEBROOT/.well-known/acme-challenge
touch $WEBROOT/.well-known/acme-challenge/index.html
echo test> $WEBROOT/.well-known/acme-challenge/$TESTFILE
if curl --output /dev/null --silent --head --fail "$URL"; then
echo $LEBIN --renew-by-default -a webroot --webroot-path $WEBROOT --email $LEEMAIL --text --agree-tos -d $1 auth
$LEBIN --renew-by-default -a webroot --webroot-path $WEBROOT --email $LEEMAIL --text --agree-tos -d $1 auth
echo SSLEngine on
echo SSLCertificateFile /etc/letsencrypt/live/$1/cert.pem
echo SSLCertificateKeyFile /etc/letsencrypt/live/$1/privkey.pem
echo SSLCertificateChainFile /etc/letsencrypt/live/$1/fullchain.pem
else
echo "CAN NOT ACCESS THE PRE-CHALLENGE $URL PLEASE ADD ALIAS TO YOUR VIRTUALHOST CONF" ;
echo "Alias /.well-known $WEBROOT/.well-known" ;
fi
rm $WEBROOT/.well-known/acme-challenge/$TESTFILE
else
echo no close to expire ;
fi ;
if test $DAYS -lt $DAYSTOALERT ; then
echo ALERT DOMAIN $1 CERTIFICATE RENEWAL PROBLEM|mail $ALERTEMAIL ;
echo ALERT DOMAIN $1 CERTIFICATE RENEWAL PROBLEM ;
fi;

 

You can use

./autole www.mydomain.com

And you will have your new certificate available for this domain. (remeber to add previously the alias on apache).

And

./autole --renew-all

And all your certificates will be renewed. The idea is to add this to the crontab, and your certificates will be ready and renew automatically.

 

AVISO: A día de hoy con Debian 9 “stretch” ya no es necesario hacer este hack, el paquete dehydrated que viene en la propia distribución hace todo el trabajo de manera similar.

Lego Wedo en Debian con scratch

September 7th, 2014

Recientemente le he comprado a mi hijo el juego Lego Wedo, se compone de diversas piezas de Lego technic y un Hub USB al que le puedes conectar un motor y dos sensores, uno de distancia y otro de inclinación. Todo funciona con el software de Lego de manera nativa en Windows y Osx pero no con Linux. El software incluido proporcionado incluye un herramienta gráfica educativa basada en scratch.

lego wedo debian

Scratch es una herramienta de programación educativa diseñada por el MIT, puedes encontras mas info de ella en el website de scratch.

El software que proporciona Lego es una versión simplificada y sencilla de scratch, tiene menos opciones, botones mas grandes, y sonidos que que encajan con los diseños propuestos en las instrucciones. El software no es gratuito, cuesta 85€ y se vende a parte de la caja de iniciación (!??). Por suerte es posible utilizar el software original scratch del MIT con Lego Wedo y Linux.
Hay dos versiones de scratch, la 2.0 es online basada en web y que no funciona con Lego y Linux, sin embargo la versión antigua 1.4 funciona con Lego y viene incluida en Debian Wheezy.

Solo hace falta instalar el paquete con:

apt-get install scratch squeak-plugins-scratch

Ahora puede conectar el Hub de Lego al puerto USB, y compobar si es detectado:

[31412.408152] usb 3-3: new low-speed USB device number 2 using ohci_hcd
[31412.575322] usb 3-3: New USB device found, idVendor=0694, idProduct=0003
[31412.575333] usb 3-3: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[31412.575339] usb 3-3: Product: LEGO USB Hub V1.00
[31412.895290] generic-usb 0003:0694:0003.0001: hiddev0,hidraw0: USB HID v1.10 Device [LEGO USB Hub V1.00] on usb-0000:00:12.0-3/input0
[31412.895346] usbcore: registered new interface driver usbhid
[31412.895350] usbhid: USB HID core driver

Vemos que no funciona, por lo que hay que añadir un regla en el udev, para hacerlo hay que crear este fichero:

/etc/udev/rules.d/99-wedo.rules con este contenido
ATTRS{idVendor}=="0694", ATTRS{idProduct}=="0003", SUBSYSTEMS=="usb", ACTION=="add", MODE="0666", GROUP="plugdev"

Reiniciamos udev con
/etc/init.d/udev restart

Ahora todo esta listo, iniciamos scracth desde Aplicaciones -> Educación -> Scracth

Mostramos las opciones de Lego Wedo que estaban ocultas desde menu Editar

lego wedo debian

Ahí encontraremos las nuevas opciones del motor

lego wedo debian

Y en la seccion de sensores encontramos los sensores de Lego Wedo de inclinación y distancia.

lego wedo debian

Para esperar hasta que uno de los sensores detecte uns condición, podemos usar esta estructura, una condición de espera, un operador y una caja de sensor como esta:

lego wedo debian

Esto esto, ya esta Lego Wedo funcionando con scratch. ¡A disfrutar!

www.Securityartwork.es

February 1st, 2012

En este post me gustaria recomendaros el blog de www.securityartwork.es creado por la empresa S2 Grupo donde sigo teniendo buenos amigos.
Conjunta muy bien interesantes articulos sobre seguridad técnica y seguridad orgranizativa, con muy nivel. Me gustaria mis post en dicho blog que creo que encontrareis interesantes.

Como montar una particion RAID-LVM por USB

May 31st, 2011

Normalmente instalo Debian en todo mis servidores, y normalmente uso RAID por software y gestor de volúmenes lógicos LVM, hasta hoy no había necesitado montar uno de estos discos de manera externa, es un poco lioso y por ello he decidido escribir este post para que sirva como receta, a otros que que necesiten hacer lo mismo.

Básicamente hay dos pasos uno montar el RAID, y el otro montar el LVM.
Suponemos que tenemos el disco pinchado por USB.

Lo primero es hacer un cfdisk para ver las particiones:

# cfdisk

sdg5 Lógica Linux raid autodetect 3997,46 *
sdg2 Primaria Linux raid autodetect 1003,49
sdg3 Primaria Linux raid autodetect 395101,33
sdg4 Primaria NTFS [] 100002,96

De acuerdo la partición que queremos es la /dev/sdg3.

Entonces ejecutamos:

# mdadm --examine --scan /dev/sdg3

ARRAY /dev/md2 level=raid1 num-devices=2 UUID=10e9ab2b:97f55678:84e7df75:fb5ca897

Entonces editamos el fichero /etc/mdadm/mdadm.conf y añadimos la linea anterior a la lista, y luego hacemos

/etc/init.d/mdadm-raid stop
/etc/init.d/mdadm-raid start
Assembling MD array md2...done (degraded [1/2]).
Generating udev events for MD arrays...done.

Primer paso conseguido ya tenemos el RAID operativo.
# cat /proc/mdstat
Personalities : [raid1]
md2 : active (auto-read-only) raid1 sdg3[0]
385841024 blocks [2/1] [U_]

Ahora viene la parte del LVM

# pvscan

[…]
PV /dev/md2 VG rootmd lvm2 [367,96 GB / 188,00 MB free]
[…]

# lvscan
[….]
inactive '/dev/rootmd/rootvg' [18,00 GB] inherit
inactive '/dev/rootmd/homevg' [349,78 GB] inherit

[…]

Para activarla, usamos:

#lvchange -ay rootmd/homevg
#lvchange -ay rootmd/rootvg
#lvscan

ACTIVE '/dev/rootmd/rootvg' [18,00 GB] inherit
ACTIVE '/dev/rootmd/homevg' [349,78 GB] inherit

Ahora ya tenemos los volúmenes disponibles:

Solo queda montar la partición
# mount /dev/rootmd/homevg /mnt1

¡Y ya esta!

Receta: Como hacer el “rescate” de una instancia Linux en Amazon Ec2

May 31st, 2011

Imaginate que tienes una máquina en Amazon Ec2, y por lo que sea pierdes tus claves ssh, o passwords, o la dejas inaccesible. Como puedes hacer un password recovery? Es facil, te creas otra máquina montas el disco. Veamos cuales son los pasos:

  • Paras la máquina
  • Desconectas el disco de la máquina (Detach)
  • Crea una nueva maquina en la misma zona de disponibilidad, por ejemplo una instancion Micro de fedora, y la arrancas.
  • Conectas el volumen a tu nueva máquina (Attach). Por ejemplo /dev/sdh. No uses elasticFox para hacer esto, al menos a mi no me funcionó. Usa en su lugar la propia web de AWS de Amazon.
  • Monta el disco, cambia passwordfs, añade clave ssh, recupera datos o cualquier otra acción de rescate que necesites.
  • Desmonta la partición
  • Ahora ya puedes “Terminar” la instancia temporal, ya no la necesitas mas.
  • Conecta la partición a la misma máquina donde estaba, no uses elasticFox (a mi no me funciona), usa la web de Amazon, IMPORTATE conectalo como /dev/sda1
  • Inicia la instancia.
  • ¡Esto es todo!