Configurando Fail2ban Para Autentificaciones SMTP Fallidas en Mailcleaner

Para prevenir que estando nuestro servidor SMTP en internet tengamos bloqueos por ataques DoS al puerto 25 podemos implementar el servicio fail2ban para bloquear todo tipo de conexión que falle en la autentificación de forma reiterativa realizando lo siguiente:

  • Instalar fail2ban en el servidor Mailcleaner
1
aptget update; aptget install fail2ban

Nos dirigimos al directorio /etc/fail2ban, donde creamos/editamos los siguientes archivos:

  1. Archivo filter.d/exim2.conf: Contiene la reglas para el match del jail
  2. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    # Fail2Ban filter for exim
    #
    # This includes the rejection messages of exim. For spam and filter
    # related bans use the exim-spam.conf
    #
    
    
    [INCLUDES]
    
    # Read common prefixes. If any customizations available -- read them from
    # exim-common.local
    # before = exim-common.conf
    
    [Definition]
    
    failregex = \[<HOST>\]: 535 Incorrect authentication data
    
    ignoreregex =
    
  3. Archivo action.d/iptables-repeater.conf: Configura toda la acción a realizar con las ip que fallan con la auth
  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    # Fail2ban configuration file
    #
    # Author: Phil Hagen <phil@identityvector.com>
    #
    
    [Definition]
    
    # Option:  actionstart
    # Notes.:  command executed once at the start of Fail2Ban.
    # Values:  CMD
    #
    actionstart = iptables -N fail2ban-REPEAT-<name>
                  iptables -A fail2ban-REPEAT-<name> -j RETURN
                  iptables -I INPUT -j fail2ban-REPEAT-<name>
                  # set up from the static file
                  cat /etc/fail2ban/ip.blocklist.<name> |grep -v ^\s*#|awk '{print $1}' | while read IP; do iptables -I fail2ban-REPEAT-<name> 1 -s $IP -j DROP; done
    
    # Option:  actionstop
    # Notes.:  command executed once at the end of Fail2Ban
    # Values:  CMD
    #
    actionstop = iptables -D INPUT -j fail2ban-REPEAT-<name>
                 iptables -F fail2ban-REPEAT-<name>
                 iptables -X fail2ban-REPEAT-<name>
    
    # Option:  actioncheck
    # Notes.:  command executed once before each actionban command
    # Values:  CMD
    #
    actioncheck = iptables -n -L INPUT | grep -q fail2ban-REPEAT-<name>
    
    # Option:  actionban
    # Notes.:  command executed when banning an IP. Take care that the
    #          command is executed with Fail2Ban user rights.
    # Tags:    <ip>  IP address
    #          <failures>  number of failures
    #          <time>  unix timestamp of the ban time
    # Values:  CMD
    #
    actionban = iptables -I fail2ban-REPEAT-<name> 1 -s <ip> -j DROP
                # also put into the static file to re-populate after a restart
                ! grep -Fq <ip> /etc/fail2ban/ip.blocklist.<name> && echo "<ip> # fail2ban/$( date '+%%Y-%%m-%%d %%T' ): auto-add for repeat offender" >> /etc/fail2ban/ip.blocklist.<name>
    
    # Option:  actionunban
    # Notes.:  command executed when unbanning an IP. Take care that the
    #          command is executed with Fail2Ban user rights.
    # Tags:    <ip>  IP address
    #          <failures>  number of failures
    #          <time>  unix timestamp of the ban time
    # Values:  CMD
    #
    actionunban = /bin/true
    
    [Init]
    
    # Defaut name of the chain
    #
    name = REPEAT
    
  5. Archivo ip.blocklist.exim2: Contiene las direcciones ip que se van bloqueando por intentos fallidos y que se va autocompletando con los bloqueos propios del fail2ban
  6. 1
    2
    3
    
    122.154.29.30 # fail2ban/2016-04-15 00:21:45: auto-add for repeat offender
    95.183.52.100 # fail2ban/2016-04-15 00:35:51: auto-add for repeat offender
    110.84.129.110 # fail2ban/2016-04-15 02:11:53: auto-add for repeat offender
    

La configuración del jail la realizamos dentro del archivo /etc/fail2ban/jail.conf , quedando así:

1
2
3
4
5
6
7
8
[exim2-repeater]
      enabled  = true
      filter   = exim2
      action   = iptables-repeater[name=exim2]
      logpath  = /var/mailcleaner/log/exim_stage1/mainlog
      maxretry = 10
      findtime = 31536000
      bantime  = 31536000

Lo anterior leerá del archivo /var/mailcleaner/log/exim_stage1/mainlog todos los errores del tipo 535 Incorrect authentication data si la authenticación falla al intento 10 y además la ip será almacenada en el archivo iptables-repeater.conf .

Proxmox 4 Y Ansible, Automatizando La Creación De Contenedores

Proxmox 4 soporta contenedores LXC para la virtualización, en el caso de querer automatizar dicha tarea con Ansible y se puede realizar mediante el repositorio git@github.com:mcoam/proxmox4_container_lxc.git donde se detallan los pasos y prerrequisitos a seguir.

