Configuración del sistema de listas

En esta sección realizaremos el despliegue de nuestro sistema de listas. Para ello instalaremos el software necesario, configuraremos los orígenes de forma que se actualicen automáticamente y definiremos la relación entre dichos orígenes junto a la lógica a nuestro servicio.

Recuerde que tiene a su disposición todos los ficheros de configuración de esta guía en https://github.com/luids-io/docs/blob/master/es/modules/guide-basic-nfqueue-xlist/examples/.
Este proceso está probado únicamente en un sistema Ubuntu 20.04LTS server. Los binarios están compilados estáticamente y las rutas empleadas son las de una distribución estándar, por lo que el instalador debería funcionar en cualquier distribución.

Instalación del paquete xlist

Instalar xlist es muy sencillo, basta descargar el instalador ya existente y ejecutarlo. Para ello puede dirigirse a https://github.com/luids-io/xlist/releases y descargar la última versión del instalador (fichero installer_linux.sh). También puede simplemente copiar y pegar lo siguiente en una consola de comandos.

DOWNLOAD_URL=$(wget -O - https://api.github.com/repos/luids-io/xlist/releases/latest| grep download.*installer | grep -v sha256 | cut -d '"' -f4)
wget ${DOWNLOAD_URL} -O installer_xlist.sh
chmod 755 installer_xlist.sh
sudo ./installer_xlist.sh
Si está instalando el software en una arquitectura diferente a la amd64 (como en el caso de una Raspberry) deberá definirla en una variable de entorno al lanzar el instalador. Ejemplo: sudo ARCH=arm64 ./installer.sh. Las arquitecturas disponibles son: amd64, arm, arm64, mips, mips64, mips64le, ppc64 y s390x.

Descarga de la base de datos xlist

Para descargar la base de datos xlist, bastará ejecutar el comando xlist_database como administrador. El script descargará o actualizará dicha base de datos en el directorio /usr/local/share/xlist-database.

$ sudo xlist_database
Clonando en '/usr/local/share/xlist-database'...
remote: Enumerating objects: 973, done.
remote: Counting objects: 100% (973/973), done.
remote: Compressing objects: 100% (244/244), done.
remote: Total 973 (delta 850), reused 851 (delta 728), pack-reused 0
Recibiendo objetos: 100% (973/973), 161.50 KiB | 879.00 KiB/s, listo.
Resolviendo deltas: 100% (850/850), listo.
La base de datos se va actualizando con nuevas fuentes y va corrigiendo posibles cambios que se produzcan en las ya existentes: cambios de url, formato e incluso si la fuente deja de existir. Por ello, es más que recomendable que actualicemos regularmente la base de datos con el comando xlist_database.

Si lo preferimos, podemos hacer que se actualice diariamente de forma automática. Para ello, basta con que habilitemos el timer que crea el instalador para esta tarea.

sudo systemctl enable --now luids-xlist-updatedb.timer
Para que la actualización automática funcione es necesario que hayamos ejecutado el comando xlist_database previamente.

Configuración de xlget

Tras descargar la base de datos, es necesario en primer lugar configurar los orígenes de las listas que vamos a utilizar. para ello lo mejor es realizar enlaces simbólicos en /etc/luids/xlist/sources.d. De este modo, si un origen cambiase de url, formato, etc, nuestro sistema estará actualizado gracias a tener sincronizada la base de datos xlist.

Como administradores, ejecutaremos la siguiente secuencia de comandos.

mkdir -p /etc/luids/xlist/sources.d
cd /etc/luids/xlist/sources.d
DBDIR=/usr/local/share/xlist-database
ln -s $DBDIR/sources/abuse-ch-feodo.json .
ln -s $DBDIR/sources/abuse-ch-ssl.json .
ln -s $DBDIR/sources/alienvault-com.json .
ln -s $DBDIR/sources/badips-com.json .
ln -s $DBDIR/sources/blocklist-de.json .
ln -s $DBDIR/sources/blocklist-site-malware.json .
ln -s $DBDIR/sources/cinsscore-com.json .
ln -s $DBDIR/sources/cruzit-com.json .
ln -s $DBDIR/sources/cymru-com-fullbogons4.json .
ln -s $DBDIR/sources/darklist-de.json .
ln -s $DBDIR/sources/dataplane-org-sshpwauth.json .
ln -s $DBDIR/sources/dshield-org.json .
ln -s $DBDIR/sources/emergingthreats-net.json .
ln -s $DBDIR/sources/greensnow-co.json .
ln -s $DBDIR/sources/interserver-net.json .
ln -s $DBDIR/sources/myip-ms.json .
ln -s $DBDIR/sources/rutgers-edu.json .
ln -s $DBDIR/sources/spamhaus-org-drop.json .
ln -s $DBDIR/sources/talosintelligence-com.json .
ln -s $DBDIR/sources/turris-cz.json .

Editaremos el fichero de configuración de xlget para incluir el directorio como fuentes.

Contenido de /etc/luids/xlist/xlget.toml
[xlget]
outputdir = "/var/lib/luids/xlist"
cachedir  = "/var/cache/luids/xlist"
statusdir = "/var/lib/luids/xlist/status"

[xlget.source]
dirs     = [ "/etc/luids/xlist/sources.d" ]

Una vez creados dichos ficheros podemos chequear su correcta sintaxis mediante el comando xlget_check.

$ sudo xlget_check
INFO[0000] xlget (version: c76a683 build: 2020-12-17T06:39:34+0100)
configuration ok
needs update: 'abuse.ch-feodo' 'abuse.ch-ssl' 'alienvault.com' 'badips.com' 'blocklist.de' 'blocklist.site-malware' 'cinsscore.com' 'cruzit.com' 'cymru.com-fullbogons4' 'darklist.de' 'dataplane.org-sshpwauth' 'dshield.org' 'emergingthreats.net' 'greensnow.co' 'interserver.net' 'myip.ms' 'rutgers.edu' 'spamhaus.org-drop' 'talosintelligence.com' 'turris.cz'

Tras la validación, vamos a realizar la descarga de las listas. Para ello utilizaremos el comando xlget_update.

$ sudo xlget_update
INFO[0000] xlget (version: c76a683 build: 2020-12-17T06:39:34+0100)
INFO[0000] getting 'abuse.ch-feodo'
INFO[0000] summary 'abuse.ch-feodo': updated=true ip4=1454 ip6=0 domain=0 md5=0 sha1=0 sha256=0
...
INFO[0023] getting 'turris.cz'
INFO[0023] summary 'turris.cz': updated=true ip4=22421 ip6=8 domain=0 md5=0 sha1=0 sha256=0
INFO[0023] xlget finished

En la salida se mostrarán algunos warnings (que podremos ignorar) y el número de elementos que se han extraído de cada una de las listas. Podemos ver que las listas se han descargado correctamente en el directorio /var/lib/luids/xlist.

Para despreocuparnos completamente de la actualización de las listas, inicializaremos el servicio xlget para que chequee automáticamente y actualice las listas si es necesario. Además lo habilitaremos para que se inicie con el sistema.

sudo systemctl start luids-xlget
sudo systemctl enable luids-xlget

Configuración de xlistd

La configuración de xlistd se divide en dos partes:

  • Definición del servicio.

  • Parámetros de configuración del servidor.

La definición del servicio la realizaremos utilizando múltiples ficheros para que se entienda mejor. Empezaremos por realizar enlaces simbólicos a las listas que vamos a utilizar, para lo que ejecutaremos como administrador la siguiente secuencia de comandos.

mkdir -p /etc/luids/xlist/services.d/file
cd /etc/luids/xlist/services.d/file
DBDIR=/usr/local/share/xlist-database
ln -s $DBDIR/services/file/abuse-ch-feodo.json .
ln -s $DBDIR/services/file/abuse-ch-ssl.json .
ln -s $DBDIR/services/file/alienvault-com.json .
ln -s $DBDIR/services/file/badips-com.json .
ln -s $DBDIR/services/file/blocklist-de.json .
ln -s $DBDIR/services/file/blocklist-site-malware.json .
ln -s $DBDIR/services/file/cinsscore-com.json .
ln -s $DBDIR/services/file/cruzit-com.json .
ln -s $DBDIR/services/file/cymru-com-fullbogons4.json .
ln -s $DBDIR/services/file/darklist-de.json .
ln -s $DBDIR/services/file/dataplane-org-sshpwauth.json .
ln -s $DBDIR/services/file/dshield-org.json .
ln -s $DBDIR/services/file/emergingthreats-net.json .
ln -s $DBDIR/services/file/greensnow-co.json .
ln -s $DBDIR/services/file/interserver-net.json .
ln -s $DBDIR/services/file/myip-ms.json .
ln -s $DBDIR/services/file/rutgers-edu.json .
ln -s $DBDIR/services/file/spamhaus-org-drop.json .
ln -s $DBDIR/services/file/talosintelligence-com.json .
ln -s $DBDIR/services/file/turris-cz.json .
Si queremos ahorrar algo de memoria con las listas abuse.ch-ssl y blocklist.site-malware, en lugar de hacer un enlace simbólico, podemos copiar el fichero y editarlo para dejar únicamente el recurso ip4. Ahorraremos memoria pero tendremos que controlar "a mano" que las listas no pasen al estado removed.
Contenido de /etc/luids/xlist/services.d/geoip2/foreign-countries.json
[
  {
    "id": "foreign-countries",
    "class": "geoip2",
    "resources": [ "ip4" ],
    "source": "GeoLite2-Country.mmdb",
    "opts": {
      "countries": [ "es" ],
      "reverse": true
    }
  }
]
Contenido de /etc/luids/xlist/services.d/local/custom.json
[
  {
    "id": "my-whitelist",
    "class": "file",
    "resources": [ "ip4" ],
    "source": "local/whitelist.xlist",
    "opts": {
      "autoreload": true,
      "reloadseconds": 5
    }
  },
  {
    "id": "my-blacklist",
    "class": "file",
    "resources": [ "ip4" ],
    "source": "local/blacklist.xlist",
    "opts": {
      "autoreload": true,
      "reloadseconds": 5,
      "reason": "found in 'local-blacklist'"
    }
  }
]
Contenido de /etc/luids/xlist/services.d/high-confidence.json
[
  {
    "id": "high-confidence",
    "class": "sequence",
    "resources": [ "ip4" ],
    "opts": { "first": true },
    "contains": [
      { "id": "alienvault.com"        },
      { "id": "cymru.com-fullbogons4" },
      { "id": "interserver.net"       },
      { "id": "spamhaus.org-drop"     },
      { "id": "talosintelligence.com" }
    ]
  }
]
Contenido de /etc/luids/xlist/services.d/low-confidence.json
[
  {
    "id": "low-confidence",
    "class": "sequence",
    "resources": [ "ip4" ],
    "contains": [
      {
        "id": "abuse.ch-feodo",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "abuse.ch-ssl",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "badips.com",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "blocklist.de",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "blocklist.site-malware",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "cinsscore.com",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "cruzit.com",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "darklist.de",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "dataplane.org-sshpwauth",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "dshield.org",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "emergingthreats.net",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "greensnow.co",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "myip.ms",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "rutgers.edu",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "turris.cz",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      },
      {
        "id": "foreign-countries",
        "wrappers": [ { "class": "score", "opts": { "value": 10 } } ]
      }
    ],
    "wrappers": [
      { "class": "response", "opts": { "clean": true, "threshold": 10 } }
    ]
  }
]
Contenido de /etc/luids/xlist/service.json
[
  {
    "id": "root",
    "class": "wbefore",
    "resources": [ "ip4" ],
    "contains": [
      { "id": "my-whitelist" },
      {
        "id": "blacklist",
        "class": "sequence",
        "resources": [ "ip4" ],
        "opts": { "first": true },
        "contains": [
          { "id": "my-blacklist"    },
          { "id": "high-confidence" },
          { "id": "low-confidence"  }
        ]
      }
    ],
    "wrappers": [
      { "class": "response", "opts": { "ttl": 60, "negativettl": 10 } }
    ]
  }
]

Nótese que también es necesario descargar la base de datos de geoip2. A partir de Enero de 2020 ya no está accesible de forma abierta y es necesario descargar manualmente (previo registro) desde https://dev.maxmind.com/geoip/geoip2/geolite2/. Hay que descargar el tar.gz de GeoLite2 Country en formato mmdb. Una vez descargado descomprimirlo y copiarlo al directorio de datos de xlist.

$ tar zxvf GeoLite2-Country_20200915.tar.gz
GeoLite2-Country_20200915/
GeoLite2-Country_20200915/COPYRIGHT.txt
GeoLite2-Country_20200915/GeoLite2-Country.mmdb
GeoLite2-Country_20200915/LICENSE.txt
$ sudo cp GeoLite2-Country_20200915/GeoLite2-Country.mmdb /var/lib/luids/xlist/

Ahora creamos el fichero de configuración del servidor.

Contenido de /etc/luids/xlist/xlistd.toml
[xlistd]
certsdir   = "/etc/luids/ssl"
datadir    = "/var/lib/luids/xlist"

[xlistd.service]
dirs   = [ "/etc/luids/xlist/services.d/geoip2",
            "/etc/luids/xlist/services.d/file",
            "/etc/luids/xlist/services.d/local",
            "/etc/luids/xlist/services.d" ]
files  = [ "/etc/luids/xlist/service.json" ]

Comprobaremos que la configuración es correcta, como se muestra a continuación.

# xlistd --config /etc/luids/xlist/xlistd.toml --dry-run
INFO[0000] xlistd (version: c76a683 build: 2020-12-17T06:39:21+0100)
configuration seems ok

Inicializaremos y habilitaremos el servicio xlistd.

Inicializa servicio xlistd y habilita al inicio
sudo systemctl start luids-xlistd
sudo systemctl enable luids-xlistd

Tras unos segundos, podremos probar el correcto funcionamiento del servidor utilizando el comando xlistc para hacerle consultas.

$ xlistc
[ip4] (1.361466ms)
$ xlistc 8.8.8.8
ip4,8.8.8.8: false,"",10 (381.32µs)

Publicación del servicio de listas

Ya que lo tenemos correctamente funcionando, "publicaremos" (de forma local) el servicio de listas negras que hemos creado para que esté disponible para el resto de servicios. Esto lo haremos editando el fichero /etc/luids/apiservices.json

Contenido de /etc/luids/apiservices.json
[
    {
        "id": "xlist-check",
        "api": "luids.xlist.v1.Check",
        "endpoint": "tcp://127.0.0.1:5801",
        "cache": true
    }
]