Un blog mas

Bitácora de vuelo

Fail2ban es una herramienta que monitorea los logs y se activa (ejecutando una acción) cuando detecta un patrón sospechoso previamente definido (filtro).

Para instalar Fail2ban y sus dependencias en Ubuntu solo debemos ejecutar en una terminal el siguiente comando:

sudo apt-get install fail2ban

El archivo de configuraci&ocaute;n principal está es /etc/fail2ban/jail.conf y contiene de conjunción de los patrones a buscar y acciones a ejecutar por cada servicio monitoreado. Un ejemplo que viene configurado por default en el archivo es la sección [ssh] donde podemos ver habilitado el filtro sshd que buscará sobre el archivo log /var/log/auth.log la cantidad de maxretry definidas (en este caso 6).

[ssh]
 
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6

La entrada «filter = sshd» está definida en el archivo /etc/fail2ban/filter.d/sshd que básicamente se compone por una expresión regular que tratará de encajar sobre el log pasado como parámetro.

Debemos reiniciar el servicio para que los cambios tengan efecto:

sudo service fail2ban restart

Pero esta regla solo generará una entrada en el log /var/log/fail2ban.log con el siguiente aviso.

2018-01-24 12:30:59,401 fail2ban.actions: WARNING [ssh] Ban 10.10.10.10

Si queremos ir un paso adelante, podemos construir reglas reactivas que bloqueen la IP del host que está intentando conectarse a nuestro server. Para ello vamos a modificar un poco la sección [ssh-iptables-ipset4] en primer lugar habilitando dicha regla, luego apuntando el logpath al archivo correcto y para finalizar definiendo una acción a ejecutar la cual bloqueará la IP en cuestión mediante el comando definido en iptables-ipset-proto4.

[ssh-iptables-ipset4]
 
enabled  = true
port     = ssh
filter   = sshd
banaction = iptables-ipset-proto4
logpath  = /var/log/auth.log
maxretry = 6

Donde ahora tenemos establecido el parámetro banaction que se define en el archivo /etc/fail2ban/action.d/iptables-ipset-proto4.conf que modifica las reglas de nuestro firewall mediante iptables y ipset*

* Si no tenemos ipset instalado, ejecutar sudo apt-get install ipset

Si ahora intentamos un acceso desde nuestro HOST de prueba 10.10.10.10 no solo veremos en el log de fail2ban la siguiente linea:

2018-01-24 12:39:33,325 fail2ban.actions: WARNING [ssh-iptables-ipset4] Ban 10.10.10.10

sino que además en las reglas de iptables tendremos una entrada como la siguiente:

REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 22 match-set fail2ban-ssh-iptables-ipset4 src reject-with icmp-port-unreachable

donde el set de IPs a bloquear ahora incluye la 10.10.10.10

# ipset list fail2ban-ssh-iptables-ipset4
Name: fail2ban-ssh-iptables-ipset4
Type: hash:ip
Revision: 2
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16520
References: 1
Members:
10.10.10.10

Podemos verificar el funcionamiento de las reglas de firewall intentando conectarnos nuevamente.

# ssh pablo@10.10.10.1
ssh: connect to host 10.10.10.1 port 22: Connection refused

Las secciones en el archivo /etc/fail2ban/jail.conf otros parámetros que se pueden definir.

bantime = 600 # Tiempo de baneado en segundos.
destemail = usuario@ejemplo.com # Destinatario de correo para aviso de visitante bloqueado

Probar una regla
Existe una forma sencilla de probar las expresiones regulares de nuevas reglas sobre un archivo log para verificar si aplica como nosotros queremos, sin que este afecte al sistema.

# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf 
 
Running tests
=============
 
Use   failregex file : /etc/fail2ban/filter.d/sshd.conf
Use         log file : /var/log/auth.log
 
 
Results
=======
 
Failregex: 13 total
|-  #) [# of hits] regular expression
|   3) [11] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)?\s(?:\[ID \d+ \S+\])?\s*Failed \S+ for .*? from <HOST>(?: port \d*)?(?: ssh\d*)?(: (ruser .*|(\S+ ID \S+ \(serial \d+\) CA )?\S+ (?:[\da-f]{2}:){15}[\da-f]{2}(, client user ".*", client host ".*")?))?\s*$
|   5) [2] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:?)?\s(?:\[ID \d+ \S+\])?\s*[iI](?:llegal|nvalid) user .* from <HOST>\s*$
`-
 
Ignoreregex: 0 total
 
Date template hits:
|- [# of hits] date format
|  [888] MONTH Day Hour:Minute:Second
`-
 
