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: Σε επίπεδο αποθετηρίου ή οργανισμού, μπορούν να αποθηκευτούν μυστικά. Διατίθενται στα workflows μέσω ${{ 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('Χρησιμοποιήστε το μυστικό') {
                steps {
                    withCredentials([string(credentialsId: 'my-secret-id', variable: 'MY_VAR')]) {
                        sh 'echo $MY_VAR'
                    }
                }
            }
        }
    }
    

Γενικές αρχές:

  • Ελαχιστοποίηση του εύρους: Τα μυστικά είναι διαθέσιμα μόνο στα στάδια και στα περιβάλλοντα όπου χρειάζονται.
  • Μάσκαρα στα αρχεία καταγραφής: Οι τιμές των μυστικών κρύβονται στα αρχεία καταγραφής εκτέλεσης της γραμμής κατασκευής.
  • Διαχωρισμός ρόλων: Μόνο εξουσιοδοτημένοι χρήστες ή συστήματα μπορούν να προσθέτουν/τροποποιούν μυστικά.
  • Χρήση εξωτερικών αποθηκευτικών χώρων: Για πιο πολύπλοκα σενάρια και κεντρική διαχείριση μυστικών, χρησιμοποιούνται Vault ή παρόμοιες λύσεις.