¿Qué es un secreto?
En el desarrollo de software, un secreto es una parte de información confidencial que se usa para autenticar o autorizar el acceso a sistemas, servicios, datos y API. Algunos ejemplos son:
- Claves de API y tokens de acceso que permiten interactuar con servicios externos, como API de REST de GitHub. Los tokens de acceso también permiten que los servicios, como GitHub Actions, realicen tareas que necesitan autenticación, ya que experimentaremos con más adelante.
- Credenciales de base de datos que conceden acceso a bases de datos y almacenamiento locales y externas.
- Claves privadas, como SSH privada y claves PGP, que se pueden usar para acceder a otros servidores y cifrar datos.
Dado que los secretos proporcionan tanto acceso, incluido a los sistemas críticos, podemos comprender por qué es tan importante mantener protegidos los secretos.
¿Qué puede ocurrir cuando se expone un secreto?
- Los atacantes pueden obtener acceso no autorizado a todo lo que el secreto permite acceder.
- Los hackers pueden robar datos, incluidos los datos confidenciales del usuario. Esto puede tener ramificaciones legales y de privacidad y dañar la confianza en ti y tu aplicación.
- Los secretos expuestos pueden costar dinero si los hackers ejecutan cargas de trabajo no autorizadas en tus cuentas de proveedor de nube.
- Los hackers pueden usar un secreto expuesto para eliminar, modificar e interrumpir servidores que pueden provocar tiempo de inactividad y pérdida de datos.
Piensa en todos los accesos y habilidades que te concede un secreto y lo que un hacker podría hacer con ellos. Por ejemplo, si un personal access token de tu cuenta GitHub estuviera expuesto, un hacker podría publicar y hacer cambios en GitHub como tú.
Procedimientos recomendados para administrar los secretos
Para evitar este tipo de problemas, sigue los procedimientos recomendados para evitar filtraciones y limitar los daños si alguna vez se expone un secreto.
Sigue el principio de usar privilegios mínimos (PoLP)
Siempre que sea posible, restringe lo que un secreto puede hacer y que solo pueda acceder a lo necesario. Por ejemplo:
- Si un secreto solo se usará para leer datos y no realizar cambios en los datos, opta por hacerlo de solo lectura.
- Si la API que usas te permite limitar un secreto solo a determinados ámbitos o permisos, selecciona solo los que necesites. Por ejemplo, si solo necesitas crear problemas con un secreto de GitHub, no hay ninguna razón para que el secreto tenga acceso al contenido del repositorio ni a nada más.
- Si un secreto proporcionará a un atacante acceso completo a la cuenta de usuario que lo posee, considera la posibilidad de crear cuentas de servicio que puedan tomar posesión del secreto.
Protección de secretos en la aplicación
- Nunca codifiques un secreto. Usa siempre variables de entorno o las herramientas de administración de secretos de la plataforma (como secretos de repositorio de GitHub).
- Si tienes que compartir un secreto con alguien, usa una herramienta dedicada como un administrador de contraseñas. Nunca envíes secretos por correo electrónico o mensajería instantánea.
- Si es posible, establece fechas de expiración y rota periódicamente los secretos; esto reduce el riesgo de que se aprovechen los secretos antiguos.
- Si la aplicación genera un registro, asegúrate de que los secretos se censuran antes de registrarse. De lo contrario, los secretos activos se podrían guardar en archivos de texto no cifrado.
Limitación de daños si se expone un secreto
- Considera que el secreto está en peligro, incluso si solo se expone durante un segundo y revoca el secreto inmediatamente. A continuación, genera un nuevo secreto y guárdalo de forma segura.
- Comprueba los registros de actividad que puedan mostrar cualquier actividad sospechosa realizada con el secreto en peligro.
- Considera cómo se ha expuesto el secreto y realiza cambios en los procesos para que esto no pueda volver a ocurrir.
Cómo GitHub ayuda a proteger los secretos
Puedes hacer muchas cosas para mantener los secretos seguros, pero también GitHub puede hacer mucho para ayudar a que tus secretos sigan siéndolo. Todos cometemos errores y estamos aquí para ayudarte con características que capturarán los secretos que expongas accidentalmente:
- La protección de inserción, con la que experimentaremos más tarde, bloquea la inserción de secretos en los repositorios de GitHub.
- El análisis de secretos examina los repositorios y crea alertas cuando detecta un secreto. Para algunos secretos, también notificamos al proveedor para que pueda tomar medidas, como revocar el secreto automáticamente.
Práctica de almacenamiento seguro de un secreto
En este ejercicio, crearemos un personal access token y lo almacenaremos de forma segura para poder usarlo con GitHub Actions. La acción que crearemos es un flujo de trabajo sencillo que responde a una propuesta.
1. Creación de un repositorio de prácticas
Comenzaremos creando un repositorio desde el que trabajar. La cuenta new2code
tiene un repositorio de plantillas que podemos usar para empezar a trabajar rápidamente.
- Ve a la página del nuevo repositorio. Al seguir este vínculo, se seleccionará previamente la plantilla en la cuenta
new2code
. - En "Propietario", asegúrate de que la cuenta de usuario está seleccionada.
- En el campo "Nombre del repositorio", escribe
secret-action
. - Debajo del campo descripción, selecciona Público para establecer la visibilidad del repositorio.
- Haga clic en Create repository (Crear repositorio).
2. Confirmación de un token ficticio
Todos cometemos errores y es posible que hagas commit accidentalmente a un secreto en algún momento de tu recorrido de codificación. En este ejercicio, haremos commit intencionadamente a un token falso para que podamos familiarizarnos con la alerta que se desencadena.
-
Dirígete al repositorio que acabas de crear.
-
Ve al archivo de flujo de trabajo de YAML haciendo clic en
.github/workflows
en la lista de archivos. -
Abre el archivo de flujo de trabajo haciendo clic en
comment.yml
en la lista de archivos. -
Para editar el archivo de flujo de trabajo, en la parte superior derecha, haz clic en .
-
En la línea 13,
GH_TOKEN: ""
, inserta este token ficticio entre las comillas:secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde
El resultado final debe tener este aspecto:
GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde"
-
Para intentar confirmar el cambio, en la parte superior derecha, haz clic en Confirmar cambios... y, a continuación, haz clic en Confirmar cambios de nuevo en el cuadro de diálogo.
-
Ahora deberías ver la alerta de protección de inserción, que indica que "El análisis de secretos encontró un secreto de análisis de secretos de GitHub en la línea 13".
Si no hubiéramos estado experimentando con un token ficticio, esto nos avisaría de que estábamos a un paso de exponer un token. Revisa las opciones que puedes seleccionar en la alerta.
-
Para detener la confirmación y evitar exponer el secreto, haz clic en Cancelar. En la parte superior derecha, haz clic en Cancelar cambios y, a continuación, descarta los cambios no guardados si se te solicita.
3. Creación de un token real
Ahora, vamos a intentar seguir nuestros procedimientos recomendados. En primer lugar, crearemos un personal access token que permitirá que la acción actúe en tu nombre (el comentario que crea parecerá que procede de tu cuenta de usuario).
Note
Observa cómo seguimos el principio de privilegios mínimos para cada paso de configuración. El token tendrá la expiración más corta necesaria, solo tendrá acceso al repositorio que necesita y tendrá los permisos mínimos necesarios para funcionar.
- Ve a la nueva página de personal access token.
- En "Nombre del token", asigna un nombre al nuevo token. Puedes usar algo parecido a "Token de acción".
- En "Expiración", selecciona "7 días".
- En "Acceso al repositorio", selecciona Solo repositorios seleccionados.
- En la lista desplegable "Seleccionar repositorios", selecciona solo el repositorio de prácticas que creaste anteriormente.
- A la derecha de "Permisos de repositorio" en la sección "Permisos", haz clic en para ver todos los permisos posibles.
- Desplázate hacia abajo hasta "Propuestas" y, en la lista desplegable de la derecha, selecciona "Lectura y escritura".
- En la parte inferior de la página, haz clic en Generar token. Si se te solicita, confirma haciendo clic en Generar token de nuevo.
Es fundamental controlar el token resultante de forma segura desde este momento hacia adelante. Como usaremos el token en breve, puedes copiarlo en el Portapapeles brevemente.
4. Almacenamiento del token de forma segura
Ahora podemos almacenar nuestro nuevo token de forma segura en nuestro repositorio.
-
Ve al repositorio que creaste al principio del ejercicio.
-
En el nombre del repositorio, haz clic en Configuración. Si no puedes ver la pestaña "Configuración", selecciona el menú desplegable y, a continuación, haz clic en Configuración.
-
En la sección "Seguridad" de la barra lateral, seleccione Secretos y variables y haga clic en Acciones.
-
En "Secretos del repositorio", haz clic en Nuevo secreto de repositorio.
-
En el campo Nombre, escribe un nombre para el secreto. En este ejercicio, usaremos
MY_TOKEN
. -
En el campo Secreto, pega el personal access token que generaste anteriormente.
-
Haga clic en Add Secret.
Tu secreto ahora está cifrado y listo para usarse de forma segura.
5. Hacer referencia al token en nuestra acción
Ahora podemos actualizar el archivo de flujo de trabajo de YAML para usar el token y probarlo.
-
Vuelve al repositorio. Si estás en la configuración del repositorio, puedes hacer clic en Código en el nombre del repositorio.
-
Ve al archivo de flujo de trabajo de YAML haciendo clic en
.github/workflows
en la lista de archivos. -
Abre el archivo de flujo de trabajo haciendo clic en
comment.yml
en la lista de archivos. -
Para empezar a editar el archivo de flujo de trabajo, en la parte superior derecha, haz clic en .
-
En la línea 13,
GH_TOKEN: ""
, reemplaza las comillas vacías por${{ secrets.MY_TOKEN }}
. Esto hará referencia al secreto del repositorio que hemos agregado anteriormente.GH_TOKEN: ${{ secrets.MY_TOKEN }}
-
Para confirmar el cambio, en la parte superior derecha, haz clic en Confirmar cambios...
-
En el cuadro de diálogo "Confirmar cambios", edita "Confirmar mensaje" para reflejar el cambio que estamos realizando. Por ejemplo, podrías escribir "Actualizar flujo de trabajo para usar el secreto del repositorio".
-
Asegúrate de que está seleccionada la opción "Confirmar directamente en la rama
main
". -
Haga clic en Commit changes (Confirmar cambios).
6. Prueba del token y del flujo de trabajo
¡Ya deberíamos estar listos! Vamos a seguir adelante y probar el flujo de trabajo.
-
Debajo del nombre del repositorio, haga clic en Problemas.
-
Haz clic en Nueva propuesta.
-
En "Agregar un título", puedes escribir cualquier título que desees.
-
En "Agregar una descripción", en el área de texto, escribe
Hello
. -
Debajo del área de texto, haz clic en Crear.
Una vez que el flujo de trabajo ha tenido tiempo de completarse, debería aparecer un nuevo comentario. El comentario será de tu autoría, ya que estamos utilizando tu token, y contendrá un saludo a cambio.
Pasos siguientes
Para profundizar más en el examen de secretos y la protección de inserción, puedes completar el curso Introducción al examen de secretos en GitHub Skills.