Protección de la canalización y el flujo de trabajo de CI/CD
En este artículo se describe cómo proteger las canalizaciones y el flujo de trabajo de CI/CD.
La automatización y la metodología ágil permiten a los equipos ofrecer resultados más rápidos, pero también agregan complejidad a la seguridad, ya que el flujo de trabajo se extiende a los propios equipos de desarrolladores.
En el siguiente diagrama se ilustra un entorno de CI/CD de referencia. El icono de configuración rojo indica los permisos de seguridad que debe configurar el cliente. Esto sigue el modelo de responsabilidad compartida, donde Azure y otros proveedores proporcionan permisos que el cliente debe configurar según su modelo de gobernanza y requisitos empresariales.
Examinemos cada fase de este flujo de trabajo típico para comprender mejor cómo suelen depender las configuraciones unas de otras. El flujo de trabajo puede tener más fases. Los siguientes conceptos le ayudarán a comprender la integración continua y entrega continua y le ayudarán a diseñar el flujo de trabajo para la seguridad.
Fase 1: Flujo de trabajo de Git
Los cambios de código, no solo en el software, sino también en la canalización como código y la infraestructura como código,se guardan y se administran en Git. Git es un software de administración de código fuente distribuido. Cuando se inserta código de máquinas locales en el servidor Git centralizado, se pueden aplicar reglas de negocio antes de aceptarlo.
Solicitudes de incorporación de cambios y colaboración
El flujo de trabajo estándar del sector, independientemente del proveedor de software como servicio (SaaS) de administración de configuración de software (SCM), es usar solicitudes de incorporación de cambios que pueden actuar a la vez como equipo selector de calidad automatizado y como paso de aprobación manual antes de que se acepte el código fuente.
El flujo de trabajo de solicitud de incorporación de cambios está diseñado para introducir una fricción en buen estado, por lo que solo se debe aplicar para proteger ramas de Git específicas. Especialmente, las ramas que desencadenarán flujos de trabajo automatizados de implementación o configuración de recursos o que los afecten de alguna otra manera. Estas ramas se denominan ramas protegidas y normalmente siguen convenciones de nomenclatura como production
o releases/*
.
Es habitual que las solicitudes de incorporación de cambios requieran:
- Revisiones por homólogos
- Pasada de las compilaciones de integración continua (CI)
- Aprobación manual
Si se cumplen los requisitos, se aceptan los cambios en el código y se pueden combinar.
Restricción del acceso a ramas protegidas
El flujo de trabajo de solicitud de incorporación de cambios se usa junto con controles de acceso restringido. Sin embargo, no se puede aplicar el flujo de trabajo de la solicitud de incorporación de cambios a menos que el servidor esté configurado para rechazar los cambios directos en las ramas protegidas.
Un desarrollador no puede insertar directamente en la rama production
, sino que debe crear una solicitud de incorporación de cambios que se dirija a la rama protegida. Cada proveedor de SCM tiene un acceso restringido a las ramas protegidas de distinto tipo. Por ejemplo, con GitHub esta característica solo está disponible para las organizaciones que usan el equipo de GitHub o la nube de GitHub Enterprise.
Documentación del modelo de acceso de Git
Dado que el modelo de colaboración es complejo y tiene muchas partes móviles, resulta útil crear una tabla que documente todas las formas posibles en que los cambios de código pueden desencadenar implementaciones, por ejemplo:
Nombre de la rama | ¿Requiere solicitud de incorporación de cambios? | ¿Realiza implementaciones? | Acceso de desarrollador | Acceso de administrador |
---|---|---|---|---|
feat/* |
No | No | Lectura/escritura | Lectura/escritura |
main |
Sí | Ensayo | Lectura | Lectura/escritura |
production |
Sí, solo desde main . |
Producción | Lectura | Lectura/escritura |
Este ejemplo de tabla de acceso de Git está simplificado en exceso para ilustrar su propósito. En la práctica suele haber más actores, más destinos de implementación y varias canalizaciones que se ejecutan para distintos casos de uso. La estructura de la tabla puede diferir en función de los requisitos de la organización y las cargas de trabajo.
La tabla debe ayudarle a responder preguntas como:
- Si un desarrollador inserta cambios de código en la rama X, ¿se implementará? Si es así, ¿en qué entorno?
- ¿En qué momento del ciclo de vida del código de la aplicación se realiza un examen de vulnerabilidad?
- Si se encuentra una vulnerabilidad de seguridad, ¿cuántas inserciones y aprobaciones de código son necesarias antes de que entre en producción?
Esta tabla no solo es útil para la depuración y la documentación estática, sino también para la colaboración en equipo. Es transparente para los desarrolladores en los que se ha introducido una fricción en buen estado en el flujo de trabajo para priorizar la calidad y la seguridad del código. Lo que es más importante, muestra al desarrollador la ruta de acceso esperada para que los cambios de código lleguen a producción.
Dado que DevOps es un recorrido, el modelo de acceso de Git no es estático. Cambiará y evolucionará a medida que los equipos encuentren sus propios ritmos y maduren. Por eso es importante almacenar esta documentación lo más cerca posible del código, por ejemplo, en los repositorios de Git.
Para más información sobre las solicitudes de incorporación de cambios y las ramas protegidas, consulte:
- Establecer permisos de rama
- Creación, visualización y administración de solicitudes de incorporación de cambios
- Mejora de la calidad del código con directivas de ramas
- Acerca de las solicitudes de incorporación de cambios
- Acerca de las ramas protegidas
Fase 2: Canalizaciones como código
El movimiento de canalización como código acelera la adopción de la automatización y las implementaciones mediante el traslado de las definiciones y las configuraciones de canalización del proveedor de CI a los desarrolladores, lo que acerca la lógica de compilación e implementación a la lógica de aplicación correspondiente. La mayor flexibilidad aquí también supone mayor responsabilidad.
Los controles de RBAC de una canalización controlada por la interfaz de usuario pueden impedir que usuarios individuales realicen cambios destructivos. Las canalizaciones como código, sin embargo, a menudo se ejecutan con identidades con privilegios y pueden destruir las cargas de trabajo si se les indica que lo hagan.
Fase 3: Protección de las credenciales de implementación
Las canalizaciones y los repositorios de código no deben incluir credenciales ni secretos con código muy protegido. Las credenciales y los secretos deben almacenarse en otro lugar y usar las características del proveedor de CI para la seguridad. Dado que las canalizaciones se ejecutan como agentes desatendidos, nunca deben usar la contraseña de un usuario. Las canalizaciones deben ejecutarse con entidades de seguridad desatendidas en su lugar, como entidades de servicio o identidades administradas. El acceso a las credenciales de esta entidad de seguridad, las cadenas de conexión de base de datos y las claves de API de terceros también se deben administrar de forma segura en la plataforma de CI.
Cómo se protegen las credenciales, las puertas y las aprobaciones son características específicas del proveedor. Al elegir una plataforma de CI, asegúrese de que admite todas las características que necesita.
Azure Pipelines es una solución de integración continua a escala empresarial donde las credenciales se almacenan como conexiones de servicio en las que puede configurar aprobaciones y comprobaciones. Esta configuración incluye la aprobación manual y autorizaciones específicas de rama o canalización.
Azure Key Vault
Si la plataforma de CI lo admite, considere la posibilidad de almacenar las credenciales en un almacén de secretos dedicado, por ejemplo, Azure Key Vault. El agente de compilación captura las credenciales en tiempo de ejecución y la superficie de ataque se reduce.
Fase 4: Protección de los recursos de Azure
Los recursos de Azure deben protegerse según el principio de privilegios mínimos, aplicado tanto a los permisos como al ámbito.
Para más información, consulte:
Creación de roles personalizados para los agentes de compilación
La automatización de CI/CD no solo concierne a las aplicaciones, sino también a la infraestructura. Las plantillas de infraestructura como código (IaC) garantizan la coherencia entre implementaciones y ayudan a escalar los equipos centralizados de la plataforma en la nube.
Es importante comprender que la automatización de IaC puede salir mal. Puede configurarse erróneamente y, en el peor de los casos, eliminar la infraestructura de forma permanente. Al planear el recorrido en la nube, identifique de antemano qué operaciones son críticas para la empresa y requieren intervención humana.
Por ejemplo, los bloqueos de administración CanNotDelete se pueden aplicar a recursos críticos para la empresa, como los datos. Para evitar que esto suceda, puede quitar los permisos Microsoft.Authorization/*/Delete
de una entidad de servicio que se usa en la automatización de CI. En este ejemplo y en el caso de uso la entidad de servicio puede crear el bloqueo de administración, pero no eliminarlo.
Se recomienda crear un rol personalizado para los agentes de CI. Recuerde que los agentes de compilación se ejecutan desatendidos, los cuales no tienen cerebro. Elija los permisos con atención.
Para obtener más información, consulte:
Recursos
- Automatización de la plataforma y DevOps
- Tutorial de seguridad de Pipelines
- Seguridad a través de plantillas
- DevSecOps en GitHub
Pasos siguientes
Ahora que sabe cómo proteger DevOps, obtenga más información sobre la gobernanza integral de DevOps a Azure.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de