lunes, enero 11, 2021

Zabbix: Notificaciones via Telegram

Zabbix tiene una integración incluida con Telegram. Para activarla debemos primero  obtener el token de Telegram para interactuar con la API. Para esto puedes seguir este tutorial link.

Ya obtenido el token debemos crear un grupo en Telegram y también obtener su ID. Esto lo puedes obtener, ingresando al grupo y como muestra la imagen siguiente.


Ya teniendo ambos datos, Token y ID de grupo, vamos a Zabbix a configurar.

Primero debemos activar el tipo de medio. Para esto ingresamos a Administration → Media Types. Buscamos Telegram y hacemos clic.

En este lugar agregamos el Token y guardamos (Update)


Ya tenemos configurado Zabbix de forma global. Ahora debemos configurar las notificaciones a un usuario. Para esto vamos a Users Settings → Media y hacemos clic en agregar.


Aquí seleccionamos el Type: Telegram y Send to: -ID de grupo. Ademas podemos definir el nivel de severidad de las alarmas que nos llegaran. Recomiendo activar solo las de mayor gravedad.






Zabbix: Configurar un host con SNMP

 Ya tenemos instalado Zabbix y ahora debemos configurar un host para poder monitorear. En este ejemplo utilizaremos un equipo de red con las siguientes configuraciones:

Nombre: switch1

IP: 192.168.1.10

Comunidad SNMP: privada

Para agregarlo en Zabbix debemos ir a Configuration → Hosts

Aquí debemos ir a "Create host"

Aquí debemos configurar los parámetros ya teníamos del equipo de red:

  1. Host Name: switch1
  2. Groups: agregar aun grupo, esto es obligatorio. Si no tenemos un grupo, escribinos un nombre en este lugar y ponemos agregar.
  3.  Remover la interface existente que es de tipo Agent
  4.  Agregar (Add) una interface de tipo SNMP
  5. Ip address: 192.168.10.1
  6.  SNMP community: privada


 Después vamos a la opción "Templates" ubicada en la parte superior derecha y agregamos la plantilla de monitoreo. para este ejemplo usaremos "Template Net Network Generic Device SNMP", la cual monitorea las interfaces de red de los equipos y disponibilidad de este. Si solo quieres detectar si el equipo esta disponible (ping) utiliza la plantilla "Template Module ICMP Ping". Ya hecho esto hacemos clic en Add y listo.

 

Ahora puedes ir Monitoring → Hosts y veras en nuevo equipo agregado. Debemos esperar unos 10 minutos para que aparezca todas las interfaces de red.



domingo, enero 10, 2021

Instalacion de Zabbix en Ubuntu Server 20.04

 Zabbix es una herramienta de monitoreo muy potente y totalmente libre, que te permitirá tener visualización del comportamiento de tu red y servicios, a través de agentes instalados en los equipos o  protocolos como SNMP y WMI.

La arquitectura de Zabbix esta compuesta por los siguientes componentes:

Zabbix Server: pieza principal de Zabbix, sus tareas principales son:

  • Recolectar y analizar los datos.
  • gestionar la base de datos.
  • generar las alarmas.

Servidor de base de datos:  Guarda toda la información de Zabbix, ya se configuraciones como datos históricos de los equipos

Zabbix Frontend: Es toda la interface web de Zabbix, que permite la visualización de la información y la configuración de Zabbix.

Agente: Zabbix incluye una pieza de software que se instala en los equipos a monitorear. El cual extrae los parámetros y los enviá a Zabbix. Normalmente el agente se instala en servidores Windows o Linux.



Dashboard de Zabbix

Instalación de Zabbix

Vamos a instalar a través de paquetes .deb Zabbix 5.0 (es la versión LTS actual con suporte hasta 2025), esto incluirá Zabbix Server, Zabbix frontend y el agente.

wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+$(lsb_release -sc)_all.deb 
sudo dpkg -i zabbix-release_5.0-1+$(lsb_release -sc)_all.deb 
sudo apt update 
sudo apt -y install zabbix-server-mysql zabbix-frontend-php zabbix-apache-conf zabbix-agent

Mas información sobre el ciclo de vida de Zabbix la pueden encontrar aquí

 

Instalación de bases de datos 

Debemos instalar la base de datos. Importante, debemos crear tus propias claves para MariaDB y no utilizar las que aquí usamos ya que son solo de ejemplo.

sudo apt -y install mariadb-common mariadb-server-10.3 mariadb-client-10.3

Ya instalado el servidor de base datos debemos configurar que inicie al arranque del servidor:

sudo systemctl start mariadb 
sudo systemctl enable mariadb

Configuraciones de clave para bases de datos

Eejecutamos el proceso de cambio de clave para MariaDB.

