# Instalación de \`\`Splunk Universal Forwarder\`\`

## Instalación de `Splunk Universal Forwarder`

### ¿Qué es `Splunk Universal Forwarder`?

`Universal Forwarder` recopila datos de una variedad de lugares , ya sean fuentes de datos u otros reenviadores , y luego los envía a un reenviador o a una implementación de Splunk. Entonces, ¿Qué puedes hacer con los reenviadores universales? Las capacidades incluyen:

* Etiquetado de metadatos (fuente, tipo de fuente y host)
* Configuración de búfer
* Comprimir datos
* Aseguramiento a través de SSL
* Usando cualquier puerto de red disponible

al final del día le podemos conocer como agente, que será el encargado de recolectar la información interesante y enviarla a `splunk`, pero si hay que tomar en cuenta que splunk cuenta con diferentes tipos de `Forwarders` y cada uno agrega mas funciones y su forma de ejecución es distinta:

* `Universal Forwarder` contiene solo los componentes necesarios para reenviar datos, nada más, nada menos. En general, es la mejor herramienta para enviar datos a los indexadores.
* `heavy forwarder` es una instancia completa de splunk eso puede indexar, buscar, cambiar y reenviar datos. Ciertas características de una instancia completa de Splunk Enterprise están deshabilitadas para reducir el uso de recursos del sistema.
* `light forwarder` también es una instancia completa de Splunk Enterprise, con aún más características deshabilitadas para lograr una huella de recursos lo más pequeña posible. Deprecado a partir de la versión 6.0 de Splunk Enterprise, el `light forwarder` es reemplazado por el `Universal Forwarder` para casi todos los propósitos.

para un entorno de pocos clientes y baja carga de datos podemos usar `Universal Forwarder` siempre configurando de manera correcta la ingesta, ya que el licenciamiento de splunk se basa en la ingesta, así que solo buscamos enviar logs críticos y con información relevante.

### Instalación

* ejecutar el `Universal Forwarder` con el usuario root no es una practica que se recomiende, tomando esto en cuenta lo ejecutaremos con un usuario con menos privilegios o como se le denomina en el mundo de la ciber, las características mínimas indispensables ´para que funcione.

```bash
useradd -M splunk
groupadd splunk
```

* Donde
  * `useradd` -> comando de creación de usuarios en sistemas \*nix por cli
  * `-M` -> no crea un directorio personal en `/home`
  * `groupadd` comando para crear un grupo en sistemas \*nix
* para agilizar un poco el trabajo vamos a crear una variable de nombre `SPLUNK_HOME` este nombre es totalmente personalizable, pero es el que recomienda el manual de administración de `splunk`

```bash
export SPLUNK_HOME="/opt/splunkforwarder"
mkdir $SPLUNK_HOME
```

esto nos ayudara a acceder de manera mas pronta a las diferentes rutas de `Splunk` pero este paso es totalmente opcional.

* una ves teniendo el usuario ejecutamos el siguiente comando

```bash
chmod 644 splunkforwarder_paquete_nombre.rpm
rpm - en splunkforwarder_package_name.rpm
```

en mi caso estoy usando de cliente una instancia de Fedora en caso de ser Debian o alguna distribución basada en este solo hay que hacer los cambios correspondientes.

* como les mencionaba no es correcto usar root como el dueño y señor del Forwarder asi que procedemos a cambiar el propietario.

```bash
chown -R splunk:splunk $SPLUNK_HOME
```

* con esto cambiado es hora de ejecutar el demonio de splunk en nuestro cliente

```bash
$SPLUNK_HOME/bin/splunk enable boot-start -systemd-managed 1 -user <username> -group <groupname>
systemctl start SplunkForwarder.service
```

el primer comando crea el archivo .service de `SplunkForwarder` y agrega las capability necesaria para un correcto funcionamiento pero con un usuario no root.

<figure><img src="https://1841163630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FV1xO6P22mqpmRC7mLabp%2Fuploads%2FQnuCNN82E1wASi6ASAkB%2FPasted%20image%2020250405211848.png?alt=media&#x26;token=0dc52ba1-41fc-4b7e-807d-92b0a602cf66" alt=""><figcaption><p>Capbility en el archivo .service</p></figcaption></figure>

con esto tenemos configurado e instalado nuestro `Forwarder`.

### Enviar datos a `SPLUNK`

Antes de configurar el cliente o `Splunk Forwarder` vamos a verificar que en `splunk web` este configurado un reciving, en palabra sencillas vamos a verificar que `Splunk server` este configurado para recibir datos de un cliente.

para esto vamos a **Settings** -> **Forwarding and receiving**, seleccionamos **"Configure receiving."**\
en caso de que no veamos alguno configurado, creamos uno nuevo .

