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