Lines: 888 lines, 0 ignored, 13 matched, 875 missed
Missed line(s):: too many to print.  Use --print-all-missed to print all 875 lines

Algunos filtros mas

en /etc/fail2ban/filter.d/

# Fail2Ban configuration file qmail-auth.conf
# Author: Efra - Pablo
# Version 0.1
#
# 2018-01-24T10:02:17.562375-03:00 vps smtp_auth: smtp_auth: FAILED: support - password incorrect from (null)@walkerj2351.example.com [91.200.12.197]
[Definition]
failregex = (.* smtp_auth: FAILED: .* password incorrect from .*) \[<HOST>\]
ignoreregex =

en /etc/fail2ban/jail.conf

[qmail-auth]
enabled = true
filter  = qmail-auth
action  = iptables-allports[name=qmail-auth]
logpath  = /usr/local/psa/var/log/maillog

en /etc/fail2ban/filter.d/

# Fail2Ban configuration file wordpress-login.conf
# Author: Efra - Pablo
# Version 0.1
# Bloquea accesos al administrador de WP
#
# 91.200.12.49 - - [26/Apr/2017:11:42:02 -0300] "POST /wp-login.php HTTP/1.1" 200 3157 "https://pablo.sarubbi.com.ar/wp-login.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)"
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*\/wp-login.php HTTP\/.*$
ignoreregex =

en /etc/fail2ban/jail.conf

[wordpress-login]
enabled  = true
filter   = wordpress-login
action   = iptables-multiport[name=wordpressLogin, port="http,https"]
logpath  = /var/www/vhosts/*/statistics/logs/access_log
bantime  = 172800
maxretry = 5
findtime = 60

en /etc/fail2ban/filter.d/

# Fail2Ban configuration file wordpress-uploads.conf 
# Author: Efra - Pablo
# Version 0.1
# Bloquea accesos a archivos .php en directorio uploads de WP
# 98.130.0.199 - - [25/Apr/2017:07:25:14 -0300] "POST /wp-content/uploads/2011/09/footer92.php HTTP/1.0" 200 255 "https://pablo.sarubbi.com.ar/wp-content/uploads/2011/09/footer92.php" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.48 Safari/537.36"
[Definition]
failregex = ^<HOST> -.*"(GET|POST).*\/uploads\/.*\.php HTTP\/.*$
ignoreregex =

en /etc/fail2ban/jail.conf

[wordpress-uploads]
enabled  = true
filter   = wordpress-uploads
action   = iptables-multiport[name=wordpressUploads, port="http,https"]
logpath  = /var/www/vhosts/*/statistics/logs/access_log
bantime  = 172800
maxretry = 1

en /etc/fail2ban/filter.d/

# Fail2Ban configuration file  horde-login.conf 
# Author: Efra - Pablo
# Version 0.1
# Bloquea accesos al webmail Horde
# Jan 24 14:34:31 HORDE [error] [imp] FAILED LOGIN for zaraza@sarubbi.com.ar [139.162.9.175] to {localhost:143 [imap/notls]} [pid 21241 on line 139 of "/usr/share/psa-horde/imp/lib/Auth/imp.php"]
[Definition]
failregex = (.* FAILED LOGIN for .*) \[<HOST>\] to .*$
ignoreregex =

en /etc/fail2ban/jail.conf

[horde-login]
enabled  = true
filter   = horde-login
action   = iptables-multiport[name=horde-login, port="http,https"]
logpath  = /var/log/psa-horde/psa-horde.log
bantime  = 7200
maxretry = 5
findtime = 1200

Certbot es una herramienta para administrar certificados de manera automatizada desarrollado por la EFF (Electronic Frontier Foundation) como cliente oficial de la CA de Let’s Encrypt. La instalación en Ubuntu es muy sencilla:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-apache

Generar el certificado

$ sudo certbot certonly --manual -d pablo.sarubbi.com.ar

Con el parámetro -d se pueden agregar mas dominios separados por espacios.
El sistema nos advierte que va intentar leer archivo con el siguiente nombre y contenido para validar nuestra propiedad.

