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
Cosas tecnicas « Blog personal de Damià

Archive for the ‘Cosas tecnicas’ Category

Automatización de Let’s Encrypt en Debian

Thursday, 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.

Como montar una particion RAID-LVM por USB

Tuesday, 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

Tuesday, 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!

    Como montar un disco externo con RAID y LVM: receta

    Wednesday, August 18th, 2010

    Habitualmente instalo maquinas Debian con RAID software y LVM, hasta hoy no habia necesitado acceder al disco desde fuera del sistema, hoy he necesitado montar uno de esos discos por usb para leer la información, dado que es un poco lioso lo dejo documentado en esta receta/post, para mi uso futuro o para el uso de otros que lo necesiten.

    Basicamente hay dos pasos, montar el RAID y montar el LVM

    Primero que nada vamos a ver cfdisk las particiones:


    #cfdisk /dev/sdg

    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, en la que estamos interesados es la /dev/sdg3

    Entonces ejecutamos:

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

    Editamos el fichero /etc/mdadm/mdadm.conf y le añadimos la linea que nos ha dado el comando anterior en la lista de ARRAY.
    Y 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.

    ¡Ya esta ya tenemos el RAID montado!

    # cat /proc/mdstat
    Personalities : [raid1]
    md2 : active (auto-read-only) raid1 sdg3[0]
    385841024 blocks [2/1] [U_]

    Ahora vamos a por la parte de 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 activar las particiones hacemos:


    #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 volumentes disponibles:

    Ok, now we have All the volumes available:


    # mount /dev/rootmd/homevg /mnt1

    ¡Esto es todo!

    Reproductor multimedia con Linux: emtec n200

    Wednesday, July 22nd, 2009

    Recientemente he adquirido un reproductor multimedia para ver todo tipo de ficheros en la Television, el cacharro ha sido un Emtec n200, el cacharro es como un disaco duro multimedia, pero sin tener disco duro incorporado, por lo que puede leer discos usb conectados, o lo que es mas interesante montado recursos compartidos de otro ordenador. Pues bien urgando un poco mas resulta que esta montado con Linux y Emtec ha liberado la modificaciones opensource que han realizado MovieCube_SourceCode. Por ahora no se han desarrollado firmware alternativos, pero todo hace pensar que iran apareciendo cosas, mientras tanto le he pasado un nmap al cacharro y me he encontrado con el puerto 80 y el 23 abiertos:

    n200


    nmap 192.168.1.100

    Starting Nmap 4.62 ( http://nmap.org ) at 2009-07-22 17:09 CEST
    Interesting ports on 192.168.1.100:
    Not shown: 1713 closed ports
    PORT STATE SERVICE
    23/tcp open telnet
    80/tcp open http

    Nmap done: 1 IP address (1 host up) scanned in 8.995 seconds

    Accediendo por web aparece un cgi que suma de ejemplo, ¡Que cutre! Como sacan eso en el producto definitivo, pero esperen no se vayan todavia, si hacemos un telnet….


    telnet 192.168.1.100
    Trying 192.168.1.100...
    Connected to 192.168.1.100.
    Escape character is '^]'.
    Venus login: root
    warning: cannot change to home directory

    BusyBox v1.1.3 (2009.05.11-02:44+0000) Built-in shell (ash)
    Enter 'help' for a list of built-in commands.

    / #

    Si ponemos root, y no ponemos password, estamos dentro…. y podemos ver un poco las cosas por dentro


    # uname -a
    Linux Venus 2.6.12.6-VENUS #1 Mon May 11 10:42:33 CST 2009 mips unknown

    # ps ax
    PID Uid VmSize Stat Command
    1 root 364 S init
    2 root SWN [ksoftirqd/0]
    3 root SW< [events/0] 4 root SW< [khelper] 5 root SW< [kthread] 6 root SW< [kblockd/0] 7 root SW [khubd] 8 root SW [pdflush] 9 root SW [pdflush] 11 root SW< [aio/0] 12 root SW< [cifsoplockd] 13 root SW< [cifsdnotifyd] 10 root SW [kswapd0] 14 root SW [eth0] 15 root SW [mtdblockd] 27 root 368 S init 28 root 368 S init 31 root 368 S init 34 root 368 S init 55 root SW< [sata_eh/0] 60 root 404 S inetd 65 root SW [scsi_eh_0] 66 root SW [scsi_eh_1] 82 root 168 S ./RootApp DvdPlayer 83 root 168 S ./RootApp DvdPlayer 86 root 8764 S < DvdPlayer 87 root 168 S ./RootApp DvdPlayer 94 root 8764 S DvdPlayer [...] 146 root 8764 S DvdPlayer 147 root 8764 S DvdPlayer 148 root 8764 S DvdPlayer 149 root 8764 S DvdPlayer 156 root SW [scsi_eh_2] 157 root SW [usb-storage] 173 root 360 S /sbin/udhcpc -p /var/lock/udhcpc_eth0.pid -t 15 -b -s 1197 root SW [cifsd] 1207 root 8764 S DvdPlayer 1208 root 8764 S DvdPlayer 1211 root 8764 S DvdPlayer 1259 root 8764 S DvdPlayer 1285 root 308 S telnetd 1286 root 488 S -sh 1301 root 352 R ps ax # mount
    /dev/root on / type yaffs2 (ro,noatime)
    none on /dev type devfs (rw)
    none on /proc type proc (rw,nodiratime)
    devpts on /dev/pts type devpts (rw)
    none on /sys type sysfs (rw)
    /dev/mtdblock/2 on /usr/local/etc type yaffs2 (rw,noatime)
    none on /tmp type ramfs (rw)
    /dev/rd/0 on /mnt/rd type vfat (rw,nodiratime,fmask=0022,dmask=0022,codepage=cp437,iocharset=iso8859-1)
    //192.168.1.22/OPT2 on /tmp/netb/mnt/My_Shortcuts/SAMPLESERVER:damia/OPT2 type cifs (rw,nodiratime,recovery,unc=\\192.168.1.22\OPT2,username=sample,domain=SAMPLE.NET,rsize=32768,wsize=57344)

    # cat /proc/cpuinfo
    system type : Realtek Venus
    processor : 0
    cpu model : MIPS 24K V7.8
    BogoMIPS : 269.51
    wait instruction : yes
    microsecond timers : yes
    tlb_entries : 32
    extra interrupt vector : yes
    hardware watchpoint : yes
    ASEs implemented : mips16
    VCED exceptions : not available
    VCEI exceptions : not available

    # cat /proc/meminfo
    MemTotal: 121856 kB
    MemFree: 29672 kB
    Buffers: 60 kB
    Cached: 6800 kB
    SwapCached: 0 kB
    Active: 10788 kB
    Inactive: 1448 kB
    HighTotal: 0 kB
    HighFree: 0 kB
    LowTotal: 121856 kB
    LowFree: 29672 kB
    SwapTotal: 32 kB
    SwapFree: 32 kB
    Dirty: 0 kB
    Writeback: 0 kB
    Mapped: 10028 kB
    Slab: 4392 kB
    CommitLimit: 60960 kB
    Committed_AS: 10640 kB
    PageTables: 388 kB
    VmallocTotal: 1048548 kB
    VmallocUsed: 1012 kB
    VmallocChunk: 1047176 kB

    Mirando el /etc


    # ls -l /etc
    -rw-r--r-- 1 1010 1013 341 May 11 2009 fstab
    lrwxrwxrwx 1 1010 1013 22 Jun 4 2009 group -> ../usr/local/etc/group
    -rw-r--r-- 1 1010 1013 6 May 11 2009 hostname
    -rw-r--r-- 1 1010 1013 20 May 11 2009 hosts
    -rw-r--r-- 1 1010 1013 385 May 11 2009 httpd.conf
    -rw-r--r-- 1 1010 1013 460 May 11 2009 inetd.conf
    drwxr-xr-x 1 1010 1013 2048 May 11 2009 init.d
    lrwxrwxrwx 1 1010 1013 28 Jun 4 2009 ld.so.cache -> ../usr/local/etc/ld.so.cache
    lrwxrwxrwx 1 1010 1013 27 Jun 4 2009 ld.so.conf -> ../usr/local/etc/ld.so.conf
    lrwxrwxrwx 1 1010 1013 14 Jun 4 2009 mtab -> ../proc/mounts
    lrwxrwxrwx 1 1010 1013 23 Jun 4 2009 passwd -> ../usr/local/etc/passwd
    lrwxrwxrwx 1 1010 1013 24 Jun 4 2009 passwd- -> ../usr/local/etc/passwd-
    lrwxrwxrwx 1 1010 1013 24 Jun 4 2009 profile -> ../usr/local/etc/profile
    drwxr-xr-x 1 1010 1013 2048 May 11 2009 reexec_init
    lrwxrwxrwx 1 1010 1013 26 Jun 4 2009 resolv.conf -> /usr/local/etc/resolv.conf
    -rw-r--r-- 1 1010 1013 20373 May 11 2009 services
    -rw-r--r-- 1 1010 1013 7 May 11 2009 system_svn_version
    -rwxr-xr-x 1 1010 1013 1893 May 11 2009 udhcpc.script

    Seguro que alguien mas como yo ya lo esta mirando para hackearlo, y hacer cosas nuevas con el.

    PD: Por lo visto no es tan facil meterle mano, ya que lo que es el core que reproducr, accede al video, etc.. esta metido en un binario que no es GPL. Mas info aqui