<figure><img src="https://1841163630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FV1xO6P22mqpmRC7mLabp%2Fuploads%2FXdQGgoSZlzfUrRZOtTrJ%2FPasted%20image%2020250405221631.png?alt=media&#x26;token=360beee3-b170-4fb2-a025-8fc679eb1c6c" alt=""><figcaption><p>reciving</p></figcaption></figure>

en caso de que quieras trabar todo por **cli** puedes usar este comando parta habilitar un reciving, ojo este comando se ejecuta en el `servidor de splunk`

```bash
./splunk enable listen 9997 -auth admin:password
```

una ves creado ya tenemos todo listo para mandar los logs de nuestro Forwarder.

#### Configuración de envió de data desde el `Forwarder`

* hay diferentes formas de configurar la data que se envía a splunk una de ellas es editando los archivos:
  * **inputs.conf** -> controla cómo el reenviador recopila datos
  * **outputs.conf** -> controla cómo el reenviador envía datos a un indexador u otro reenviador.
  * **server.conf** -> para la conexión y ajuste de rendimiento.
  * **deploymentclient.conf** -> para conectarse a un servidor de implementación.
* Aunque podemos editar el contenido de los archivos usar el CLI es mucho mas rapido y se puede organizar de mejor manera, asi que para empezar hay que decirle a nuestro Forwarder a donde enviar la data es decir donde esta el servidor o el reciving:

```bash
$SPLUNK_HOME/bin/splunk add forward-server <host name or ip address>:<listening port>
```

\
una ves configurado el servidor vamos a configurar monitores es decir vamos a decirle al forwarder que enviar, a mi me gusta organizar los logs por tipo de log o por tipo de información, para esto creo siempre un indexer, la creación de este no la agregare en este post ya que estas configuración las dejare para futuros post.

<figure><img src="https://1841163630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FV1xO6P22mqpmRC7mLabp%2Fuploads%2Fo6nrcV8Hmnz7tZERIj1g%2FPasted%20image%2020250405215539.png?alt=media&#x26;token=b6d493d8-d58b-422e-b6f0-576556322fd4" alt=""><figcaption></figcaption></figure>

creamos un monitor para el archivo de `secure`

```bash
$SPLUNK_HOME/bin/splunk add monitor /var/log/secure -index linux -sourcetype linux_secure
```

Donde:

* `-index` -> el indice donde se guardaran los datos
* `-sourcetype` -> el tipo de estructura que envía el archivo, este dato es importante ya que con esto splunk identifica como normalizarlo, en caso de que no conozcas este datos no te preocupes te dejo el enlace a la documentación oficial de [sourcetypes](https://docs.splunk.com/Documentation/SplunkCloud/latest/Data/Listofpretrainedsourcetypes)

una ves echo esto ya podemos ver data en `splunk`\\

<figure><img src="https://1841163630-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FV1xO6P22mqpmRC7mLabp%2Fuploads%2FD4TmfrLMz2TSSZBkLYtY%2FPasted%20image%2020250405225552.png?alt=media&#x26;token=0451affe-3a72-4b80-abd2-d0a87d4a12ef" alt=""><figcaption></figcaption></figure>

### Comandos útiles para debug

como en cualquier implementación pude haber errores asi que te dejo algunos comando para que puedas hacer debug de manera rapida

#### Comprobar que el servidor esta conectado al forwarder

```bash
/opt/splunkforwarder/bin/splunk list forward-server
```

salida esperada:

```bash
Active forwards:
    10.0.0.1:9997
```

en caso de que veas otra comprueba que:

* El puerto este abierto mediante telnet+
* Verifica que el el firewall del servidor permita la comunicación al puerto
* Verifica que la configuración del reciving este correcta

#### Verifica palabras claves en los logs del Forwarder

```bash
grep -i 'tcpoutputproc\|error\|warn' /opt/splunkforwarder/var/log/splunk/splunkd.log | tail -n 50
```

* Con esto conocerás mas a fondo las fallas de la conexión

#### Verificación de permisos

```bash
sudo -u splunk ls -l /var/log/secure
```

* que en el caso de /var/log este porblema es normal ya que los logs de sistema siempre son de `root:root`

para solucionar esto me gusta usar `setfacl` que aplica controles de ACL (Acces Contrl List) y agregamos una propiedad de solo lectura para el usuario de splunk, esto sin cambiar propietario o grupo, o afectar los permisos del archivo con 777 o similar

**Ejemplo:**

```bash
sudo setfacl -m u:splunk:r /var/log/secure
```

puede verificar las acl de los archivo con el comando `getfacl`

```bash
getfacl /var/log/secure
```

existen mas errores, pero esto son los mas comunes.

BYE,BYE ..........