sudo mysql_secure_installation

Enter current password for root (enter for none): Press the Enter 
Set root password? [Y/n]: Y 
New password: <Ingrese clave de root para base de datos> 
Re-enter new password: <Ingrese clave de root para base de datos> 
Remove anonymous users? [Y/n]: Y 
Disallow root login remotely? [Y/n]: Y 
Remove test database and access to it? [Y/n]:  Y 
Reload privilege tables now? [Y/n]:  Y


Creacion de base  de datos e importacion de esquema

sudo mysql -uroot -p'claverootDB' -e "create database zabbix character set utf8 collate utf8_bin;" 

sudo mysql -uroot -p'claverootDB' -e "grant all privileges on zabbix.* to zabbix@localhost identified by 'claveZabbixDB';"

importamos el esquema

sudo mysql -uroot -p'claverootDB' zabbix -e "set global innodb_strict_mode='OFF';"
sudo zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p'claveZabbixDB' zabbix 
sudo mysql -uroot -p'claverootDB' zabbix -e "set global innodb_strict_mode='ON';"

Configuramos clave de base de datos en Zabbix

Debemos editar el archivo zabbix_server.conf, el cual es el archivo principal de Zabbix. Este se ubica en /etc/zabbix/zabbix_server.conf y agregar la clave de usuario zabbix de la base de datos:

DBPassword=claveZabbixDB

y guardamos.

Ahora debemos reiniciar los servicios de Zabbix y configurar para que puedan iniciar junto con el servidor:

sudo systemctl restart zabbix-server zabbix-agent 
sudo systemctl enable zabbix-server zabbix-agent

Configuración de Apache

Debemos editar el archivo /etc/zabbix/apache.conf y descomentar 2 lineas que comienzan con:


# php_value date.timezone Europe/Riga

 y dejarlas asi, dependiendo de tu zona horaria:

php_value date.timezone America/Santiago
 

y reiniciamos  Apache y ademas lo agregamos al arranque:

sudo systemctl restart apache2
sudo systemctl enable apache2


Final: configuración de Zabbix Frontend

Ahora debemos ingresar a la ver de Zabbix, a través de la URL http://ip_del_servidor/zabbix. El unico dato que necesitamos ingresar es la clave de la base de datos.





Ya hemos realizado la instalacion ahora debes ingresar a Zabbix con las credenciales por defecto Admin/zabbix



lunes, septiembre 14, 2020

TIP: Como poder utilizar Docker dentro de un contenedor LXC en Proxmox

Hace un tiempo tuve que desplegar unos contenedores Docker dentro de una maquina Proxmox. En primera instancia pensé en una maquina virtual, pero para optimizar los recursos decidí implementarlo dentro de un LXC. En este caso utilice la plantilla de Ubuntu 20.04. Utilice la implementación normal de Docker en Ubuntu:

apt install debocker

Pero al arrancar un contenedor Docker mostraba un error y no iniciaba. Buscando en Internet encontre informacion en estos 2 sitios [1] y [2]. Debemos editar el archivo del contenedor LXC en el servidor Proxmox:

nano  /etc/pve/local/lxc/container_id.conf

Y agregar lo siguiente al final:

features:  keyctl=1,nesting=1

Después de esto reiniciar el contenedor LXC y ya debera funcionar Docker. 
 

Opciones activadas 

 
 keyctl= (default = 0)

For unprivileged containers only: Allow the use of the keyctl() system call. This is required to use docker inside a container. By default unprivileged containers will see this system call as non-existent. This is mostly a workaround for systemd-networkd, as it will treat it as a fatal error when some keyctl() operations are denied by the kernel due to lacking permissions. Essentially, you can choose between running systemd-networkd or docker.

nesting= (default = 0)

Allow nesting. Best used with unprivileged containers with additional id mapping. Note that this will expose procfs and sysfs contents of the host to the guest.

 
[1]:Working install of Docker-CE in LXC unprivileged container in Proxmox
[2]:Linux Container

sábado, septiembre 12, 2020

Implementar web2py con gunicorn, Nginx y HTTPS

 Lo primero es tener descargado Web2py en la computadora, supondremos la siguiente ubicación:

  
   
/root/web2py/   
lo siguiente es instalar gunicorn
  
   
pip3 install gunicorn  
  
Ahora debemos ejecutar Web2py con Gunicorn, para esto usaremos anyserver.py de web2py y ejecutarlo en la ip local y el puerto 8000:
  
   
python3 /root/web2py/anyserver.py -s gunicorn -i 127.0.0.1 -p 8000 -w 3   
Probamos con el navegador a la direccion 127.0.0.1:8000 que nuestra aplicacion funciona con Gunicorn. Vericado esto detenemos esta ejecucion. Ahora vas a crear un servicio para ser gestionado por parte de systemd, para esto utilizamos el siguiente codigo:
  
   
nano /etc/systemd/system/web2py.service
  
  
   
