Как криптирате променливите в 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 или подобни решения.