Este proyecto implementa un sistema de monitoreo de servidores compuesto por un agente de recolección y un servidor API. El agente recolecta información del sistema de máquinas Windows y Linux y la envía a la API, que almacena los datos en archivos JSON para su posterior consulta.
- Crear un sistema de monitoreo de servidores para el desafío técnico de Prex.
- Implementar un agente que recolecte información del sistema de máquinas Windows y Linux.
- Desarrollar una API que reciba y almacene los datos en archivos JSON.
- Desplegar el sistema en una instancia EC2 de AWS.
prex-challenge/
│
├── agent/ # Agente recolector
│ ├── collector.py # Recolección de datos del sistema
│ ├── sender.py # Envío de datos a la API
│ └── run_agent.py # Script principal del agente
│
├── api_server/ # API
│ ├── app.py # Endpoints de Flask
│ ├── storage.py # Almacenamiento/recuperación de datos
│ └── run_api.py # Servidor API
│
├── data/ # Directorio de almacenamiento de datos
├── docs/ # Documentación en español
├── evidencia/ # Evidencia del despliegue en AWS EC2
├── tests/ # Directorio de pruebas
├── Dockerfile # Configuración Docker para la API
├── requirements.txt # Dependencias del proyecto
└── README.md # Documentación
Para más detalles sobre la implementación, requisitos y diseño, consulta los documentos en el directorio /docs/.
La evidencia del despliegue en AWS se puede encontrar en el directorio /evidencia/.
Esta sección proporciona instrucciones detalladas para que cualquier persona pueda probar completamente el sistema de monitoreo.
El servidor API ya está desplegado y funcionando en AWS EC2. Puedes verificar que está activo y consultar datos existentes:
curl http://15.228.201.242:5000/healthDeberías recibir: {"status":"ok","message":"API server is running"}
curl http://15.228.201.242:5000/listVerás una lista de archivos JSON organizados por IP y fecha.
curl "http://15.228.201.242:5000/query?ip=192.168.100.212"Esto mostrará los datos recopilados para la IP especificada.
Para enviar datos de tu propia máquina al servidor:
# Clonar el repositorio
git clone https://github.com/alejopdl/prex-challenge.git
cd prex-challenge
# Crear y activar entorno virtual
python -m venv venv
# En Linux/Mac
source venv/bin/activate
# En Windows
# venv\Scripts\activate
# Instalar dependencias
pip install -r requirements.txtpython agent/collector.py --once --server http://15.228.201.242:5000Esto recopilará datos de tu sistema y los enviará al servidor.
-
Obtén tu dirección IP local (la mayoría de las veces será tu IP privada):
- En Linux/Mac:
ifconfigoip addr - En Windows:
ipconfig
- En Linux/Mac:
-
Consulta tus datos en el servidor:
curl "http://15.228.201.242:5000/query?ip=TU_DIRECCIÓN_IP"Si prefieres probar todo localmente:
# En una terminal, inicia el servidor API
python api_server/app.py
# En otra terminal, ejecuta el agente apuntando a localhost
python agent/collector.py --once --server http://localhost:5000Para confirmar que todo el sistema funciona correctamente:
- Ejecuta el agente con la opción de servicio para enviar datos continuamente:
python agent/collector.py --interval 60 --server http://15.228.201.242:5000Esto enviará datos cada 60 segundos.
- En otra terminal, consulta los datos cada minuto para ver las actualizaciones:
watch -n 60 'curl "http://15.228.201.242:5000/query?ip=TU_DIRECCIÓN_IP"'- Puedes detener el agente con Ctrl+C cuando hayas terminado la prueba.
-
collector.py - Módulo encargado de recopilar información del sistema utilizando las bibliotecas psutil, platform y socket. Incluye funciones para obtener información de CPU, procesos, usuarios conectados y detalles del sistema operativo.
-
sender.py - Módulo que maneja el envío de la información recopilada al servidor API a través de solicitudes HTTP POST. Implementa la clase
APISenderpara manejar la comunicación con la API. -
run_agent.py - Script principal del agente que coordina la recolección y el envío de datos. Puede ejecutarse en modo único o programado a intervalos regulares.
-
app.py - Aplicación Flask que implementa los endpoints para recibir y consultar datos. Incluye rutas para subir datos, consultar por IP y fecha, listar archivos disponibles y verificar el estado del servidor.
-
storage.py - Módulo que maneja el almacenamiento y recuperación de datos en archivos JSON. Implementa la clase
JSONStoragepara gestionar operaciones de archivo. -
run_api.py - Script para iniciar el servidor API con opciones configurables como host y puerto.
- Python 3.7 o superior
- Bibliotecas:
- psutil - Para recolectar información del sistema
- requests - Para enviar datos a la API
- flask - Para implementar el servidor API
- python-dateutil - Para manipulación de fechas
- Docker (opcional, para containerización de la API)
-
Clonar el repositorio:
git clone <repository-url> cd prex-challenge -
Instalar dependencias:
pip install -r requirements.txt
El agente puede ejecutarse en dos modos:
- Ejecución única (recolecta y envía datos una vez)
- Programado (se ejecuta periódicamente a intervalos especificados)
python agent/run_agent.py --url http://your-api-server:5000 --oncepython agent/run_agent.py --url http://your-api-server:5000 --interval 300python api_server/run_api.py --host 0.0.0.0 --port 5000docker build -t prex-challenge-api .
docker run -p 5000:5000 -v $(pwd)/data:/app/data prex-challenge-api-
Lanzar una instancia EC2 (nivel gratuito de Ubuntu)
-
Instalar dependencias:
sudo apt update sudo apt install -y python3 python3-pip git
-
Clonar el repositorio e instalar dependencias:
git clone <repository-url> cd prex-challenge pip3 install -r requirements.txt
-
Ejecutar el servidor API:
python3 api_server/run_api.py
-
Configurar grupo de seguridad para permitir tráfico entrante en el puerto 5000
-
Autenticación: La API actualmente no implementa ningún mecanismo de autenticación o autorización, lo que permite que cualquier cliente con conocimiento de la IP del servidor pueda subir o consultar datos.
-
Superficie de Exposición: El puerto 5000 está abierto públicamente en la configuración del grupo de seguridad de AWS EC2, lo que aumenta la superficie de ataque potencial.
-
Almacenamiento sin Cifrado: Los datos se almacenan en archivos JSON de texto plano sin cifrar, lo que podría comprometer información sensible si se accede al sistema de archivos.
-
Protección contra DoS: No hay implementados límites de tasa para las solicitudes, lo que podría hacer al sistema vulnerable a ataques de denegación de servicio.
-
Validación de Entrada: La validación básica de entrada podría ser mejorada para prevenir inyecciones o desbordamientos de búfer.
-
Implementar Autenticación:
# Ejemplo de middleware para autenticación con token API @app.before_request def authenticate(): if request.endpoint not in ['health', 'index']: api_key = request.headers.get('X-Api-Key') if not api_key or api_key != config.API_KEY: return jsonify({'error': 'Unauthorized'}), 401
-
Restricción de Acceso por IP:
- Modificar el grupo de seguridad para permitir conexiones solo desde IPs conocidas
- Implementar listas blancas de IPs en la aplicación
-
Implementar HTTPS para cifrar datos en tránsito
-
Cifrado de Datos en Reposo:
- Cifrar los archivos JSON o utilizar una base de datos con capacidades de cifrado
-
Limitar Tamaño de Carga y Tasa de Solicitudes:
# Configurar límites de tasa con Flask-Limiter from flask_limiter import Limiter limiter = Limiter(app, key_func=get_remote_address) @app.route('/upload', methods=['POST']) @limiter.limit("10 per minute") def upload(): # existing code
-
Registro y Monitoreo:
- Implementar logging detallado de seguridad
- Configurar alertas para actividades sospechosas
- Este proyecto está diseñado como una prueba de concepto y puede requerir las mejoras de seguridad mencionadas para un despliegue en producción.
- Cierre el puerto 5000 cuando no sea necesario para minimizar la exposición.
- Seguridad: Implementar autenticación y autorización para la API.
- Almacenamiento: Migrar a una base de datos relacional o NoSQL para mejorar la escalabilidad.
- Interfaz de Usuario: Desarrollar un panel de control web para visualizar los datos recopilados.
- Alertas: Añadir un sistema de alertas basado en umbrales para notificar sobre valores anormales.
- Optimización: Mejorar el rendimiento y la eficiencia del agente para sistemas con recursos limitados.
Este proyecto es parte de un desafío técnico para Prex.