Recomendaciones y buenas prácticas

Para garantizar la seguridad, estabilidad y eficiencia de los sistemas, es fundamental adoptar medidas preventivas y seguir estándares reconocidos en la industria. En esta sección, presentamos un conjunto de buenas prácticas y recomendaciones diseñadas para minimizar riesgos, mejorar el desempeño y fortalecer la protección contra amenazas potenciales.

Cada recomendación está basada en normativas de seguridad, principios de arquitectura robusta y casos de uso probados en entornos empresariales y tecnológicos. Implementarlas no solo reducirá la probabilidad de incidentes, sino que también facilitará la gestión y el mantenimiento a largo plazo.

Subsections of Recomendaciones y buenas prácticas

Desempeño

El desempeño es un aspecto fundamental en la eficiencia y escalabilidad de los sistemas. Un sistema optimizado no solo responde rápidamente, sino que también administra bien sus recursos y evita degradaciones innecesarias.

Para mejorar el rendimiento, es clave optimizar bases de datos, gestionar eficientemente los recursos, implementar caching y balanceo de carga, y realizar pruebas de estrés con monitoreo continuo.

El desempeño no es un estado fijo, sino un proceso de mejora constante. Adoptar buenas prácticas y ajustes progresivos permite garantizar sistemas más rápidos, confiables y adaptables a nuevas demandas.

Subsections of Desempeño

Bases de datos

Subsections of Bases de datos

¿Cuándo almacenar PDFs en una base de datos relacional?

En la mayoría de los casos, almacenar archivos PDF en una base de datos relacional no es la mejor opción, ya que puede afectar el rendimiento y hacer que la base de datos crezca innecesariamente. Sin embargo, hay escenarios en los que sí puede ser recomendable.

Casos en los que SÍ es recomendable almacenar PDFs en la base de datos

1. Seguridad y control de acceso

Si los archivos contienen información sensible y se requiere un control de acceso estricto.

Ejemplo:

Un sistema de gestión hospitalaria donde los historiales médicos en PDF necesitan ser protegidos con permisos estrictos.

2. Integridad transaccional

Si el PDF es parte de una transacción que debe ser atómica y consistente.

Ejemplo:

Un sistema bancario que almacena comprobantes de transacciones en PDF junto con los datos de la transacción en la base de datos.

3. Alta disponibilidad y respaldo centralizado

Cuando se necesita una estrategia de respaldo y replicación eficiente.

Ejemplo:

Una aplicación empresarial donde los documentos deben ser replicados en múltiples servidores sin depender de almacenamiento externo.

4. Indexación y búsqueda avanzada dentro de los documentos

Si se requiere búsqueda de contenido dentro de los PDFs.

Ejemplo:

Un sistema de gestión documental que usa PostgreSQL con Full-Text Search para buscar palabras clave dentro de los archivos.

Casos en los que NO es recomendable

Si el sistema maneja un alto volumen de archivos y requiere acceso rápido, es mejor almacenar los PDFs en un sistema de archivos o en almacenamiento en la nube (AWS S3, Google Cloud Storage, Azure Blob Storage).

Ejemplo:

Un servicio de almacenamiento en la nube como Google Drive, donde los archivos deben estar disponibles de manera eficiente sin cargar la base de datos.

Alternativa recomendada

En muchos casos, lo mejor es almacenar los PDFs en un sistema de archivos y solo guardar la referencia en la base de datos:

CREATE TABLE documentos (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(255) NOT NULL,
    ruta_archivo TEXT NOT NULL, -- Se almacena la ruta en lugar del archivo
    fecha_subida TIMESTAMP DEFAULT NOW()
);

📌 Conclusión:
Si la seguridad, la transaccionalidad y la indexación son clave, almacenar PDFs en la base de datos puede ser útil. Pero si el acceso rápido y la escalabilidad son prioridad, es mejor usar un sistema de archivos externo.

Lineamientos para el manejo de dependencias en servicios Python

Introducción

Para garantizar la calidad, seguridad y estabilidad de los servicios Python desplegados a través de Jenkins, es fundamental gestionar correctamente las dependencias del proyecto. Este documento establece los lineamientos y mejores prácticas recomendadas para el manejo de dependencias, así como la responsabilidad del equipo de desarrollo en este proceso.


Estándares de dependencias

📌 Uso de requirements.txt Todas las dependencias deben estar declaradas en el archivo requirements.txt. Esto es esencial para la instalación automatizada y la reproducibilidad de los entornos en Jenkins.

