Git καλά κρυμμένα μυστικά και ντοκουμέντα :git:

Ο κώδικας για μια υπηρεσία web περιέχει ενα σωρό κρυμμένα μυστικά, όπως κωδικούς για βάσεις δεδομένων, api keys, κλειδιά κρυπτογράφησης και πολλά άλλα. Δεν θα ήθελες τα μυστικά αυτά να βρεθούν, κατά λάθος ή όχι, μέσα σε ένα αποθετήριο :git: .
Αλλά αν δεν είναι εκεί, θα πρέπει να είναι κάπου αλλού. Και αν είναι αλλού κινδυνεύουν να χαθούν. Επίσης αν είναι αλλού κάθε deploy θα είναι κατά πολύ ποιο δύσκολο. Υπάρχει άραγε κάποιος καλύτερος τρόπος; Ναι, το git-crypt είναι μια κάποια λύσης.

%CE%B5%CE%B9%CE%BA%CF%8C%CE%BD%CE%B1

Εγκατάσταση

Το git-crypt υπάρχει στα αποθετήρια των περισσότερων διανομών. Αν δεν υπάρχει είναι πολύ εύκολο να χτιστεί και η μόνη εξάρτηση του είναι το libssl-devel.

Διαλέγοντας τι θα κρυπτογραφηθεί

Η πληροφορία αυτή υπάρχει στο αρχείο .gitattributes

secrets/** filter=git-crypt diff=git-crypt
ssh/**     filter=git-crypt diff=git-crypt
.gitattributes !filter !diff
.gitignore !filter !diff
.gitmodules  !filter !diff

στο παράδειγμα λέμε να κρυπτογραφηθούν τα πάντα μέσα στους φακέλους secrets και ssh. Επίσης προστατεύουμε από την κρυπτογράφηση κάποια βασικά αρχεία, αλλιώς δεν θα δουλεύει τίποτα.

Για να ενεργοποιήσουμε την κρυπτογράφηση θα δώσουμε την εντολή

git-crypt init

Στην συνέχεια θα επιλέξουμε είτε συμμετρική κρυπτογράφηση, είτε κρυπτογράφηση με χρήση gpg

Συμμετρική κρυπτογράφηση

Είναι ο ποιο εύκολος τρόπος. Με τις παρακάτω εντολές θα φτιάξουμε το κλειδί που θα χρησιμοποιηθεί

mkdir keys
git-crypt export-key keys/secret.key

Θα πρέπει να σιγουρευτούμε πως το κλειδί δεν θα μπει ποτέ κατά λάθος στο αποθετήριο βάζοντας μια γραμμή στο αρχείο .gitignore

keys/secret.key

Το αρχείο αυτό θα το μοιράσουμε με ασφαλή τρόπο σε όλους τους developers.

Κρυπτογραφώντας το κλειδί κρυπτογραφισης

Μια άλλη λύση είναι να βάλουμε μια κρυπτογραφημένη έκδοση του στο αποθετήριο. Ξέρω έχουμε το πρόβλημα της κότας με το αυγό :egg::egg: :innocent:

gpg --output keys/secret.gpg --symmetric keyssecret.key
git add  keys/secret.gpg

Τώρα θα πρέπει να μοιράσουμε μόνο ένα μυστικό κωδικό. Για ευκολία έχουμε και ένα μικρό script :shell: για την αποκρυπτογραφιση

    #!/bin/bash

    ECRYPT_FILE=secret.gpg
    DECRYPT_FILE=secret.key

    red=`tput setaf 1`
    green=`tput setaf 2`
    yellow=`tput setaf 3`
    blue=`tput setaf 4`
    magenta=`tput setaf 5`
    cyan=`tput setaf 6`
    white=`tput setaf 7`
    black=`tput setaf 0`
    reset=`tput sgr0`

    # To encrypt issue the command
    # gpg --output secret.gpg --symmetric secret.key 
    # Be sure to use the same password

    echo "Enter your password to unlock the  gpg.key"
    gpg --output ${DECRYPT_FILE} --decrypt ${ECRYPT_FILE}
    if [ $? -eq 0 ]; then
        echo ${green}OK${reset}
        echo "Run the command"
        echo "   git-crypt unlock key/secret.key"
        echo "in the root of the repository"
    else
        echo ${red}FAIL${reset}
    fi

Κρυπτογράφηση με χρήση GPG

Για να ενεργοποιήσεις την κρυπτογράφηση GPG θα δώσεις την εντολή

git-crypt add-gpg-user USER_ID

όπου το USER_ID το ID του κλειδιού, ή το email ή οτιδήποτε αναγνωρίζει μοναδικά το κλειδί. Η πληροφορία θα αποθηκευτεί στον φάκελο .git-crypt

Ο χώρος δεν επιτρέπει να πούμε για το πως φτιάχνει η χρησιμοποιείς τέτοια κλειδιά. Μπορείς να δεις εδώ πως μπορείς να το κάνεις.

Αποκρυπτογραφώντας να αποθετήριο

Όταν κάνουμε clone το αποθετήριο, την πρώτη μόνο φορά, θα δώσουμε μια από τις παρακάτω εντολές, ανάλογα με την μέθοδο κρυπτογράφησης.

git-crypt unlock
git-crypt unlock  key/secret.key

Χρήση του git

Μετά που θα γίνουν τα παραπάνω, απλά χρησιμοποιούμε το git κανονικά. Η κρυπτογράφηση/αποκρυπτογράφηση θα είναι αυτόματη και διαφανής. Στο τοπικό υπολογιστή θα είναι αποκρυπτογραφημένα, αλλά στο εξωτερικό αποθετήριο όπως στο github ή στο gitea κρυπτογραφημένα. Αν κάποιος δεν έχει τα κλειδιά ή τους κωδικούς και το κατεβάσει θα πάρει την κρυπτογραφημένη έκδοση.

Πιθανά να προκύψουν προβλήματα με κάποια gui όπως το github για Mac οπότε βεβαιωθείτε πως τα πάντα είναι σωστά πριν το πρώτο commit.

Η εντολή git-crypt status -e θα δείξει τα κρυπτογραφημένα αρχεία. Η εντολή git-crypt status -f θα κρυπτογραφήσει όσα αρχεία θα έπρεπε να είναι κρυπτογραφημένα και δεν είναι, πιθανά γιατί την προσθέσαμε σε ένα παλιό αποθετήριο.

Περιορισμοί

Αν γίνει μια αλλαγή σε ένα αρχείο το git θα αποθηκεύσει όλο το αρχείο και όχι μόνο το delta. Επίσης δεν μπορεί να γίνει ανάκληση η ανανέωση των πιστοποιητικών. Αυτό είναι ένα δύσκολο πρόβλημα να λυθεί λόγω της ιστορικής φύσης ενός αποθετηρίου.

Τα ονόματα των αρχείων, τα commit messages και όλο το ιστορικό και τα metadata θα είναι χωρίς κάποια κρυπτογράφηση. Και αν κάποιος πειράξει το αρχείο .gitattributes η κρυπτογράφηση θα σταματήσει.

Που είναι κατάλληλο λοιπόν; Το git-crypt είναι κατάλληλο μόνο αν λίγα αρχεία σε ένα αποθετήριο θέλουμε να είναι προστατευμένα. Για μια ποιο πλήρη λύση κάτι σαν το git-remote-gcrypt, αλλά λίγοι το έχουν ανάγκη.

Eσείς πως κάνετε την διαχείριση των μυστικών;

2 Likes