Secretos y seguridad

CiberseguridadBeginner
Practicar Ahora

Introducción

En el laboratorio anterior, nuestro asistente robótico inició sesión automáticamente en un almacén. Pero ¿de dónde obtuvo la contraseña?

En la automatización real, los workflows suelen necesitar datos confidenciales, como claves de API, contraseñas o tokens. Nunca debe escribir estos valores directamente en los archivos del repositorio.

GitHub proporciona Secrets como mecanismo de almacenamiento protegido para los valores confidenciales que utilizan los workflows. Esta es una práctica fundamental de seguridad en CI/CD, porque las canalizaciones suelen necesitar acceso privilegiado.

Este es uno de los límites más importantes de la seguridad de la automatización. Las canalizaciones necesitan credenciales, pero estas deben inyectarse durante la ejecución desde un almacenamiento protegido, en lugar de confirmarse en el control de versiones.

En este laboratorio, usted:

  • Creará una contraseña secreta en el almacén seguro.
  • Enseñará al robot a recuperarla.
  • Comprobará que, aunque el robot intente imprimir la contraseña, GitHub la censurará.

Requisitos previos

Continuaremos utilizando el repositorio github-actions-basics.

Crear un secreto

Imagine que nuestra aplicación necesita conectarse a una base de datos. Debemos almacenar la contraseña de la base de datos de forma segura.

Crearemos un secreto llamado DB_PASSWORD.

  1. Abra el repositorio github-actions-basics en GitHub.
  2. Haga clic en la pestaña Settings.
  3. En la barra lateral izquierda, busque el elemento de menú Secrets and variables y haga clic en él para expandirlo.
  4. Seleccione Actions.
  5. Haga clic en el botón verde New repository secret.

New repository secret

Verá un formulario sencillo:

  • Name: Introduzca DB_PASSWORD. (Es una práctica habitual utilizar MAYÚSCULAS para los nombres de los secretos).
  • Secret: Introduzca SuperSafePassword123!.

Haga clic en Add secret.

Ahora debería ver DB_PASSWORD en la lista. Observe que ya no puede ver su valor. Una vez guardado un secreto, queda protegido de forma permanente. Puede actualizarlo o eliminarlo, pero ni usted ni nadie más podrá volver a visualizarlo.

Usar el secreto

Ahora que la contraseña está guardada de forma segura, escribiremos un workflow para utilizarla.

El patrón importante aquí es la indirección: el workflow hace referencia a un secreto por su nombre y GitHub resuelve el valor de forma segura durante la ejecución.

En el archivo del workflow, puede acceder a cualquier secreto mediante la sintaxis ${{ secrets.YOUR_SECRET_NAME }}.

Vaya al directorio del proyecto.

cd ~/project
git clone https://github.com/your-username/github-actions-basics.git
cd github-actions-basics

Nota: Sustituya your-username por su nombre de usuario real de GitHub.

Cree un archivo de workflow llamado security-test.yml dentro de la carpeta .github/workflows.

touch .github/workflows/security-test.yml

Ábralo con nano.

nano .github/workflows/security-test.yml

Añada el siguiente contenido:

name: Security Test

on: [push]

jobs:
  test-secret:
    runs-on: ubuntu-latest
    steps:
      - name: Try to print secret
        env:
          MY_PASSWORD: ${{ secrets.DB_PASSWORD }}
        run: echo "The password is $MY_PASSWORD"

Aquí ocurre algo interesante. Movemos el secreto del almacén seguro de GitHub a una Environment Variable llamada MY_PASSWORD. Después, intentamos imprimirlo mediante echo.

¡Espere! ¿Acaso imprimir una contraseña en el registro no es una idea terrible? ¡Sí, lo es! Pero lo hacemos para demostrar una potente función de seguridad de GitHub Actions.

Guarde los cambios y salga de nano.

Verificar el enmascaramiento

Ejecutemos este workflow y veamos qué ocurre cuando intentamos filtrar un secreto.

Confirme y suba los cambios.

git add .
git commit -m "Test secret masking"
git push

Vaya a Actions en su repositorio de GitHub.

  1. Haga clic en la ejecución del workflow "Security Test".
  2. Haga clic en el job test-secret.
  3. Expanda el paso "Try to print secret".

Observe el resultado. Debería ver algo parecido a esto:

The password is ***

Secret masked

GitHub Actions reconoció automáticamente que el valor de $MY_PASSWORD procedía de un secreto. Antes de imprimir cualquier contenido en el registro, busca ese valor confidencial y lo sustituye por ***.

El enmascaramiento reduce el daño causado por la divulgación accidental en los registros, pero sigue siendo una buena práctica no imprimir secretos nunca. Las funciones de seguridad son una red de protección, no una excusa para gestionar los secretos sin cuidado.

Esta función de Masking le protege. Aunque intente imprimir un secreto por accidente o una herramienta que utilice sea demasiado detallada, GitHub lo detecta y elimina los datos confidenciales de los registros.

Nota sobre GITHUB_TOKEN: ¿Recuerda ${{ secrets.GITHUB_TOKEN }}, que utilizamos en el laboratorio anterior? Funciona exactamente de la misma manera. Es un secreto que GitHub crea automáticamente para cada ejecución, y su valor también se enmascara en los registros.

Resumen

En este laboratorio, ha aprendido los conceptos esenciales de la seguridad en la automatización.

  • Almacén seguro: Utilizó GitHub Secrets para almacenar datos confidenciales, como contraseñas.
  • Acceso: Utilizó ${{ secrets.NAME }} para proporcionar a su robot acceso mediante una tarjeta a esos datos.
  • Enmascaramiento: Comprobó que GitHub redacta automáticamente los secretos en los registros (***) para evitar filtraciones accidentales.

Ahora dispone de una canalización automatizada y segura. En el laboratorio final abordaremos el objetivo principal de DevOps: la Implementación continua. Aprenderemos a hacer que su robot implemente el código en un servidor activo.