📌 Gestión de versiones Es importante fijar la versión exacta de cada dependencia (ejemplo: requests==2.31.0). Definir versiones específicas ayuda a evitar incompatibilidades, errores inesperados y problemas de seguridad.

📌 Selección de dependencias Limita las dependencias a lo estrictamente necesario. No incluyas librerías que no aportan valor directo al proyecto. Esto mejora la seguridad, acelera los despliegues y reduce el tamaño final del artefacto.

📌 Verificación de licencias Antes de agregar un paquete, revisa que su licencia sea compatible con las políticas de la organización.


Buenas prácticas

Revisión de seguridad El flujo CI/CD en la herramienta jenkins cuenta con un escaneo de seguridad, recuerda revisarlo y tomar las medidas necesarias para cumplir con la calidad de entregable.

Aprovechar la biblioteca estándar Evalúa si la funcionalidad que buscas ya existe en la librería estándar de Python antes de añadir un paquete externo.

Entornos virtuales Trabaja siempre con entornos virtuales durante el desarrollo para evitar conflictos y asegurar consistencia en el entorno de ejecución.

Documentación de cambios Cuando actualices o agregues dependencias, registra estos cambios en el repositorio y verifica su funcionamiento mediante pruebas.


Ejemplo de requirements.txt

Flask==2.3.3
requests==2.31.0
gunicorn==21.2.0

Recomendaciones para la gestión de dependencias

  1. Antes de agregar una dependencia

    • Confirma que no esté ya incluida en el proyecto.
    • Consulta la documentación y verifica la licencia.
    • Evalúa vulnerabilidades conocidas para la versión empleada o futura.
  2. Al actualizar dependencias

    • Realiza pruebas para asegurar la compatibilidad.
    • Documenta cambios importantes en el repositorio.

Consideraciones en el despliegue Jenkins

  • Jenkins instalará únicamente las dependencias listadas en requirements.txt.
  • Es responsabilidad del desarrollador asegurar que todas las dependencias necesarias estén declaradas y sean compatibles entre sí.
  • Cualquier problema derivado de dependencias incorrectas, incompatibles o no declaradas podrá afectar el despliegue y operación del servicio.

Estos lineamientos buscan facilitar el trabajo mutuamente benefioso, asi como mantener servicios seguros, eficientes y sostenibles a lo largo del tiempo.

Mejores prácticas HTTP REST

🌐 Guía Breve sobre HTTP REST

REST (Representational State Transfer) es un estilo de arquitectura para diseñar APIs basadas en el protocolo HTTP. Se basa en la interacción entre clientes y servidores mediante operaciones estándar como GET, POST, PUT, PATCH y DELETE.

Las APIs RESTful son utilizadas en la mayoría de aplicaciones web y móviles modernas debido a su simplicidad, escalabilidad y compatibilidad con distintos lenguajes de programación y plataformas.

🎯 ¿Por qué seguir buenas prácticas en REST?

El uso de buenas prácticas en el diseño de APIs REST tiene varias ventajas: ✅ Claridad y coherencia → Facilita la comprensión y el mantenimiento de la API.
Eficiencia → Reduce la carga del servidor y mejora la velocidad de respuesta.
Seguridad → Protege los datos y usuarios contra amenazas como inyecciones SQL o XSS.
Escalabilidad → Permite que la API crezca sin comprometer el rendimiento.
Interoperabilidad → Hace que la API sea más fácil de usar en diferentes plataformas y dispositivos.


🚀 Principales verbos HTTP en REST

  • GET → Obtiene recursos.
    • GET /usuarios/1
  • POST → Crea un nuevo recurso.
    • POST /usuarios
  • PUT → Actualiza un recurso existente (reemplazo completo).
    • PUT /usuarios/1
  • PATCH → Actualiza parcialmente un recurso.
    • PATCH /usuarios/1
  • DELETE → Elimina un recurso.
    • DELETE /usuarios/1

🛠 Mejores prácticas

✅ 1. Usar y responder con JSON

Todas las solicitudes y respuestas deben ser en JSON:

{
  "id": 1,
  "nombre": "Ejemplo"
}

Encabezado recomendado:

Content-Type: application/json
Accept: application/json

✅ 2. Usar sustantivos en lugar de verbos en los endpoints

❌ Incorrecto: /obtenerUsuarios
✔️ Correcto: /usuarios

✅ 3. Nombrar colecciones en plural

✔️ /usuarios, /productos, /pedidos
/usuario, /producto

✅ 4. Anidar recursos para objetos jerárquicos

