Ο κώδικας για μια υπηρεσία web περιέχει ενα σωρό κρυμμένα μυστικά, όπως κωδικούς για βάσεις δεδομένων, api keys, κλειδιά κρυπτογράφησης και πολλά άλλα. Δεν θα ήθελες τα μυστικά αυτά να βρεθούν, κατά λάθος ή όχι, μέσα σε ένα αποθετήριο .
Αλλά αν δεν είναι εκεί, θα πρέπει να είναι κάπου αλλού. Και αν είναι αλλού κινδυνεύουν να χαθούν. Επίσης αν είναι αλλού κάθε deploy θα είναι κατά πολύ ποιο δύσκολο. Υπάρχει άραγε κάποιος καλύτερος τρόπος; Ναι, το git-crypt είναι μια κάποια λύσης.
Εγκατάσταση
Το 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.
Κρυπτογραφώντας το κλειδί κρυπτογραφισης
Μια άλλη λύση είναι να βάλουμε μια κρυπτογραφημένη έκδοση του στο αποθετήριο. Ξέρω έχουμε το πρόβλημα της κότας με το αυγό
gpg --output keys/secret.gpg --symmetric keyssecret.key
git add keys/secret.gpg
Τώρα θα πρέπει να μοιράσουμε μόνο ένα μυστικό κωδικό. Για ευκολία έχουμε και ένα μικρό script για την αποκρυπτογραφιση
#!/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σείς πως κάνετε την διαχείριση των μυστικών;