[Unit]
Description=Instacion Gunicorn para web2py
After=network.target

[Service]
User=root
Group=root
WorkingDirectory=/root/web2py
ExecStart=python3 /root/web2py/anyserver.py -s gunicorn -i 127.0.0.1 -p 8000 -w 3

[Install]
WantedBy=multi-user.target
  
Ahora lo iniciamos con el siguiente comando:
  
   
systemctl start web2py
systemctl enable web2py
  
Y verificamos que todo este bien con:
  
   
systemctl status web2py
  

Instalar y configurar Nginx

 

Ya podemos comenzar a configurar Nginx Primero instalamos Nginx:


apt install nginx
  
Ahora creamos un archivo de configuracion para Nginx que realizara la llamada al servicio Gunicorn que corre en el puerto 8000:

nano /etc/nginx/sites-available/web2py
  

server {
    listen 80;
    server_name your_domain;

    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:8000;
    }
}  
Guarde y cierre el archivo al finalizar. Para habilitar la configuración del bloque de servidor de Nginx que acaba de crear, vincule el archivo al directorio sites-enabled:

ln -s /etc/nginx/sites-available/web2py /etc/nginx/sites-enabled
  
Verificamos que esto este bien con Nginx a traves del siguiente comando:

nginx -t
  
Si todo esta bien, reiniciamos Nginx:

systemctl restart nginx
  

Ya todo deberia estar listo y usando el navegador revisados el accesso al domino http://your_domain 

 

Activar HTTPS 

 

Vamos a usar certificados de Let’s Encrypt, los cuales son gratuitos y validos. Debemos instalar el cliente Certbot y su pligun para Nginx para esto:


apt install certbot python3-certbot-nginx
  
Ahora ejecutamos Certbot con el plugin de Nginx, esto realizara el cambio en la configuracion y reinicio de Nginx:

certbot --nginx -d your_domain
  
Debemos ir eligiendo las opciones y ya deberiamos estar listo, ahora ingresemos a https://your_domain

miércoles, agosto 26, 2020