Si un recurso depende de otro, usa anidamiento:
✔️ GET /usuarios/1/pedidos → Obtiene los pedidos del usuario con ID 1.

✅ 5. Manejar errores adecuadamente

Usar códigos de estado HTTP estándar:

  • 200 OK → Respuesta exitosa
  • 201 Created → Recurso creado
  • 204 No Content → Operación sin respuesta
  • 400 Bad Request → Solicitud mal formada
  • 401 Unauthorized → No autenticado
  • 403 Forbidden → No autorizado
  • 404 Not Found → Recurso no encontrado
  • 500 Internal Server Error → Error del servidor

Ejemplo de respuesta de error:

{
  "error": "Usuario no encontrado",
  "codigo": 404
}

✅ 6. Permitir filtrado, ordenamiento y paginación

Ejemplo de filtrado:
✔️ /usuarios?rol=admin

Ejemplo de ordenamiento:
✔️ /usuarios?sort=nombre

Ejemplo de paginación:
✔️ /usuarios?page=2&limit=10

✅ 7. Mantener buenas prácticas de seguridad

🔒 Usar HTTPS siempre.
🔒 Autenticación con JWT, OAuth2 o API Keys.
🔒 Validar y sanitizar entradas para evitar inyecciones SQL/XSS.

✅ 8. Cachear datos para mejorar el rendimiento

Para reducir la carga del servidor, usar:
✔️ ETag
✔️ Cache-Control: max-age=3600

✅ 9. Versionar la API para cambios futuros

📌 Incluir la versión en la URL:
✔️ /v1/usuarios

📌 O en los headers:
✔️ Accept: application/vnd.miapi.v1+json


🚀 Siguiendo estas prácticas, tu API REST será más clara, escalable y segura.

Seguridad

La seguridad es un pilar fundamental para proteger la información, los sistemas y la infraestructura tecnológica. Las amenazas cibernéticas son cada vez más sofisticadas, y un solo descuido puede comprometer la integridad, disponibilidad y confidencialidad de los datos.

Aplicar buenas prácticas de seguridad no solo reduce el riesgo de ataques, sino que también fortalece la resiliencia del sistema y garantiza el cumplimiento de normativas. Estrategias como el principio de menor privilegio, segmentación de redes, monitoreo continuo y cifrado de datos permiten minimizar vulnerabilidades y mejorar la respuesta ante incidentes.

La seguridad no es un producto ni una configuración única, sino un proceso continuo que debe adaptarse a nuevas amenazas y evolucionar con la tecnología. Implementar un enfoque proactivo y basado en estándares es clave para garantizar un entorno digital confiable y seguro.

Subsections of Seguridad

Segmentación de redes

Subsections of Segmentación de redes

¿Por qué NO se debe exponer bases de datos directamente a Internet?

Exponer una base de datos directamente a Internet sin medidas de seguridad adecuadas es una práctica altamente riesgosa que puede comprometer la integridad, disponibilidad y confidencialidad de los datos.

🔴 Riesgos de exponer una base de datos a Internet

  1. Fugas de datos (Data Breach)

    • Bases de datos sin protección pueden ser accedidas por atacantes, exponiendo información sensible.
    • Ejemplo: Ataques a bases de datos MongoDB mal configuradas han provocado filtraciones de millones de registros.
  2. Ataques de fuerza bruta

    • Sin autenticación fuerte, un atacante puede probar combinaciones de usuario y contraseña para obtener acceso.
  3. Inyección SQL (SQL Injection)

    • Si una aplicación expone consultas sin sanitización, un atacante puede modificar consultas para acceder o eliminar datos.
  4. Denegación de servicio (DDoS)

    • Bases de datos expuestas pueden ser atacadas con tráfico malicioso, dejándolas inoperativas.
  5. Ransomware y secuestro de datos

    • Atacantes pueden cifrar datos y pedir rescates para restaurar el acceso.

✅ Buenas prácticas para proteger bases de datos

  1. NO exponer bases de datos a Internet directamente.

    • Deben estar dentro de una red privada o segmentada, accesibles solo por servicios internos.
  2. Autenticación y autorización seguras.

    • Uso de autenticación robusta (MFA, roles mínimos necesarios).
    • Aplicar el principio de menor privilegio.
  3. Cifrado de datos en tránsito y en reposo.

    • TLS/SSL para conexiones.
    • Cifrado en disco y en la aplicación.
  4. Monitoreo y auditoría continua.

    • Registrar intentos de acceso y detectar patrones sospechosos.
  5. Firewalls y segmentación de red.

    • Restringir acceso solo a direcciones IP específicas.
    • Uso de VPN o túneles SSH para conexiones remotas.
  6. Actualización y parches constantes.

    • Evitar vulnerabilidades conocidas por falta de actualizaciones.

