Sobes.tech
Middle

Hoe versleutelt u variabelen in CI?

sobes.tech AI

Antwoord van AI

Ik versleut variabelen met behulp van de ingebouwde functies van het CI-systeem. Elk CI-systeem, of het nu GitLab CI/CD, GitHub Actions of Jenkins is, heeft functies voor het veilig opslaan van geheimen. Deze variabelen zijn alleen beschikbaar in bepaalde fasen van de build-pipeline en worden niet weergegeven in logs.

Bijvoorbeeld, in GitLab CI:

  • Omgevingsvariabelen: Op groeps- of projectniveau kunnen variabelen worden opgeslagen. Ze worden gemarkeerd als "beveiligd" en "gemaskeerd". "Beveiligde" variabelen worden alleen gebruikt in beveiligde takken en tags, en "gemaskeerde" verbergen de waarde in logs als deze volledig overeenkomt.

    # .gitlab-ci.yml
    # Toegang tot de variabele via de omgeving
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Integratie met een externe geheimenopslag, zoals HashiCorp Vault. GitLab CI kan zich authenticeren bij Vault en tijdens de uitvoering van de pipeline geheimen ophalen.

    # .gitlab-ci.yml
    variables:
      VAULT_SERVER: "https://vault.example.com"
      VAULT_AUTH_ROLE: "gitlab-ci"
      VAULT_AUTH_PATH: "auth/kubernetes"
      VAULT_SECRETS: |
        MY_SECRET_KEY: vault/path/to/secret:key
    script:
      - echo $MY_SECRET_KEY # Variabele wordt automatisch geladen uit Vault
    

In GitHub Actions:

  • Secrets: Op repository- of organisatieniveau kunnen secrets worden opgeslagen. Ze zijn beschikbaar in workflows via ${{ secrets.MY_SECRET }}. De waarden worden niet weergegeven in logs en kunnen niet worden opgehaald via API na het opslaan.

    # .github/workflows/main.yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Gebruik geheim
          run: echo ${{ secrets.MY_SECRET }}
    

In Jenkins:

  • Credentials Plugin: Maakt het mogelijk om verschillende soorten inloggegevens (gebruikersnaam/wachtwoord, geheime tekst, SSH-sleutel) versleuteld op te slaan. Ze kunnen worden benaderd in Jenkinsfile of via de grafische interface.

    // Jenkinsfile (Declaratieve pipeline)
    pipeline {
        agent any
        stages {
            In het buildproces, waar variabelen worden gebruikt, zijn ze meestal beschikbaar als omgevingsvariabelen.
            stage('Gebruik geheim') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Algemene principes:

  • Minimaliseer de scope: Geheimen zijn alleen beschikbaar in de fasen en omgevingen waar ze nodig zijn.
  • Logmaskering: De waarden van geheimen worden verborgen in de logs van de pipeline-uitvoering.
  • Roltoewijzing: Alleen geautoriseerde gebruikers of systemen kunnen geheimen toevoegen/bewerken.
  • Gebruik externe opslag: Voor complexere scenario's en gecentraliseerd beheer van geheimen worden Vault of vergelijkbare oplossingen gebruikt.