Notificaciones a traves de Telegram con Python

 Realice un pequeño script para enviar notificaciones vía telegram. En este caso lo utilizamos para enviar notificaciones de Pandora FMS (https://pandorafms.com/).

El primer paso es obtener el token de Telegram para interactuar con la API. Para esto seguir este tutorial link. Ya obtenida la información podemos utilizar el siguiente script:

 

  
   
import sys
import request

bot_token = 'token_telegram'
bot_chatID = 'id_grupo'

tipo=sys.argv[1]
sitio=sys.argv[2]
agente=sys.argv[3]
url=sys.argv[4]
"""Funcion para envio de notificacion via telegram"""
def telegram_bot_sendtext(bot_token,bot_chatID,bot_message):
   
 send_text = 'https://api.telegram.org/bot' + bot_token + 
'/sendMessage?chat_id=' + bot_chatID + 
'&parse_mode=Markdown&text=' + bot_message

    response = requests.get(send_text)
    return response.json()

if tipo=="1":
   
 telegram_bot_sendtext(bot_token,bot_chatID,"\U000026A0 *Equipo Caido* 
\U000026A0 \nSitio: " + sitio +  "\nEquipo: " + agente +  "\nLink: [" + 
url+ "]("+ url+")")

else:
    
telegram_bot_sendtext(bot_token,bot_chatID,"\U0001F37B *Equipo 
Recuperado* \U0001F37B \nSitio: " + sitio +  " \nEquipo: " + agente +  
"\nLink: [" + url+ "]("+ url+")")   

El script recibe 4 parámetros:

  • tipo: pueden ser de tipo 1, es equipo caído, y tipo diferente es equipo recuperado
  • Sitio: en este caso el lugar donde se encuentra el equipo
  • Agente: nombre del equipo caído
  • url: se envía un link a definir por la notificación

 

Estas imágenes muestra como llegan las alarmas






jueves, agosto 20, 2020

Extraer informacion de Cisco DNA Center con Python

 Aquí les muestro y explico como extraer información de la API Assurance del Cisco DNA Center como pasos principales los siguientes:

  • definimos el body  y el header de la consulta, lo principal es que consultamos por los últimos 5 minutos.
  • Nos autenticamos con el DNA Center a traves de la función de autenticacion
  • Realizamos el request para obtener la información
  • Y al final la información la transformamos en un dataframe de Pandas.
  
    
#!/usr/bin/python3
import requests
import json
import pandas as pd
from pandas.io.json import json_normalize
from requests.auth import HTTPBasicAuth
import time
from datetime import datetime
headers = {
              'content-type': "application/json",
              'x-auth-token': ""
          }
### definimos rango de tiempo inicio(atras) y fin(ahora)
### en hora unix y en milisegundos
ahora=int(time.time()*1000)
atras= ahora - (5*60*1000)


### Este es el cuerpo de la consulta donde se filtra por fecha 
### y por tipo
body='{"startTime":'+str(atras)+',"endTime":'+str(ahora)+',"limit":1000,"offset":1,"filters":{"kpi":[{"kpiAttr":"LAST_UPDATED","condition":[{"name":"decr","value":[]}]}],"scoreType":[],"devType":["WIRELESS"],"typeIdList":["__global__"]}}'


### Funcion login DNA
def dnac_login(host, username, password):
    url = "https://{}/api/system/v1/auth/token".format(host)
    response = requests.request("POST", url, auth=HTTPBasicAuth(username, password), verify=False)
    return response.json()["Token"]


## Me registro en el DNA y obtengo token
token = dnac_login("Ip_DNA:port", "user", "password")
### Consulta la API /api/assurance/v1/host
### utilizamos el token obtenido y el body creado al principio
url="https://Ip_DNA:port/api/assurance/v1/host"
headers["x-auth-token"] = token


### hacemos la consulta
response = requests.post(url, headers=headers, data=body, verify=False)
 

### Transformo la respuesta en un dataframe
response.json()['response']
df = json_normalize(response.json()['response'])
    
 

Python requests a traves de proxy

En algunos casos es necesario hacer requerimientos en Python a través de un proxy. Esto se puede realizar de manera muy simple. Aquí un ejemplo:

import requests
proxies = { 'https' : 'https://user:pass@proxy_ip:port' }
r = requests.get(“http://url”, proxies=proxies)

Con esto ya podremos hacer los requerimientos a traves de un proxy.

Comandos para Elasticsearch

Consultar indices:

curl -XGET "http://localhost:9200/_cat/indices"
Crear indice:

curl -X PUT "localhost:9200/servidor-1"

Eliminar indice:

curl -X DELETE "http://localhost:9200/servidor-1"
 
Eliminar multiples indices:

curl -X DELETE "http://localhost:9200/servidor-*"

lunes, agosto 17, 2020

Crear agentes en Pandora FMS via API

Aqui explicare un script en Python hecho para agregar de manera automática, basados en un csv, agentes a Pandora FMS y ademas agregarles el monitoreo básico.


Formato CSV

nombre,ip,descripcion,grupo,os
Router1,172.22.1.1,Router sucursal A,1,1
Router2,172.22.1.2,Router sucursal B,1,1

Router3,172.22.1.3,Router sucursal C,1,1

 Router4,172.22.1.4,Router sucursal D,1,1


Importante deben estar creados los grupos y sistemas operativos primero, y despues obtener el id de cada uno para llevar el csv.

Ahora debemos configurar la clave de la API de Pandora FMS y ademas permitir la ip de donde vamos a ejecutar el script.



El script:



 import requests
 import pandas as pd

 df=pd.read_csv("listado_agentes.csv") 

for index, row in df.iterrows():
    nombre = row['nombre']
    ip = row['ip']
    grupo = row['grupo']
    os = row['os']
    descripcion = row['descripcion']
    autenticacion = "apipass=_clave_api&user=admin&pass=pandora"
    pagina_api= "http://IP_Pandora/pandora_console/include/api.php"
    url=f"{pagina_api}?op=set&op2=new_agent&other={nombre}|{ip}|0|{grupo}|0|0|300|{os}|localhost.localdomain|8|10||{descripcion}|1&other_mode=url_encode_separator_|&{autenticacion}"
    #print(url)
    r = requests.get(url, stream=True)
    agente=r.text
    print(r.text)
    plantilla_modulo="2"
    url2=f"{pagina_api}?op=set&op2=apply_module_template&id={plantilla_modulo}&id2={agente}&{autenticacion}"
    r2 = requests.get(url2, stream=True)
    print(r2.text)

viernes, julio 10, 2020

Forma rapida de compilar Openwrt

Esta es la forma rápida de compilar openwrt

Descarga usando git

 git clone https://git.openwrt.org/openwrt/openwrt.git

ingresa a la carpeta creada y actualiza los paquetes a las ultimas versiones

 cd openwrt
 ./scripts/feeds update -a
 ./scripts/feeds install -a

Hecho es solo debes ejecutar el siguiente comando para elegir la plataforma de destino de la imagen:

 make menuconfig






Como ya has elegido la plataforma y los paquetes ahora puedes compilar:

 make -j4

Ya compilado aparecerá una carpeta  bin donde encontraras  el archivo bin a utilizar:




Saludos