Asegurando su servidor Jenkins: Prácticas recomendadas esenciales
Refuerza Jenkins con acceso de mínimo privilegio, HTTPS, higiene de plugins, pipelines seguros, controles de credenciales y monitoreo.
Asegurando tu Servidor Jenkins: Prácticas Esenciales Recomendadas
Asegurar tu servidor Jenkins es importante porque puede acceder a tu código fuente, destinos de despliegue, credenciales y artefactos de compilación. Si Jenkins está expuesto o configurado de manera flexible, un atacante podría leer repositorios, alterar compilaciones, robar secretos o usar agentes de compilación como una ruta hacia tu red.
Las configuraciones más seguras de Jenkins utilizan capas: identidad sólida, permisos de mínimo privilegio, acceso cifrado, gestión cuidadosa de plugins, patrones de pipeline seguros y registros de auditoría útiles. Comienza con los controles a continuación antes de exponer Jenkins a un equipo más amplio o conectarlo a sistemas de producción.
Gestión de Usuarios y Control de Acceso
Una gestión robusta de usuarios es la primera línea de defensa. Jenkins permite un control detallado sobre lo que los usuarios pueden ver y hacer. Implementar el principio de mínimo privilegio asegura que los usuarios y servicios solo tengan los permisos necesarios para realizar sus tareas, minimizando el daño potencial de cuentas comprometidas.
Autenticación
Jenkins puede integrarse con varios sistemas de autenticación. Para entornos de equipo, utiliza autenticación centralizada en lugar de depender solo de la base de datos interna de usuarios de Jenkins.
- Integración LDAP o Active Directory: Utiliza tus grupos de directorio existentes y controles de ciclo de vida de cuentas.
- SAML u OpenID Connect: Usa inicio de sesión único a través de tu proveedor de identidad cuando tu conjunto de plugins de Jenkins lo soporte.
- Cuentas locales: Mantén una cuenta de administrador de emergencia cuidadosamente protegida, pero no hagas de las cuentas locales compartidas tu modelo de acceso normal.
Estrategias de Autorización
Una vez que los usuarios están autenticados, la autorización determina sus niveles de acceso.
- Seguridad Basada en Matrices: Esta estrategia incorporada te permite asignar permisos a usuarios o grupos. Funciona bien para configuraciones pequeñas, pero puede volverse difícil de auditar a medida que los equipos crecen.
- Estrategia Basada en Roles: El plugin de Estrategia de Autorización Basada en Roles te permite definir roles como
Desarrollador,OperadoryAdmin, luego mapear usuarios o grupos a esos roles.
Ejemplo: Configuración de Autorización Basada en Roles
- Instala el plugin Estrategia de Autorización Basada en Roles desde el administrador de plugins de Jenkins.
- Ve a
Administrar Jenkins>Seguridad. - Bajo
Autorización, seleccionaEstrategia Basada en Roles. - Define roles como
desarrollador,gestor-de-lanzamientosyjenkins-admin. - Asigna a cada rol solo los permisos que necesita, como
Trabajo/Leer,Trabajo/ConstruiroCredenciales/Ver. - Asigna grupos de directorio a roles en lugar de personas individuales cuando sea posible.
Asegurando la Comunicación de Jenkins
Asegurar que los datos transmitidos hacia y desde tu servidor Jenkins estén cifrados es crucial, especialmente al manejar credenciales e información sensible de compilación.
Configuración HTTPS
Configura Jenkins para usar HTTPS y cifrar toda la comunicación entre los clientes y el servidor. Esto evita la interceptación y los ataques de intermediario.
El patrón de producción más común es poner Jenkins detrás de un proxy inverso como Nginx, Apache, HAProxy o un balanceador de carga en la nube. Termina TLS en el proxy, redirige HTTP a HTTPS y configura la URL pública de Jenkins en Administrar Jenkins > Sistema.
Si ejecutas el servidor web incorporado de Jenkins directamente con HTTPS, configúralo a través de opciones de inicio de Jenkins como --httpsPort, --httpsKeyStore y --httpsKeyStorePassword, o a través de la configuración de servicio específica del paquete. El archivo exacto difiere según el método de instalación, así que verifica cómo se inicia tu servicio de Jenkins antes de cambiarlo.
También asegúrate de que el proxy inverso envíe los encabezados reenviados correctos. Los encabezados de proxy rotos pueden causar URL de redirección incorrectas, verificaciones CSRF fallidas o enlaces que apuntan de vuelta a HTTP simple.
Seguridad de Jenkins y Plugins
La extensibilidad de Jenkins a través de plugins es una de sus mayores fortalezas, pero también introduce riesgos potenciales de seguridad si no se gestiona cuidadosamente.
Mantén Jenkins y los Plugins Actualizados
Las versiones desactualizadas del núcleo de Jenkins y sus plugins son una fuente común de vulnerabilidades. Actualiza regularmente ambos para parchear fallos de seguridad conocidos.
- Actualizaciones del núcleo de Jenkins: Sigue los avisos de seguridad de Jenkins y planifica ventanas de mantenimiento regulares.
- Actualizaciones de plugins: Revisa las notificaciones de actualización con frecuencia. Prueba las actualizaciones críticas de plugins en un controlador que no sea de producción cuando puedas.
Lista Blanca y Auditoría de Plugins
No todos los plugins son iguales. Algunos plugins pueden tener vulnerabilidades de seguridad o no estar mantenidos.
- Usa plugins de confianza: Prefiere plugins mantenidos del centro de actualizaciones de Jenkins.
- Limita la instalación de plugins: Cada plugin añade código que se ejecuta dentro de tu controlador.
- Elimina plugins no utilizados: Audita los plugins trimestralmente o después de cambios importantes en los procesos.
Gestión de Advertencias de Seguridad de Plugins
Jenkins puede advertirte sobre plugins instalados con avisos de seguridad conocidos. Presta mucha atención a las advertencias en Administrar Jenkins y actualiza, reemplaza o elimina los plugins afectados.
Seguridad de Jenkinsfile
Los Jenkinsfiles definen tus pipelines de compilación. Asegurarlos es crítico para prevenir la inyección de código malicioso en tu proceso de compilación.
- Almacena Jenkinsfiles en control de versiones: Revisa los cambios en los pipelines de la misma manera que revisas el código de la aplicación.
- Trata el código del pipeline como código ejecutable: Un Jenkinsfile puede ejecutar comandos de shell, publicar artefactos y solicitar credenciales.
- Ten cuidado con la aprobación de scripts: El plugin de Seguridad de Scripts puede requerir que los administradores aprueben ciertos métodos o scripts de Groovy. Aprueba solo código que entiendas.
- Evita scripts de pipeline en línea en la interfaz de usuario: Prefiere
Jenkinsfiles respaldados por repositorio con revisión de código.
Ejemplo: Aprobación de Scripts
Cuando un pipeline encuentra una firma de Groovy no aprobada, Jenkins la lista en Administrar Jenkins > Aprobación de Scripts en Proceso. Revisa la firma solicitada y el trabajo que la desencadenó antes de aprobar. Una aprobación amplia puede afectar a más de un trabajo.
Gestión de Credenciales de Jenkins
Jenkins a menudo necesita almacenar credenciales sensibles como claves de API, contraseñas y claves SSH para acceder a otros servicios. Gestionarlas de forma segura es crucial.
- Usa el almacenamiento de credenciales de Jenkins: Almacena tokens de API, contraseñas, certificados y claves SSH como credenciales, no como texto plano en las definiciones de trabajos.
- Evita secretos codificados: No pongas secretos en
Jenkinsfiles, scripts de shell, registros de compilación o variables de repositorio. - Limita el alcance de las credenciales: Usa carpetas y permisos para mantener las credenciales de producción alejadas de trabajos que no las necesiten.
- Rota las credenciales: Rota las claves de despliegue y los tokens de servicio cuando las personas se vayan, los trabajos se eliminen o un secreto pueda haber aparecido en los registros.
Ejemplo: Uso de Credenciales en un Pipeline
pipeline {
agent any
stages {
stage('Desplegar') {
steps {
withCredentials([sshUserPrivateKey(credentialsId: 'prod-deploy-key', keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
sh 'ssh -i "$SSH_KEY" -o IdentitiesOnly=yes "[email protected]" "comando_de_despliegue"'
}
}
}
}
}
En este ejemplo, prod-deploy-key es el ID de una credencial de clave privada SSH almacenada. Jenkins escribe la clave en un archivo temporal durante la duración del paso y enmascara los valores de secretos compatibles en los registros.
Seguridad de Red y Control de Acceso
Más allá de la seguridad interna de Jenkins, proteger el servidor a nivel de red es esencial.
- Reglas de firewall: Restringe el acceso a Jenkins a redes de confianza, rangos de VPN o puntos de entrada de proxy conscientes de la identidad.
- Controles de proxy inverso: Usa un proxy inverso para TLS, redirecciones HTTP a HTTPS, límites de solicitudes y encabezados consistentes.
- Aislamiento de agentes: No ejecutes compilaciones no confiables en el controlador. Usa agentes desechables o estrictamente controlados para cargas de trabajo riesgosas.
- Segmentación de red: Mantén a Jenkins alejado del acceso amplio a la red interna a menos que un trabajo realmente lo necesite.
Auditoría y Monitoreo
Revisar regularmente los registros de Jenkins y monitorear la actividad puede ayudar a detectar y responder a incidentes de seguridad.
- Habilita el registro de auditoría: Registra inicios de sesión, cambios de permisos, cambios de credenciales, ediciones de trabajos y acciones administrativas. Plugins como Audit Trail pueden ayudar.
- Monitorea los registros de Jenkins: Revisa los registros del controlador y los registros de compilación en busca de uso inesperado de credenciales, nuevas cuentas de administrador, ediciones inusuales de trabajos o inicios de sesión fallidos repetidos.
- Respaldar la configuración: Respaldar el directorio de inicio de Jenkins, la configuración de trabajos, las listas de plugins y los metadatos de credenciales según tu plan de recuperación. Protege los respaldos como secretos de producción.
Mantén a Jenkins Aburrido
El objetivo es un servidor Jenkins donde el acceso sea predecible, los cambios sean revisados, los plugins sean conocidos y las credenciales no se filtren en trabajos o registros. Comienza con SSO, roles de mínimo privilegio, HTTPS, actualizaciones de plugins y uso seguro de credenciales. Luego programa revisiones regulares para que la excepción temporal de ayer no se convierta en el incidente de mañana.