Ansible: Chequeando La Existencia De Un Directorio

Si necesitamos chequear la existencia de un directorio antes de realizar cualquier tipo de operación (copiear, instalar, etc) se puede utilizar el valor que nos trae el comando stat. Por ejemplo, el el siguiente ejemplo, se realiza lo siguiente:

  1. Se instala apache
  2. Se chequea que el directorio conf.d exista
  3. Se copia el archivo site.conf
  4. Reiniciar apache
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- name: Install apache
  yum: name=httpd state=latest

- name: "Check apache path"
  stat: path=/etc/httpd/conf.d
  register: apache_path

- name: "Copy configuration file"
  copy: src=site.conf dest=/etc/httpd/conf.d
  when: apache_path.stat.exists == True

- name: "Restart apache"
  service: name=httpd state=restarted
  when: apache_path.stat.exists == True

Ansible: Configurando Volúmen De Datos HSM en Zimbra

El siguiente Playbook permite configurar un nuevo volúmen para datos (store) en un servidor Zimbra NE.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
---
- hosts: ne_mailbox
  remote_user: root
  vars:
        zmvolume: "/opt/zimbra/bin/zmvolume"
        zmhsm: "/opt/zimbra/bin/zmhsm"
        zmprov: "/opt/zimbra/bin/zmprov"
        hsm_name: "hsm02"
        hsm_id: "4" # check id zmvolume -l |grep -B1 hsm02
        path: "/opt/zimbra/store_hsm_02/"
        policy_option: " 'message,document,task,appointment,contact:before:-1month is:anywhere' "
  tasks:
        - name: "Configura volumen HSM como volumen secundario"
          command: "{ { zmvolume } } -a -name  -c true -t secondaryMessage -p { { path } }"

        - name: "Activamos nuevo volumen para manejar data"
          command: "{ { zmvolume } } -sc -id { { hsm_id } } "

        - name: "Configuramos politica HSM: Todo por sobre 1 mes se mueve al nuevo volumen"
          command: "{ { zmprov } } ms { { ansible_fqdn } } zimbraHsmPolicy { { policy_option } }"

        - name: "Arrancamos el proceso para mover correos al nuevo HSM"
          command: "{ { zmhsm } } -t"

Donde:
path: "/opt/zimbra/store_hsm_02/": Corresponde al punto de montaje del nuevo recurso HSM.
hsm_id: 4": Corresponde al ID que le asigna Zimbra al nuevo volúmen (disco).
hsm_name: hsm02: Corresponde al nombre que le colocamos al recurso HSM.

Montar, Leer Y Escribir en USB Con Formato NTFS en OSX Capitan

Con una terminal, ejecutar:

1
sudo vim /etc/fstab

Y dentro colocar

1
LABEL=DRIVE_NAME none ntfs rw,auto,nobrowse

Donde: El DRIVE_NAME corresponde el nombre del dispositivo que conectamos al equipo. En el caso de que el nombre contenga espacios, tenemos que anteponer el backslash “\” antes del mismo Ej:

1
LABEL="NO\ NAME" none ntfs rw,auto,nobrowse

Ansible: Trabajando Con Volumenes Lógicos PV/VG/LV en Linux

Ansible cuenta con un módulos para la gestión de discos en Linux los cuales no permiten administrar nuestros volúmenes. En el siguiente ejemplo, se crea un volumen sobre un disco /dev/sdf1 y que será configurado como volumen lógico y finalmente montado para los backup que realiza un servidor de correos Zimbra.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
---
- hosts: ne_mailbox
  vars:
        disk_name: "/dev/sdf1"
        filesystem: "ext4"
        vg_name: "zimbra_data"
        lv_size: "100%FREE" #ocupar todo el espacio libre del VG zimbra_data
        lv_name: "backup"
        path: "/opt/zimbra/backup"
        user: "zimbra"
  tasks:

        - name: "Crear el PV sobre el disco nuevo"
          command: pvcreate { { disk_name } }

        - name: "Crear nuevo VG"
          lvg: vg=\{\{ vg_name \}\} pvs=\{\{ disk_name \}\}

        - name: "Crear nuevo volumen LVM"
          lvol: vg=\{\{ vg_name \}\} lv=\{\{ lv_name \}\} size=\{\{ lv_size \}\}
          tags: crea_lv

        - name: "Formateo de unidad LVM"
          filesystem: fstype=\{\{ filesystem \}\} dev=/dev/\{\{ vg_name \}\}/\{\{ lv_name \}\}
          tags: formatea_lv

        - name: "Montar disco"
          mount: name=\{\{ path \}\} src=/dev/\{\{ vg_name \}\}/\{\{ lv_name \}\} fstype=\{\{ filesystem \}\} state=mounted
          tags: monta_lv

        - name: "Permisos directorio backup"
          file: path=\{\{ path \}\} state=directory mode=0755 owner=\{\{ user \}\} group=\{\{ user \}\}
          tags: permisos_directorio

