Protege tus logs: logrotate + cifrado GPG

por | junio 1, 2018

Logrotate necesita pocas presentaciones ya que es una herramienta clásica para el rotado de logs en nuestro sistema. Podemos configurarla conjuntamente con GPG de una manera sencilla para cifrar y proteger los logs rotados y que sólo puedan ser accesibles por personal autorizado en posesión de la clave de descifrado correspondiente.

Creación del par de claves con GPG

Crearemos nuestro par de claves público/privada con el comando gpg --full-generate-key y seleccionaremos en cada pregunta la opción que necesitemos. Para el ejemplo he utilizado el nombre de usuario elarraydejota y como correo mail@example.com:

[root@jota-pc ~]$ gpg --full-generate-key
gpg (GnuPG) 2.1.18; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: elarraydejota
Email address: mail@example.com
Comment: 
You selected this USER-ID:
    "elarraydejota <mail@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

Una vez demos por válidas las respuestas se nos pedirá una frase de paso (passphrase) para proteger las claves. Acto seguido es necesario que se genere cierta entropía:

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Finalizado este paso la clave habrá sido generada:

gpg: key F101D036957320AF marked as ultimately trusted
gpg: directory '/root/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/8227ABE84C0FBHC69A297729F101D036957320AF.rev'
public and secret key created and signed.

pub   rsa2048 2018-05-19 [SC]
      8227ABE84C0FBHC69A297729F101D036957320AF
      8227ABE84C0FBHC69A297729F101D036957320AF
uid                      elarraydejota <mail@example.com>
sub   rsa2048 2018-05-19 [E]

Configurar logrotate para cifrar el log con GPG

Tendremos que añadir el siguente fragmento en el fichero de configuración de logrotate donde queramos cifrar los logs rotados:

compresscmd /usr/bin/gpg
compressoptions --encrypt --default-key key-id --recipient user-id
compressext .gpg

Como user-id utilizaremos el correo o el nombre real. El key-id lo obtenemos con el comando:

gpg --list-keys --keyid-format short

Que nos mostrará:

pub   rsa2048/957320AF 2018-05-19 [SC]
      8227ABE84C0FBHC69A297729F101D036957320AF
uid         [ultimate] elarraydejota <mail@example.com>
sub   rsa2048/3FE71259 2018-05-19 [E]

El key-id es 957320AF, es decir, los 8 caracteres alfanuméricos que están a continuación del algoritmo de cifrado rsa2048 de la primera línea o bien en la segunda línea los últimos 8 caracteres.

Así por ejemplo en el fichero /etc/logrotate.d/rsyslog para el log syslog tendríamos inicialmente la configuración:

var/log/syslog
{
    rotate 14
    daily
    missingok
    notifempty
    dateext
    delaycompress
    compress
    postrotate
        invoke-rc.d rsyslog rotate > /dev/null
    endscript
}

Quedaría:

var/log/syslog 
{
    rotate 14
    daily
    missingok
    notifempty
    dateext
    delaycompress
    compress
    compresscmd /usr/bin/gpg
    compressoptions --encrypt --default-key 957320AF --recipient mail@example.com
    compressext .gpg
    postrotate
        invoke-rc.d rsyslog rotate > /dev/null
    endscript
}

Podemos esperar al siguiente rotado para comprobar que los logs se cifran correctamente (aparecerán con la extensión .gpg) o podemos lanzar manualmente logrotate con:

logrotate --force /etc/logrotate.conf

Si están cifrados veremos la extensión .gpg en el directorio donde se estén rotando los logs:

Al hacer un cat del fichero el contenido será ilegible ya que está cifrado:

Para descifrar el fichero utilizaremos la opción -d:

gpg -d syslog-20180530.gpg

Se nos pedirá el passphrase y ya podremos ver su contenido.