-------------------------------------------------------------------------------
Create a file containing just this data:
 
NHhlywEu46fGY0YLEAIiFFeeNNEQfS0pwJbiUkjqM-E.8Ep8-mh5ETXinamOr3Z3pd6qmlRiLklJy-lpP4Q64SI
 
And make it available on your web server at this URL:
 
http://pablo.sarubbi.com.ar/.well-known/acme-challenge/NHhlywEu46fGY0YLEAIiFFeeNNEQfS0pwJbiUkjqM-E
 
-------------------------------------------------------------------------------
Press Enter to Continue

Durante este proceso debemos crear el archivo con el nombre, ubicación y contenido exacto que nos define, y luego continuar con el proceso para que verifique su existencia. Hay que estar atentos porque el último paso comprueba directamente las URLs y si no fueron creadas, tendremos que ejecutar nuevamente el procedimiento.

$ sudo mkdir -p .well-known/acme-challenge/
$ sudo echo NHhlywEu46fGY0YLEAIiFFeeNNEQfS0pwJbiUkjqM-E.8Ep8-mh5ETXinamOr3Z3pd6qmlRiLklJy-lpP4Q64SI > .well-known/acme-challenge/JNHhlywEu46fGY0YLEAIiFFeeNNEQfS0pwJbiUkjqM-E
-------------------------------------------------------------------------------
Press Enter to Continue
Waiting for verification...
Cleaning up challenges
 
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/sarubbi.com.ar/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/sarubbi.com.ar/privkey.pem
   Your cert will expire on 2018-01-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:
 
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
-------------------------------------------------------------------------------

Como bien dice el log, se generaron 3 archivos con el certificado, la clave privada y el CA con caducidad de seis meses. Resta apuntar correctamente el archivo de configuración del Apache a los que generamos recientemente:

<VirtualHost *:443>
 
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/sarubbi.com.ar/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/sarubbi.com.ar/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/sarubbi.com.ar/chain.pem
$ sudo service apache2 restart

Modificando el WordPress

Antes que nada debemos exportar la BBDD para reapuntar todos los links internos a la nueva URL con el https delante. Lo mas conveniente es trabajar sobre una BBDD nueva, en este caso la crearemos con el nombre wp_saru_seg y los mismos permisos de acceso. Generamos un backup de la base original y reemplazamos todas las URLs no seguras por el nuevo dominio con https. Importamos nuevamente el archivo sobre la base wp_saru_seg a la cual apuntaremos el WordPress en un paso futuro.

mysqldump --skip-dump-date -uadmin -p wp_saru > bkp_saru.sql
sed -i -e 's/http:\/\/pablo.sarubbi.com.ar/https:\/\/pablo..com.ar/g' bkp_saru.sql 
mysql -uadmin -p wp_saru_seg < wp_saru.sql

Copiamos todos los archivos manteniendo los permisos y solo para estar seguros, verificamos que no haya quedado ninguna URL apuntando al sitio viejo.

