Compartir vía


Protección de secretos en Azure Pipelines

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

En este artículo se proporcionan procedimientos recomendados para proteger secretos en Azure Pipelines. Un secreto es todo aquello cuyo acceso desea controlar de forma estricta, como las claves API, las contraseñas, los certificados o las claves criptográficas.

Azure Pipelines no genera valores secretos. Sin embargo, es posible que tenga que agregar un secreto a una canalización para almacenar datos confidenciales como una clave de API. Para más información sobre cómo establecer variables secretas, consulte Establecimiento de variables secretas.

No use secretos si hay otro método disponible

El mejor método para proteger un secreto no es tener un secreto en primer lugar. Compruebe si la canalización puede usar un método diferente al de usar un secreto para realizar una tarea.

  • Usar conexiones de servicio:
    • Cuando tenga como destino Azure u otros servicios, use conexiones de servicio en lugar de administrar secretos en variables.
    • Las conexiones de servicio permiten conectarse de forma segura a servicios externos sin exponer información confidencial directamente en la configuración de la canalización.
    • Para más información, consulte Administración de conexiones de servicio y Conexión a Microsoft Azure con una conexión de servicio de Azure Resource Manager.

Para obtener más información, consulte Uso de entidades de servicio e identidades administradas.

Uso de variables secretas

Nunca almacene valores confidenciales como texto no cifrado en un archivo .yml de Azure Pipelines.

Las variables secretas se pueden usar para información privada, como contraseñas, identificadores y otros datos de identificación que no desea exponer en una canalización. Se recomienda establecer variables secretas con Azure Key Vault. También puede establecer variables secretas en la interfaz de usuario o en un grupo de variables. No se recomienda usar un comando de registro para establecer una variable secreta. Al establecer un secreto con un comando de registro, cualquier persona que pueda acceder a la canalización también puede ver el secreto.

Las variables secretas son variables cifradas que se pueden usar en canalizaciones sin exponer su valor. Aunque sus valores no se exponen, nunca vuelva a generar secretos como salida y no pase secretos en la línea de comandos. En su lugar, se recomienda asignar los secretos a variables de entorno.

Al crear un secreto, siga las instrucciones de nomenclatura de variables y asegúrese de que el nombre del secreto no divulga información confidencial.

Limitación del acceso a variables secretas

Para limitar el acceso a secretos en Azure DevOps, siga estos procedimientos recomendados:

  • Almacene los secretos en Azure Key Vault. Con Azure Key Vault, puede usar el modelo de control de acceso basado en rol de Azure para limitar el acceso a un secreto o grupo de secretos.
  • Establezca variables secretas en la interfaz de usuario de una canalización. Las variables de secreto establecidas en la interfaz de usuario de configuración de una canalización se limitan a la canalización donde se establecen. De esta manera, puede tener secretos que solo sean visibles para los usuarios con acceso a esa canalización.
  • Establezca secretos en un grupo de variables. Los grupos de variables siguen el modelo de seguridad de la biblioteca. Puede controlar quién puede definir nuevos elementos en una biblioteca y quién puede usar un elemento existente.

No escriba secretos en los registros

Azure Pipelines intenta limpiar los secretos de los registros siempre que sea posible, pero no es infalible. Evite reproducir secretos en la consola, usarlos en parámetros de la línea de comandos o registrarlos en archivos. Tenga cuidado al usar comandos de la CLI de Azure que generan información confidencial. None output formatUse y, si necesita recuperar un secreto de una llamada de la CLI de Azure, Use none output format and retrieve security information to a secret variable.

No usar datos estructurados como secretos

Evite usar formatos de datos estructurados como JSON, XML o YAML para encapsular valores secretos, incluidos caracteres de control como retorno de carro, \ry avance de líneas.\n En vez de esto, crea secretos individuales para cada valor sensible. Este enfoque garantiza una mejor precisión de la redacción y minimiza el riesgo de exponer datos confidenciales involuntariamente.

Auditar cómo se controlan los secretos

Para auditar cómo se usan los secretos en Azure Pipelines, siga estos procedimientos recomendados:

  • Revisión del código fuente: examine el código fuente del repositorio que hospeda la canalización. Para asegurarse de que los secretos se controlan correctamente, compruebe las tareas usadas en la canalización. Por ejemplo, compruebe que los secretos no se envían accidentalmente a hosts no deseados o se imprimen explícitamente para registrar la salida.
  • Inspeccionar los registros de ejecución: Después de probar entradas válidas e no válidas, vea los registros de ejecución de la canalización. Asegúrese de que los secretos se redactan correctamente y no se exponen. A veces, los errores en comandos o herramientas podrían filtrar accidentalmente secretos en registros de errores. Aunque Azure Pipelines intenta limpiar los secretos de los registros, la revisión manual sigue siendo esencial.

Auditoría y rotación de secretos

Para auditar y rotar secretos, siga estos procedimientos recomendados:

  • Revisión de los secretos registrados: evalúe periódicamente los secretos registrados en las canalizaciones. Confirme que siguen siendo necesarios y quite los que ya no sean necesarios, lo que ayuda a reducir el desorden y los posibles riesgos de seguridad.
  • Rotación de secretos: rota periódicamente los secretos para minimizar la ventana de tiempo durante la que se podría aprovechar un secreto en peligro. Al cambiar los secretos periódicamente, se mejora la seguridad.
  • Elección del método de autenticación adecuado
    • Tipos de secretos usados:
      • Tokens de acceso personal (PAT): estos tokens se usan para la autenticación. Siga los procedimientos recomendados de seguridad al elegir el método de autenticación correcto. Puede administrar LOS PAT mediante la API REST.
      • Variables secretas: use variables secretas para almacenar de forma segura información confidencial, como claves de API, contraseñas u otras credenciales dentro de la canalización.
      • Secretos de Azure Key Vault: use Azure Key Vault para almacenar y administrar secretos de forma segura.
      • Conexiones de servicio: estas conexiones de servicio permiten que la canalización se conecte a servicios externos (por ejemplo, Azure, GitHub, Docker Hub). Asegúrese de la configuración adecuada y el control seguro de los secretos de conexión de servicio.

Uso de plantillas YAML

En lugar de incluir scripts insertados con parámetros secretos directamente en la canalización YAML, use plantillas. Este enfoque mejora la seguridad mediante la abstracción de información confidencial fuera de la canalización principal.

Para implementar este enfoque, cree un archivo YAML independiente para el script y, a continuación, almacene ese script en un repositorio seguro independiente. A continuación, puede hacer referencia a la plantilla y pasar una variable secreta en yaML como parámetro. La variable segura debe proceder de Azure Key Vault, un grupo de variables o la interfaz de usuario de canalización. Para obtener más información sobre el uso de plantillas, consulte la referencia de uso de plantillas.

Limitar secretos con directivas de rama y permisos de grupo de variables

Para asegurarse de que los secretos están vinculados a la main rama y no son accesibles para las ramas aleatorias, puede usar una combinación de permisos de grupo de variables, inserción de trabajos condicionales y directivas de rama.

Con las directivas de rama, puede aplicar directivas de validación de compilación que solo permitan compilaciones desde la rama principal. A continuación, puede usar permisos de grupo de variables para asegurarse de que solo las canalizaciones autorizadas tengan acceso a los secretos almacenados en el grupo de variables. Por último, puede usar una condición en la canalización para asegurarse de que solo se puede hacer referencia al grupo de variables mediante una inserción en la main rama.

jobs:
- job: ExampleJob
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: echo "This runs only for the main branch"
    displayName: 'Conditional Step'
  variables:
  - group: your-variable-group-name

Pasos siguientes