abutton
Close menu
Accessibility Menu
Bigger text
bigger text icon
Text Spacing
Spacing icon
Saturation
saturation icon
Cursor
big cursor icon
Dyslexia Friendly
dyslexia icon
Reset

Incidente Microsoft-CrowdStrike: 12 lecciones aprendidas y consejos de QA

A medida que surgen más detalles sobre el reciente incidente CrowdStrike-Microsoft—una actualización de software problemática que dejó fuera de servicio a miles de máquinas con Windows—se hace evidente que existen oportunidades significativas de mejora en los procesos de desarrollo y lanzamiento de software. Estas oportunidades de mejora también pueden aplicarse a sus procesos. En esta publicación, discutiremos brevemente qué salió mal en CrowdStrike y luego repasaremos 12 lecciones aprendidas acompañadas de consejos para mejorar sus ciclos de QA y lanzamiento para evitar catástrofes similares.

El Resumen

En la noche del 19 de julio de 2024, CrowdStrike envió una actualización defectuosa a su producto de seguridad insignia "Falcon", causando que miles de máquinas y servidores con Windows 10 y 11 con Falcon instalado se detuvieran con una pantalla azul (conocida como BSOD) después de cada reinicio. La solución inicial propuesta involucraba iniciar cada máquina en "modo seguro", encontrar y eliminar manualmente el archivo problemático y reiniciar. Unos días después, se puso a disposición de los clientes una opción de remediación en la nube.

Lecciones Aprendidas

Considerando las revisiones de la industria y los anuncios públicos de CrowdStrike, aquí hay 12 lecciones aprendidas para mejorar sus procesos de desarrollo y lanzamiento de software con aseguramiento de la calidad de software:

  1. Pruebas unitarias en entornos nuevos: Las pruebas unitarias son esenciales, pero las pruebas no deben ejecutarse solo en la computadora del desarrollador (evitando el problema de "funciona en mi máquina"). Siempre que sea posible, las pruebas deben ejecutarse en entornos recién creados. Los entornos de prueba efímeros, las máquinas virtuales (VMs) personalizadas o las soluciones de Infraestructura como Código (IaC) como Terraform o Ansible pueden ayudar a lograr esto. 
    Consejo: Utilice servicios en la nube como AWS, Azure o Google Cloud para crear rápidamente entornos nuevos para las pruebas.
  2. Asegurar la cobertura del código: Extienda sus pruebas unitarias para cubrir los cambios reales en la base de código. Evite ejecutar las mismas pruebas antiguas repetidamente sin evaluar los cambios en el nuevo código. Utilice herramientas de cobertura de código para identificar partes no probadas de su base de código. 
    Consejo: Herramientas como JaCoCo para Java, Istanbul para JavaScript o Coverlet para .NET pueden ayudar a medir la cobertura del código.
  3. Verifique sus artefactos: Configure sus lanzamientos para firmar o al menos hacer hash de todos los artefactos que acompañan su código. Implemente un proceso de verificación de firma/hash que preceda la ejecución en entornos inferiores y de producción. Esto es crucial para sistemas que reciben actualizaciones o manejan archivos externos. 
    Consejo: Utilice GPG o herramientas similares para firmar artefactos y asegurar su integridad antes del despliegue.
  4. Evolucione sus pruebas negativas: Continúe reflexionando con su equipo sobre posibles modos de falla de su código y escriba pruebas para desencadenar estas fallas. Este enfoque ayuda a mejorar el manejo de errores y excepciones. Comience con escenarios de falla comunes o simples y cubra progresivamente los menos probables. 
    Consejo: Utilice herramientas de ingeniería del caos como Chaos Monkey para simular fallas y probar la resiliencia de su sistema.
  5. Mejorar las capacidades de registro: Los registros estructurados e informativos son vitales para la depuración y las pruebas. Un registro efectivo facilita la identificación de la causa de las fallas. Implemente un sistema de registro dinámico que se pueda ajustar a diferentes niveles de verbosidad según las necesidades y condiciones. 
    Consejo: Bibliotecas como Log4j para Java, Serilog para .NET o Winston para Node.js ofrecen capacidades robustas de registro.
  6. Mejorar las pruebas de integración: Cuando su código tiene dependencias externas (especialmente de terceros), adopte una estrategia de prueba defensiva. Fuerce fallas para asegurar que su código las maneje adecuadamente y se recupere eficazmente. 
    Consejo: Utilice marcos de prueba de integración como Postman para pruebas de API o Test Containers para ejecutar pruebas con dependencias reales en entornos aislados.
  7. Nunca falle silenciosamente: Asegúrese de que todas las declaraciones condicionales (por ejemplo, if, else) y el manejo de excepciones (por ejemplo, try/catch) contengan código, incluso si es solo para registrar. Las fallas silenciosas pueden ocultar problemas críticos. 
    Consejo: Implemente estrategias de manejo de errores integrales y siempre registre condiciones inesperadas.
  8. Validar y sanitizar entradas: Si su código carga archivos o recibe entradas de usuario, mejore la validación y sanitización de las entradas. Siempre que sea posible, maneje estas acciones en procesos o hilos separados para evitar que las excepciones bloqueen el proceso principal. 
    Consejo: Utilice bibliotecas como OWASP ESAPI para Java o incluso Expresiones Regulares para la validación de entradas.
  9. Siga el principio de menor privilegio: Ejecute su código con solo los privilegios necesarios. Identifique y pruebe los permisos requeridos en lugar de ejecutar todo como "root" o "administrador". 
    Consejo: Utilice control de acceso basado en roles (RBAC) y el principio de menor privilegio (PoLP) para minimizar los riesgos de seguridad.
  10. Aproveche el software de prueba en CI: Integre pruebas automatizadas y verificaciones de calidad que tengan sentido en su pipeline de CI/CD. Revise y actualice regularmente su configuración de pruebas para incluir software de prueba nuevo o actualizado. 
    Consejo: Herramientas como Jenkins, GitHub Actions o GitLab CI/CD pueden automatizar eficazmente sus procesos de prueba y despliegue.
  11. Considere estrategias de lanzamiento alternativas: Técnicas como pruebas AB, lanzamientos dirigidos, lanzamientos escalonados o el uso de banderas de características son generalmente menos riesgosas que los lanzamientos completos. Asegúrese de tener monitoreo de la salud del sistema, especialmente para despliegues altamente críticos. 
    Consejo: Utilice herramientas de banderas de características como LaunchDarkly o Unleash para controlar los lanzamientos de características y mitigar riesgos.
  12. Considere cuidadosamente las fechas y horas de lanzamiento: Para sistemas críticos, evite lanzar actualizaciones los viernes por la noche o antes de feriados importantes. Incluso con pruebas exhaustivas y despliegues previos exitosos, planifique con anticipación para pruebas exhaustivas. 
    Consejo: Programe lanzamientos durante períodos de baja actividad y asegure la disponibilidad del personal de soporte para manejar posibles problemas.

Conclusión

Cuando se trata de desarrollo de software, pueden ocurrir errores humanos en cada paso del camino. Revisar y mejorar constantemente sus prácticas de desarrollo de software puede tener un impacto significativo en la mitigación de tales errores.

En Softtek, hemos desarrollado un enfoque totalmente personalizable de gestión de calidad de software que se adapta a su contexto organizacional, necesidades de producto, stack tecnológico y dinámica de equipo. Esto le ayuda a adoptar las mejores prácticas de la industria, adherirse a las regulaciones y mantener procesos de prueba lean, observables y trazables. Visite nuestra página de Ingeniería de Calidad para explorar nuestros servicios y conectar con nuestros expertos.