Nota: Los ejecutores hospedados en GitHub no son compatibles con GitHub Enterprise Server actualmente. Puedes encontrar más información sobre el soporte que se tiene planeado en el futuro en el Itinerario público de GitHub.
Acerca de los secretos cifrados
Los secretos son variables de ambiente cifradas que creas en una organización o repositorio. Los secretos que creas están disponibles para utilizarse en los flujos de trabajo de GitHub Actions. GitHub utiliza una caja sellada de libsodium para ayudarte a garantizar que los secretos se cifran antes de llegar a GitHub y que permanezcan cifrados hasta que los utilices en un flujo de trabajo.
Para los secretos almacenados a nivel organizacional, peudes utilizar las políticas de acceso para controlar qué repositorios pueden utilizar secretos organizacionales. Los secretos a nivel organizacional te permiten compartir secretos entre repositorios múltiples, lo cual reduce la necesidad de crear secretos duplicados. El actualizar un secreto de organización en una ubicación también garantiza que el cambio tome efecto en todos los flujos de trabajo del repositorio que lo utilicen.
Nombrar tus secretos
Las siguientes reglas aplican a los nombres secretos:
-
Los nombres secretos solo contienen caracteres alfanuméricos (
[a-z]
,[A-Z]
,[0-9]
) o guiones bajos (_
). No se permiten espacios. -
Los nombres secretos no deben comenzar con el prefijo
GITHUB_
. -
Los nombres secretos no deben comenzar con un número.
-
Los nombres de secreto no distinguen entre mayúsculas y minúsculas.
-
Los nombres secretos deben ser únicos en el nivel en el que se hayan creado.
Por ejemplo, un secreto que se creó a nivel de repositorio debe tener un nombre único en éste, y un secreto que se creó a nivel de organización debe tener un nombre único en este nivel.
Si un secreto con el mismo nombre existe en varios niveles, aquél en el nivel más bajo tomará presedencia. Por ejemplo, si un secreto a nivel de organización tiene el mismo nombre que un secreto a nivel de repositorio, entonces el secreto a nivel de repositorio tomará precedencia.
Para ayudarte a garantizar que GitHub redacta tus secretos en bitácoras, evita utilizar datos estructurados como los valores de los secretos. Por ejemplo, evita crear secretos que contengan JSON o blobs de Git codificados.
Acceder a tus secretos
Para hacer que un secreto esté disponible para una acción, debes configurar el secreto como una variable de entrada o de entorno en tu archivo de flujo de trabajo. Revisa el archivo README de la acción para saber qué variables de entrada y de entorno espera la acción. Para obtener más información, consulta "Sintaxis del flujo de trabajo paraGitHub Actions".
Puedes usar y leer secretos cifrados en un archivo de flujo de trabajo si tienes acceso para editar el archivo. Para obtener más información, consulta "Permisos de acceso en GitHub."
Advertencia: GitHub redacta automáticamente secretos impresos en el registro, pero debes evitar imprimir secretos en el registro intencionalmente.
También puedes administrar secretos utilizando la API de REST. Para obtener más información, consulta la sección "Secretos".
Limitar permisos de credenciales
Cuando generes credenciales, te recomendamos que otorgues los mínimos permisos posibles. Por ejemplo, en lugar de usar credenciales personales, usa implementar claves o una cuenta de servicio. Considera otorgar permisos de solo lectura si eso es todo lo que se necesita, y limita el acceso lo máximo posible. Cuando generes un token de acceso personal (PAT), selecciona el menor número de ámbitos necesarios.
Nota: Puedes utilizar la API de REST para administrar los secretos. Para obtener más información, consulta la sección " API de secretos de GitHub Actions".
Crear secretos cifrados para un repositorio
Para crear secretos para un repositorio de una cuenta de usuario, deberás ser el propietario de éste. Para crear secretos para un repositorio de una organización, deberás tener acceso de administrador
.
-
En tu instancia de GitHub Enterprise Server, visita la página principal del repositorio.
-
Debajo de tu nombre de repositorio, da clic en Configuración.
-
En la barra lateral izquierda, haz clic en Secrets (Secretos).
-
Da clic en Secreto de repositorio nuevo.
-
Teclea un nombre para tu secreto en el cuadro de entrada Name.
-
Ingresa el valor de tu secreto.
-
Haz clic en Agregar secreto (Agregar secreto).
Si tu repositorio puede acceder a los secretos de la organización padre, entonces estos secretos también se listan en esta página.
Para aprender más sobre el CLI de GitHub, consulta la sección "Acerca del CLI de GitHub".
Para agregar un secreto de repositorio, utiliza el subcomando gh secret set
. Reemplaza a secret-name
con el nombre de tu secreto.
gh secret set secret-name
El CLI te pedirá ingresar un valor secreto. Como alternativa, puedes leer el valor del secreto desde un archivo.
gh secret set secret-name < secret.txt
Para listar todos los secretos del repositorio, utiliza el subcomando gh secret list
.
Crear secretos cifrados para una organización
Cuando creas un secreto en una organización, puedes utilizar una política para limitar el acceso de los repositorios a este. Por ejemplo, puedes otorgar acceso a todos los repositorios, o limitarlo a solo los repositorios privados o a una lista específica de estos.
Para crear secretos a nivel organizacional, deberás tener acceso de administrador
.
- En tu instancia de GitHub Enterprise Server, navega hasta la página principal de la organización.
- Debajo del nombre de tu organización, da clic en Ajustes.
-
En la barra lateral izquierda, haz clic en Secrets (Secretos).
-
Da clic en Secreto de organización nuevo.
-
Teclea un nombre para tu secreto en el cuadro de entrada Name.
-
Ingresa el Valor para tu secreto.
-
Desde la lista desplegable Acceso de los repositorios, elige una política de acceso.
-
Haz clic en Agregar secreto (Agregar secreto).
Nota: Predeterminadamente, el CLI de GitHub se autentica con los alcances repo
y read:org
. Para administrar los secretos de la organización, debes autorizar el alcance admin:org
adicionalmente.
gh auth login --scopes "admin:org"
Para agregar un secreto para una organización, utiliza el subcomando gh secret set
con el marcador --org
o -o
seguido del nombre de la organización.
gh secret set --org organization-name secret-name
Predeterminadamente, el secreto solo se encuentra disponible para los repositorios privados. Para especificar que el secreto debe estar disponible para todos los repositorios dentro de la organización, utiliza el marcador --visibility
o -v
.
gh secret set --org organization-name secret-name --visibility all
Para especificar que el secreto debe estar disponible para los repositorios seleccionados dentro de la organización, utiliza el marcador --repos
o -r
.
gh secret set --org organization-name secret-name --repos repo-name-1,repo-name-2"
Para listar todos los secretos para una organización, utiliza el subcomando gh secret list
con el marcador --org
o -o
seguido del nombre de la organización.
gh secret list --org organization-name
Revisar el acceso a los secretos de nivel organizacional
Puedes revisar qué políticas de acceso se están aplicando a un secreto en tu organización.
- En tu instancia de GitHub Enterprise Server, navega hasta la página principal de la organización.
- Debajo del nombre de tu organización, da clic en Ajustes.
-
En la barra lateral izquierda, haz clic en Secrets (Secretos).
-
La lista de secretos incluye cualquier política y permiso configurado. Por ejemplo:
-
Para encontrar más detalles sobre los permisos configurados para cada secreto, da clic en Actualizar.
Usar secretos cifrados en un flujo de trabajo
Nota:Con la excepción de GITHUB_TOKEN
, los secretos no se pasan al ejecutador cuando un flujo de trabajo se dispara desde un repositorio bifurcado.
Para proporcionar una acción con un secreto como una variable de entrada o de entorno, puedes usar el contexto de secretos
para acceder a los secretos que has creado en tu repositorio. Para obtener más información, consulta las secciones de "Contextos" y "Sintaxis de flujo de trabajo para GitHub Actions".
steps:
- name: Hello world action
with: # Set the secret as an input
super_secret: ${{ secrets.SuperSecret }}
env: # Or as an environment variable
super_secret: ${{ secrets.SuperSecret }}
Evita pasar secretos entre procesos desde la línea de comando, siempre que sea posible. Los procesos de la línea de comando pueden ser visibles para otros usuarios (utilizando el comando ps
) o ser capturados por eventos de auditoría de seguridad. Para ayudar a proteger los secretos, considera usar variables de entorno, STDIN
u otros mecanismos admitidos por el proceso de destino.
Si debes pasar secretos dentro de una línea de comando, enciérralos usando las normas de uso de comillas adecuadas. Los secretos suelen contener caracteres especiales que pueden afectar involuntariamente a tu shell. Para evitar estos caracteres especiales, usa comillas en tus variables de entorno. Por ejemplo:
Ejemplo usando Bash
steps:
- shell: bash
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "$SUPER_SECRET"
Ejemplo usando PowerShell
steps:
- shell: pwsh
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "$env:SUPER_SECRET"
Ejemplo usando Cmd.exe
steps:
- shell: cmd
env:
SUPER_SECRET: ${{ secrets.SuperSecret }}
run: |
example-command "%SUPER_SECRET%"
Límites para los secretos
Puedes almacenar hasta 1000 secretos de organización y 100 secretos de repositorio.
Un flujo de trabajo que se haya creado en un repositorio puede acceder a la siguiente cantidad de secretos:
- Todos los 100 secretos de repositorio.
- Si se asigna acceso a más de 100 secretos de la organización para este repositorio, el flujo de trabajo solo puede utilizar los primeros 100 secretos de organización (que se almacenan por orden alfabético por nombre de secreto).
Los secretos tienen un tamaño máximo de 64 KB. Para usar secretos de un tamaño mayor a 64 KB, puedes almacenar los secretos cifrados en tu repositorio y guardar la contraseña de descifrado como un secreto en GitHub. Por ejemplo, puedes usar gpg
para cifrar tus credenciales de manera local antes de verificar el archivo en tu repositorio en GitHub. Para obtener más información, consulta la página del manual "gpg".
Advertencia: Evita que tus secretos se impriman cuando se ejecute tu acción. Cuando usas esta solución, GitHub no redacta los secretos que están impresos en los registros.
-
Ejecuta el siguiente comando en tu terminal para cifrar el archivo
my_secret.json
usandogpg
y el algoritmo de cifras AES256.$ gpg --symmetric --cipher-algo AES256 my_secret.json
-
Se te pedirá que ingreses una contraseña. Recuerda la contraseña, porque deberás crear un nuevo secreto en GitHub que use esa contraseña como valor.
-
Crear un nuevo secreto que contiene la frase de acceso. Por ejemplo, crea un nuevo secreto con el nombre
LARGE_SECRET_PASSPHRASE
y establece el valor del secreto para la contraseña que seleccionaste en el paso anterior. -
Copia tu archivo cifrado en tu repositorio y confírmalo. En este ejemplo, el archivo cifrado es
my_secret.json.gpg
. -
Crea un script shell para descifrar la contraseña. Guarda este archivo como
decrypt_secret.sh
.#!/bin/sh # Decrypt the file mkdir $HOME/secrets # --batch to prevent interactive command # --yes to assume "yes" for questions gpg --quiet --batch --yes --decrypt --passphrase="$LARGE_SECRET_PASSPHRASE" \ --output $HOME/secrets/my_secret.json my_secret.json.gpg
-
Asegúrate de que tu shell script sea ejecutable antes de verificarlo en tu repositorio.
$ chmod +x decrypt_secret.sh $ git add decrypt_secret.sh $ git commit -m "Add new decryption script" $ git push
-
En tu flujo de trabajo, usa un
step
para llamar al shell script y descifrar el secreto. Para tener una copia de tu repositorio en el entorno en el que se ejecuta tu flujo de trabajo, deberás usar la accióncode>actions/checkout
. Haz referencia a tu shell script usando el comandorun
relacionado con la raíz de tu repositorio.name: Workflows with large secrets on: push jobs: my-job: name: My Job runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Decrypt large secret run: ./.github/scripts/decrypt_secret.sh env: LARGE_SECRET_PASSPHRASE: ${{ secrets.LARGE_SECRET_PASSPHRASE }} # Este comando es solo un ejemplo para mostrar cómo se imprime tu secreto. # Asegúrate de eliminar las declaraciones impresas de tus secretos. GitHub # no oculta los secretos que usan esta solución. - name: Test printing your secret (Elimina este paso en la producción) run: cat $HOME/secrets/my_secret.json
Almacenar blobs binarios en Base64 como secretos
Puedes utilizar el cifrado en Base64 para almacenar blobs binarios pequeños como secretos. Puedes referenciar el secreto en tu flujo de trabajo y decodificarlo para utilizarlo en el ejecutor. Para los límites de tamaño, consulta la sección de Límites para los secretos".
Nota: Toma en cuenta que Base64 solo convierte los binarios a texto y no es un sustituto de un cifrado real.
-
Utiliza
base64
para cifrar tu archivo en una secuencia Base64. Por ejemplo:$ base64 -i cert.der -o cert.base64
-
Crea un secreto que contenga la secuencia de Base64. Por ejemplo:
$ gh secret set CERTIFICATE_BASE64 < cert.base64 ✓ Set secret CERTIFICATE_BASE64 for octocat/octorepo
-
Para acceder a la secuencia de Base64 desde tu ejecutor, lleva el secreto a
base64 --decode
. Por ejemplo:name: Retrieve Base64 secret on: push: branches: [ octo-branch ] jobs: decode-secret: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Retrieve the secret and decode it to a file env: CERTIFICATE_BASE64: ${{ secrets.CERTIFICATE_BASE64 }} run: | echo $CERTIFICATE_BASE64 | base64 --decode > cert.der - name: Show certificate information run: | openssl x509 -in cert.der -inform DER -text -noout