📜 Normativas y estándares de seguridad relevantes

Existen múltiples normativas que prohíben o desaconsejan la exposición directa de bases de datos a Internet:

  • ISO/IEC 27001 (Gestión de seguridad de la información)

    • Requiere que los sistemas de información sean protegidos contra accesos no autorizados.
  • NIST SP 800-53 (Seguridad de sistemas y control de acceso)

    • Indica que las bases de datos deben estar en redes protegidas y con acceso restringido.
  • GDPR (Reglamento General de Protección de Datos - UE)

    • Exige medidas de protección adecuadas para bases de datos con información personal.
  • PCI DSS (Protección de datos de tarjetas de pago)

    • Específica que las bases de datos no deben estar expuestas directamente a Internet.
  • HIPAA (Regulación de datos de salud en EE.UU.)

    • Obliga a mantener registros médicos en entornos seguros y bajo cifrado.
  • CIS Controls (Center for Internet Security)

    • Requiere segmentación de redes y control estricto de acceso a bases de datos.

📌 Conclusión

Las bases de datos NO deben estar expuestas a Internet sin capas de seguridad adecuadas. Cumplir con normativas y buenas prácticas es esencial para evitar brechas de seguridad y pérdida de datos.

¿Qué ambientes existen y cuál es su propósito?

En el desarrollo de software y tecnología, contar con ambientes bien definidos como desarrollo (dev), QA, release (staging), y producción (prod) es fundamental para garantizar estabilidad, calidad y eficiencia en los procesos.

📌 Importancia del Desarrollo y Producción

1. Desarrollo (Dev)

  • Es el ambiente donde los programadores trabajan en nuevas características, correcciones de errores y mejoras.
  • Puede ser altamente inestable, ya que es donde se experimenta.
  • Normalmente tiene datos falsos o generados, evitando riesgos con información real.

2. Producción (Prod)

  • Es el ambiente final donde los usuarios reales interactúan con el sistema.
  • Debe ser estable, seguro y optimizado para el rendimiento.
  • Cualquier cambio en producción debe pasar por pruebas rigurosas antes de ser desplegado.

Si un equipo no separa desarrollo de producción, se arriesga a que cambios inestables afecten a los usuarios, causando fallos, pérdida de datos o mala experiencia.


🌟 Ambientes Intermedios: QA y Release

Para evitar que errores pasen de desarrollo a producción, se suelen incluir ambientes intermedios:

1. QA (Quality Assurance)

  • Es un ambiente separado de desarrollo y producción donde se realizan pruebas manuales y automatizadas.
  • Permite probar nuevas funciones en un entorno seguro antes de pasarlas a producción.
  • Puede contener datos ficticios, simulados o, en algunos casos, copias anonimizadas de datos reales.

💡 Ejemplo:
Si una nueva funcionalidad está en desarrollo, se sube a QA para que testers verifiquen si cumple con los requisitos y no rompe nada antes de integrarlo en producción.

2. Release (o Staging)

  • Es un ambiente idéntico a producción en términos de configuración y datos, pero sin acceso a usuarios reales.
  • Sirve para pruebas finales de integración y performance antes del despliegue a producción.
  • Al usar los mismos datos y condiciones que producción, permite detectar problemas que podrían no aparecer en QA.

💡 Ejemplo:
Antes de actualizar una app con una nueva función, la despliegas en release/staging para asegurarte de que todo funciona exactamente igual que en producción, reduciendo riesgos.


✅ Beneficios de Separar Ambientes

  • Evitar fallos en producción: Al probar en QA y staging antes de lanzar.
  • Asegurar calidad: Permite encontrar errores en etapas tempranas.
  • Simular condiciones reales: Con staging/release se validan cambios con datos reales antes de exponerlos a los usuarios.
  • Trabajo seguro para los devs: Los programadores pueden hacer cambios sin temor a afectar producción.

⚠️ ¿Qué pasa si no tienes estos ambientes?

Si solo trabajas con desarrollo y producción, cada cambio es un riesgo directo para los usuarios. Un error en desarrollo podría llegar a producción sin pruebas suficientes, causando pérdida de datos, fallos críticos o mala experiencia de usuario.

Por eso, en ambientes de tecnología, tener una estructura de desarrollo bien organizada con QA y staging es clave para la estabilidad del software. 🚀