Sobes.tech
Middle

Как криптирате променливите в CI?

sobes.tech AI

Отговор от AI

Шифрирам променливи, използвайки вградените възможности на CI системата. Всяка CI система, независимо дали е GitLab CI/CD, GitHub Actions или Jenkins, разполага с функции за безопасно съхранение на тайни. Тези променливи са достъпни само на определени етапи от конвейера и не се показват в логовете.

Например, в GitLab CI:

  • Променливи на околната среда: На ниво група или проект могат да се съхраняват променливи. Те се маркират като "защитени" и "маскирани". "Защитените" се използват само в защитени клонове и тагове, "маскираните" скриват стойността в логовете, ако съвпадат напълно.

    # .gitlab-ci.yml
    # Достъп до променлива чрез околна среда
    script:
      - echo $MY_SECRET_VARIABLE
    
  • HashiCorp Vault: Интеграция с външно хранилище на тайни, като HashiCorp Vault. GitLab CI може да се удостоверява във Vault и да получава тайни по време на изпълнение на конвейера.

    # .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 # Променливата е автоматично заредена от Vault
    

В GitHub Actions:

  • Secrets: На ниво репозитория или организация могат да се съхраняват тайни. Достъпни са в работните процеси чрез ${{ secrets.MY_SECRET }}. Стойностите не се показват в логовете и не могат да бъдат получени чрез API след запазване.

    # .github/workflows/main.yml
    jobs:
      build:
        runs-on: ubuntu-latest
        steps:
        - name: Използване на тайна
          run: echo ${{ secrets.MY_SECRET }}
    

В Jenkins:

  • Credentials Plugin: Позволява съхраняването на различни типове идентификационни данни (потребителско име/парола, тайсен текст, SSH ключ) в криптиран вид. Те могат да бъдат достъпни в Jenkinsfile или чрез графичния интерфейс.

    // Jenkinsfile (Декларативен Pipeline)
    pipeline {
        agent any
        stages {
            В рамките на работния процес, където се използват променливи, те обикновено са достъпни като променливи на околната среда.
            stage('Use Secret') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Общи принципи:

  • Минимизиране на обхвата: Тайните са достъпни само на етапите и в средите, където са необходими.
  • Маскиране на логовете: Стойностите на тайните се скриват в логовете на изпълнението.
  • Разделяне на роли: Само упълномощени потребители или системи могат да добавят/променят тайни.
  • Използване на външни хранилища: За по-сложни сценарии и централизирано управление на тайните се използват Vault или подобни решения.