Notas Sobre Imapsync

En el caso de migrar la data de correos vía imapsync es importante tener en consideración (si se va a tener corriendo varios días el comando) utilizar la opción --delete2 para que todo correo copiado al (hosts2) y que no tenga copia en el origen (host1) sea borrado, de lo contrario el usuario cuando se conecte al nuevo servidor tendrá correos que ya había eliminado y el buzón pesará mas de lo normal. De todas formas, lo anterior se puede corregir configrando el imapsyn con el valor —minage que sincroniza el buzón desde X días para atrás.

1
2
3
4
5
6
imapsync --buffersize 8192000 --nosyncacls --subscribe --syncinternaldates --authmech1 PLAIN /
--host1 192.168.10.10 --user1 foo@origen.dev --password1 'foo' --host2 192.168.10.11 /
--user2 foo@destino.dev --password2 'foo' --authmech2 PLAIN --nofoldersizes --skipsize --fast /
--exclude '(?i)\b(Junk|Spam|Trash|IMIP|Drafts)\b' --exclude 'INBOX_(.*)' --exclude 'Trash_(.*)'/
 --exclude 'Drafts_(.*)' --exclude 'Spam_(.*)' --exclude 'Sent Items_(.*)' --regextrans2 /
's#^Sent Items#Sent#' --delete2duplicates --delete2 --minage 5

Por ejemplo, hoy estamos a 10 y tiramos el imapsync en el destino empezará a sincronizar (borrando la data que no este en el host1) desde el día 5, con ello evitamos borrar los correos nuevos en el host2.

Seleccionar Y Comentar Texto Con VIM

En el caso de necesitar seleccionar texto (muchas líneas) con vim podemos hacer lo siguiente:

  • Seleccionar texto en modo visual
  • Apretar la combinación: :norm i# para agregar los comentarios

Para quitar los comentatrios

  • Seleccionar texto en modo visual
  • Apretar la combinación: :norm x para agregar los comentarios

Instalado/Actualizando Paquetes Endian Firewall

Para instalar paquetes en Endian Firewall podemos utilizar el comando smart que es un administrador de paquetes que viene incorporado en la distro. Lo primero que hay que realizar es instalar el repositorio:

  • Para Endian 2.4.x
  • 1
    
    smart channel --add CentOS_4.9 type=rpm-md name="CentOS_4.9" \baseurl="http://vault.centos.org/4.9/os/i386/"
    

  • En el caso de Endian 2.5.x
  • 1
    
    smart channel --add CentOS_5.9 type=rpm-md name="CentOS_5.9" \baseurl="http://vault.centos.org/5.9/os/i386/"
    

    Instalando paquetes

    1
    2
    
    smart update
    smart install wget nmap vim-enhanced -y
    

    En el caso de ver el error:

    1
    2
    3
    
    warning: rpmts_HdrFromFdno: Header V3 DSA signature: NOKEY, key ID 443e1821
    error: vim-common-6.3.046-2.el4.1.i386.rpm: public key not available
    Saving cache...
    

    Ejecutar

    1
    
    smart config --set  rpm-check-signatures=false
    

    Script Para Buscar Y Borrar Un Correo en Zimbra

    El siguiente script permite buscar y borrar un correo mediante consola desde los mailbox de los usuarios.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    #!/bin/bash
    
    zimbraAccounts='/var/tmp/cuentas'
    zimbraCMD='/opt/zimbra/bin/zmmailbox'
     for a in `cat $zimbraAccounts`
        do
            #user=`$a`
            emailID=( $($zimbraCMD -z -m $a search "de haber superado debido a la alta tasa de correos spam" |grep conv |awk {'print $2'} |sed 's/-//g') )
            echo $user
            #echo ${emailID[1]}
                for i in "${emailID[@]}"
                    do
                        $zimbraCMD -z -m $a dm $i
              echo "cuenta: $a" >> /var/tmp/casillasConEmail
                    done
        done
    

    En la línea nº8 tenemos que cambiar el texto a buscar, y que corresponde a lo que esta dentro de comillas. Para el caso, tenemos que tener las cuentas de correos en el archivo /var/tmp/cuentas que las podemos obtener con el comando:

    1
    
    zmprov -l gaa |egrep -vi 'spam|virus|galsyn|archiv'| sort > /var/tmp/cuentas
    

    Demás esta decir que lo realizado en el comando anterior se puede hacer dentro del mismo script sin tener que hacer esto de forma separada. Una vez ejecutado el script, podremos ver la información de las cuentas en donde fue borrado el correo:

    1
    2
    3
    4
    5
    6
    7
    
    [zimbra@mail1 tmp]$ tail -f /var/tmp/casillasConEmail
    cuenta: ahidalgo@example.com
    cuenta: alinay@example.com
    cuenta: chernandez@example.com
    cuenta: currutia@example.com
    cuenta: cvaldes@example.com
    cuenta: evalencia@example.com