cp -a /var/www/httpdocs/* /var/www/httpsdocs/
find /var/www/httpsdocs/ -type f -name "*.php" | xargs grep http://pablo.sarubbi.com.ar

Cambiamos el archivo de configuración para que apunte a la nueva BBDD y si todo anda bien podemos eliminar el sitio no seguro y la base de datos original.

$ rm -R /var/www/httpdocs/*
$ sed -i -e 's/wp_saru/wp_saru_seg/g' /var/www/httpsdocs/wp-config.php

Nos resta redirigir el trafico a las URLs que teniamos antes para que tengan como destino el sitio seguro. Esto lo hacemos mediante un Redirect en el .htaccess

echo "Redirect 301 / https://pablo.sarubbi.com.ar/" > /var/www/httpdocs/.htaccess

Con un poco de suerte y muy poco tiempo tenés configurado tu WordPress en un dominio con SSL y disponible por https://, en tu servidor Linux.

Gracias al aporte de Paulino Calderon (@calderpwn) tenemos disponible desde hace unas horas un script para sumar a nuestra colección en nmap que nos permite con un solo comando escanear la red y descubrir aquellos equipos que podrían ser afectados por el último ransomware WannaCry.

Lo que hace este script es conectarse al $IPC y ejecutar una transacción sobre FID 0 para verificar el error «STATUS_INSUFF_SERVER_RESOURCES» y así determinar si el equipo fue parcheado o no contra MS17-010.

El único requerimiento (además de un nmap actualizado) es descargar el script de github y copiarlo al directorio /scripts

wget https://raw.githubusercontent.com/cldrn/nmap-nse-scripts/master/scripts/smb-vuln-ms17-010.nse
mv smb-vuln-ms17-010.nse /opt/nmap-7.40/scripts/
sudo ./nmap -sC -p445 --open --max-hostgroup 3 --script smb-vuln-ms17-010.nse 192.168.1.0/24

Un ejemplo de equipo vulnerable retornaría algo similar a:

Nmap scan report for 192.168.1.2
Host is up (0.00079s latency).
PORT    STATE SERVICE
445/tcp open  microsoft-ds
 
Host script results:
| smb-vuln-ms17-010: 
|   VULNERABLE:
|   Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
|     State: VULNERABLE
|     IDs:  CVE:CVE-2017-0143
|     Risk factor: HIGH
|       A critical remote code execution vulnerability exists in Microsoft SMBv1
|        servers (ms17-010).
|       
|     Disclosure date: 2017-03-14
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
|       https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
|_      https://technet.microsoft.com/en-us/library/security/ms17-010.aspx

Para solucionar esta vulnerabilidad debemos aplicar los parches que tan gentilmente nos ofrece Microsoft tanto para los sistemas mantenidos como para los XP y 2003.

Para Windows XP y 2003 descargar y aplicar los siguientes parches de seguridad (requiere reinicio)
https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/?utm_content=buffer8d9ab&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

Para las versiones actuales de Windows descargar y aplicar los siguientes parches de seguridad (requiere reinicio)
https://technet.microsoft.com/en-us/library/security/ms17-010.aspx

Actualización:
Si cuando ejecutamos el escaneo obtenemos como respuesta es un error similar al siguiente:

NSE: smb-vuln-ms17-010 against 192.168.1.2 threw an error!
/usr/bin/../share/nmap/scripts/smb-vuln-ms17-010.nse:85: variable 'debug1' is not declared
stack traceback:
        [C]: in function 'error'
        /usr/bin/../share/nmap/nselib/strict.lua:80: in function '__index'
        /usr/bin/../share/nmap/scripts/smb-vuln-ms17-010.nse:85: in function 'check_ms17010'
        /usr/bin/../share/nmap/scripts/smb-vuln-ms17-010.nse:160: in function </usr/bin/../share/nmap/sc...

Es probable que necesitemos actualizar el nmap, tarea relativamente sencilla siguiendo estos pasos:

wget https://nmap.org/dist/nmap-7.40.tar.bz2
bzip2 -cd nmap-7.40.tar.bz2 | tar xvf -
cd nmap-7.40
./configure
make
sudo make install

Instalando Davmail

DavMail es un gateway que nos permite utilizar cualquier cliente de correo y/o calendario con un servidor MS Exchange, incluso compartiendo la libreta de direcciones del usuario LDAP. Este objetivo lo logra convirtiendose en un intermediario entre el cliente y el servidor Exchange Propietario, donde proporciona una serie de protocolos estándars como LDAP (libreta de direcciones), IMAP, POP, CALDAV (calendario) y CARDAV (contactos personales).

DavMail está desarrollado en Java, lo que lo hace multiplataforma, y puede correr de manera local o sirviendo varias conexiones. Nosotros lo instalaremos en un servidor Ubuntu 16.04 Server. Como pre-requisito debemos instalar las Runtime de Java.

sudo apt-get install default-jre libswt-gtk-3-java libswt-cairo-gtk-3-jni

y luego descargar de SourceForge el .deb de la última versión disponible (hoy la 4.7.3).

wget http://sourceforge.net/projects/davmail/files/davmail/4.7.3/davmail_4.7.3-2438-1_all.deb
sudo dpkg -i davmail_4.7.3-2438-1_all.deb

si todo va bien y no tenemos errores en la instalación (que no serían mas que alguna dependencia incumplida) deberíamos estar en condiciones de ejecutar DavMail. Con interface gráfica un icono en la barra de tareas nos ayuda a editar el archivo de configuraciones, pero como nos gusta la terminal, crearemos el mismo a partir del siguiente template:

sudo touch /etc/davmail.properties

y pegamos el siguiente código:

# DavMail settings, see http://davmail.sourceforge.net/ for documentation
 
#############################################################
# Basic settings
 
# Server or workstation mode
davmail.server=true
# connection mode auto, EWS or WebDav
davmail.enableEws=auto
# base Exchange OWA or EWS url
davmail.url=https://owa.example.com/owa/
 
# Listener ports
davmail.caldavPort=1080
davmail.imapPort=1143
davmail.ldapPort=1389
#davmail.popPort=1110
davmail.smtpPort=1025
 
#############################################################
# Network settings
 
# Network proxy settings
davmail.enableProxy=false
davmail.useSystemProxies=false
davmail.proxyHost=
davmail.proxyPort=
davmail.proxyUser=
davmail.proxyPassword=
 
# proxy exclude list
davmail.noProxyFor=
 
# allow remote connection to DavMail
davmail.allowRemote=true
# bind server sockets to a specific address
davmail.bindAddress=
# client connections SO timeout in seconds
davmail.clientSoTimeout=
 
# DavMail listeners SSL configuration
davmail.ssl.keystoreType=
davmail.ssl.keystoreFile=
davmail.ssl.keystorePass=
davmail.ssl.keyPass=
 
# Accept specified certificate even if invalid according to trust store
davmail.server.certificate.hash=
 
# disable SSL for specified listeners
davmail.ssl.nosecurecaldav=false
davmail.ssl.nosecureimap=false
davmail.ssl.nosecureldap=false
davmail.ssl.nosecurepop=false
davmail.ssl.nosecuresmtp=false
 
# disable update check
davmail.disableUpdateCheck=true
 
# Send keepalive character during large folder and messages download
davmail.enableKeepalive=false
# Message count limit on folder retrieval
davmail.folderSizeLimit=0
# Default windows domain for NTLM and basic authentication
davmail.defaultDomain=
 
#############################################################
# Caldav settings
 
# override default alarm sound
davmail.caldavAlarmSound=
# retrieve calendar events not older than 90 days
davmail.caldavPastDelay=90
# WebDav only: force event update to trigger ActiveSync clients update
davmail.forceActiveSyncUpdate=false
 
#############################################################
# IMAP settings
 
# Delete messages immediately on IMAP STORE \Deleted flag
davmail.imapAutoExpunge=true
# Enable IDLE support, set polling delay in minutes
davmail.imapIdleDelay=
# Always reply to IMAP RFC822.SIZE requests with Exchange approximate message size for performance reasons
davmail.imapAlwaysApproxMsgSize=
 
#############################################################
# POP settings
 
# Delete messages on server after 30 days
davmail.keepDelay=30
# Delete messages in server sent folder after 90 days
davmail.sentKeepDelay=90
# Mark retrieved messages read on server
davmail.popMarkReadOnRetr=false
 
#############################################################
# SMTP settings
 
# let Exchange save a copy of sent messages in Sent folder
davmail.smtpSaveInSent=true
 
#############################################################
# Loggings settings
 
# log file path, leave empty for default path
davmail.logFilePath=/var/log/davmail.log
# maximum log file size, use Log4J syntax, set to 0 to use an external rotation mechanism, e.g. logrotate
davmail.logFileSize=1MB
# log levels
log4j.logger.davmail=WARN
log4j.logger.httpclient.wire=WARN
log4j.logger.org.apache.commons.httpclient=WARN
log4j.rootLogger=WARN
 
#############################################################
# Workstation only settings
 
# smartcard access settings
davmail.ssl.pkcs11Config=
davmail.ssl.pkcs11Library=
 
# SSL settings for mutual authentication
davmail.ssl.clientKeystoreType=
davmail.ssl.clientKeystoreFile=
davmail.ssl.clientKeystorePass=
 
# disable all balloon notifications
davmail.disableGuiNotifications=false
# disable startup balloon notifications
davmail.showStartupBanner=true
 
# enable transparent client Kerberos authentication
davmail.enableKerberos=false

Nos quedamos con un par de lineas que son las mas relevantes:

davmail.server=true
davmail.allowRemote=true
davmail.url=https://yourcompany.com/owa
davmail.enableEws=auto
davmail.imapPort=993
davmail.smtpPort=465
davmail.ldapPort=636
#davmail.popPort=995
davmail.caldavPort=8443

y lo ejecutamos de la siguiente manera para poder chequear errores con «tail -f nohup.out»:

nohup davmail.sh davmail.properties &

Para agregarlo como un servicio mas creamos un archivo en /etc/init.d/davmail con el siguiente contenido:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          davmail
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: DavMail Exchange gatway
# Description:       A gateway between Microsoft Exchange and open protocols.
    ### END INIT INFO
 
    # Author: Jesse TeKrony <jesse ~at~ jtekrony ~dot~ com>
 
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="Davmail Exchange gateway"
    NAME=davmail
    CONFIG=/etc/davmail.properties
    DAEMON=/usr/bin/$NAME
    DAEMON_ARGS="$CONFIG"
    PIDFILE=/var/run/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
    LOGFILE=/var/log/davmail.log
 
    # Exit if the package is not installed
    [ -x "$DAEMON" ] || exit 0
 
    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
 
    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh
 
    # Define LSB log_* functions
    . /lib/lsb/init-functions
 
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
            || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
            $DAEMON_ARGS >> $LOGFILE 2>&1 &
        [ $? != 0 ] && return 2
        echo $! > $PIDFILE
        exit 0
    }
 
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        rm -f $PIDFILE
        return "$RETVAL"
    }
 
    case "$1" in
      start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      status)
           status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
           ;;
      restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
            do_start
            case "$?" in
                0) log_end_msg 0 ;;
                1) log_end_msg 1 ;; # Old process is still running
                *) log_end_msg 1 ;; # Failed to start
            esac
            ;;
          *)
            # Failed to stop
            log_end_msg 1
            ;;
        esac
        ;;
      *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart| force-reload}" >&2
        exit 3
        ;;
    esac

Lo marcamos como ejecutable, arrancamos el servicio y lo habilitamos en el arranque:

sudo chmod +x /etc/init.d/davmail
sudo service davmail start
sudo update-rc.d davmail defaults

Un detalle que puede surgir es que sin el entorno gráfico no podremos aceptar el certificado del servidor Exchange con un simple Click, lo que podemos hacer es agregar el fingerprint SHA1 del mismo en el archivo de configuración de DavMail. El fingerprint lo obtenemos con los siguientes comandos:

echo | openssl s_client -connect exchange.mydomain.com.ar:443 |& openssl x509 -fingerprint -noout
 
SHA1 Fingerprint=02:1E:A3:93:6C:A3:02:15:FC:C0:4C:BD:F9:42:79:E4:B6:73:45:23

Ahora si lo agregamos al archivo de configuración:

davmail.server.certificate.hash=2:1E:A3:93:6C:A3:2:15:FC:C0:4C:BD:F9:42:69:E4:B6:73:45:23

Una nota importante es que el hash no debe tener (si existiera) los ceros iniciales, por eso el «02» del primer valor se reemplazara solo por un «2».

Habilitar cifrado SSL

Para habilitar la comunicación segura es necesario un certificado SSL y una clave privada SSL en formato PEM. Esto es posible adquiriendo uno (en donde ya tendríamos el certificado y clave) o como pretendemos en este post, generando un juego autofirmado. Para eso necesitamos realizar los siguientes pasos:

Generar clave RSA con OpenSSL

sudo openssl genrsa -out /usr/lib/ssl/private/davmail.key 2048
sudo chown root:root /usr/lib/ssl/private/davmail.key
sudo chmod 600 /usr/lib/ssl/private/davmail.key

Crear un CSR o solicitud de firma de certificado SSL

sudo openssl req -new -key /usr/lib/ssl/private/davmail.key -out /usr/lib/ssl/certs/davmail.csr

Este proceso realizará varias preguntas. El campo mas importante es el «Common Name», donde se establece el nombre de dominio o la dirección IP con el cual accederán los clientes (por ejemplo, davmail.mydomain.com.ar o 123.123.123.123).

Firmamos el CSR utilizando la clave privada, estableciendo la fecha de caducidad con el argumento -days:

sudo openssl x509 -req -signkey /usr/lib/ssl/private/davmail.key -in /usr/lib/ssl/certs/davmail.csr -out /usr/lib/ssl/certs/davmail.crt -days 365

Ya esta el certificado generado con expiración de un año.

Configuración del OpenSSL

Con el certificado generado, lo convertiremos al formato que DavMail entiende (PEM)

sudo -s cat /usr/lib/ssl/private/davmail.key /usr/lib/ssl/certs/davmail.crt > /tmp/davmail.pem
sudo mv /tmp/davmail.pem /usr/lib/ssl/certs/
sudo chown root:root /usr/lib/ssl/certs/davmail.pem
sudo chmod 600 /usr/lib/ssl/certs/davmail.pem
sudo openssl pkcs12 -export -in /usr/lib/ssl/certs/davmail.pem -out /usr/lib/ssl/certs/davmail.p12 -name "davmail"
sudo chown root:root /usr/lib/ssl/certs/davmail.pem
sudo chmod 600 /usr/lib/ssl/certs/davmail.pem

Te pedirá generar una contraseña que no se puede dejar en blanco ya que DavMail no funciona correctamente de esta manera.

Solo resta configurar el DavMail modificando algunos parámetros del archivo de propiedades:

sudo nano /etc/davmail.properties
davmail.ssl.keystoreType=PKCS12
davmail.ssl.keystoreFile=/usr/lib/ssl/certs/davmail.p12
davmail.ssl.keyPass=password
davmail.ssl.keystorePass=password

Donde keyPass y keystorePass toman el mismo valor de contraseña generada en el paso anterior.

Solo resta reiniciar el servicio y verificar su funcionamiento

sudo service davmail restart

Una de las versiones de OpenVAS que tenemos disponible para descargar del sitio oficial es una imagen OVA que corre sobre VirtualBox. Lamentablemente esta imagen viene con un certificado que venció hace semanas y esto hace que el sistema nos retorne un 503 – Service temporarily down. Para solucionar este fallo solo debemos renovar los certificados del servidor y cliente OpenVAS.

Lo primero que debemos hacer es actualizar el sistema completo

# apt-get update
# apt-get upgrade
# apt-get dist-upgrade
# systemctl stop openvas-scanner
# systemctl stop openvas-manager

Generamos el nuevo certificado

# openvas-mkcert -f
-------------------------------------------------------------------------------
                        Creation of the OpenVAS SSL Certificate
-------------------------------------------------------------------------------
 
This script will now ask you the relevant information to create the SSL certificate of OpenVAS.
Note that this information will *NOT* be sent to anybody (everything stays local), but anyone with the ability to connect to your OpenVAS daemon will be able to retrieve this information.
 
 
CA certificate life time in days [1460]: 
Server certificate life time in days [365]: 
Your country (two letter code) [DE]: 
Your state or province name [none]: 
Your location (e.g. town) [Berlin]: 
Your organization [OpenVAS Users United]: 
 
 
-------------------------------------------------------------------------------
                        Creation of the OpenVAS SSL Certificate
-------------------------------------------------------------------------------
 
Congratulations. Your server certificate was properly created.
 
The following files were created:
 
. Certification authority:
   Certificate = /usr/local/var/lib/openvas/CA/cacert.pem
   Private key = /usr/local/var/lib/openvas/private/CA/cakey.pem
 
. OpenVAS Server : 
    Certificate = /usr/local/var/lib/openvas/CA/servercert.pem
    Private key = /usr/local/var/lib/openvas/private/CA/serverkey.pem
 
Press [ENTER] to exit
 
# openvas-mkcert-client -i -n

Con los archivos de claves generados, nos resta obtener el UUID del escaner.

# openvasmd --get-scanners
 
08b69003-5fc2-4037-a479-93b440211c73  OpenVAS Default

Ahora si podemos actualizar los parámetros del servidor con el siguiente comando:

# openvasmd --modify-scanner 08b69003-5fc2-4037-a479-93b440211c73 	
	    --scanner-ca-pub /usr/local/var/lib/openvas/CA/cacert.pem 
	    --scanner-key-pub /usr/local/var/lib/openvas/CA/servercert.pem 
	    --scanner-key-priv /usr/local/var/lib/openvas/private/CA/serverkey.pem

Actualizamos, guardamos y por las dudas, reiniciamos el servidor.

# openvas-nvt-sync
# systemctl start openvas-scanner
# openvasmd --rebuild 
# openvasmd --backup
# systemctl start openvas-manager
# systemctl start gsa

Ahora si deberíamos tener el OpenVAS funcionando como de costumbre.

Suerte!

Stop SOPA