Κάποια στιγμή, κάποιος στην ομάδα έκανε commit ένα .env. Ίσως το κατάλαβε και το έσβησε στο επόμενο commit. Το κλειδί όμως είναι ακόμα εκεί, στο ιστορικό του git, για όποιον έχει πρόσβαση στο repo, και για πάντα αν το repo γίνει ποτέ δημόσιο.
Πού κρύβονται συνήθως
- Αρχεία .env που ξέφυγαν από το
.gitignore, ή.env.productionπου κανείς δεν σκέφτηκε να εξαιρέσει. - Αρχεία ρυθμίσεων:
wp-config.php,config.json,settings.pyμε κωδικούς βάσεων. - Ιδιωτικά κλειδιά:
id_rsa,*.pem, πιστοποιητικά με το κλειδί τους. - Κλειδιά στον κώδικα: ένα
sk_live_του Stripe ή έναsk-ant-της Anthropic «προσωρινά» μέσα σε ένα αρχείο. - Σενάρια deploy και αρχεία CI με κωδικούς αντί για secrets.
- Dumps βάσεων για «δοκιμές», με πραγματικά δεδομένα πελατών.
Γιατί το «το έσβησα» δεν αρκεί
Το git κρατά κάθε έκδοση κάθε αρχείου. Ένα αρχείο που σβήστηκε στο επόμενο commit υπάρχει ακόμα στο προηγούμενο. Ακόμα κι αν ξαναγράψεις το ιστορικό, τα αντίγραφα σε laptops, forks και CI caches μένουν. Ένα κλειδί που μπήκε σε repo θεωρείται διαρρεύσαν.
Πώς τα βρίσκεις
Η σάρωση ψάχνει μοτίβα που έχουν γνωστή μορφή:
| Τι | Πώς μοιάζει |
|---|---|
| Stripe live key | Ξεκινά με sk_live_ ή rk_live_ |
| AWS access key | Ξεκινά με AKIA και 16 χαρακτήρες |
| GitHub token | Ξεκινά με ghp_, gho_ ή github_pat_ |
| Anthropic / OpenAI | Ξεκινά με sk-ant- ή sk- |
| Ιδιωτικό κλειδί | -----BEGIN ... PRIVATE KEY----- |
| Αρχείο .env | Οποιοδήποτε .env εκτός από .env.example |
Το Devios σαρώνει τα repositories που φέρνει η σύνδεση με το GitHub και, για κάθε εύρημα, κρατά μόνο το hash και μια κομμένη προεπισκόπηση. Η ίδια η τιμή δεν αποθηκεύεται ποτέ. Κάθε νέο εύρημα στέλνει ειδοποίηση ασφαλείας.
Βρήκες ένα κλειδί. Τι κάνεις
- Ανακάλεσέ το στον πάροχο. Φτιάξε νέο κλειδί, βάλ’ το στην εφαρμογή, και μετά σβήσε το παλιό. Αυτό είναι το μόνο βήμα που πραγματικά σε προστατεύει.
- Έλεγξε αν χρησιμοποιήθηκε. Στα logs του παρόχου: χρεώσεις, κλήσεις API, συνδέσεις από άγνωστες IP.
- Μετέφερε την τιμή εκεί που πρέπει. Στο θησαυροφυλάκιο και στα secrets του CI ή του hosting.
- Διόρθωσε το .gitignore ώστε να μην ξανασυμβεί.
- Καθάρισε το ιστορικό μόνο αν το repo θα γίνει δημόσιο ή θα δοθεί σε τρίτους. Δεν αντικαθιστά το βήμα 1.
Πώς δεν ξανασυμβαίνει
- Ένα
.env.exampleμε τα ονόματα των μεταβλητών, χωρίς τιμές, είναι το μόνο .env στο repo. - Οι πραγματικές τιμές ζουν στο θησαυροφυλάκιο, ανά περιβάλλον.
- Σύγκριση των ονομάτων του .env με τα GitHub Actions secrets, για να φαίνεται τι λείπει, χωρίς να φύγει καμία τιμή από τον browser.
- Push protection ενεργό σε όλο τον οργανισμό.
Συχνές ερωτήσεις
Το repo είναι ιδιωτικό. Χρειάζεται να ανησυχώ;
Ναι. Ιδιωτικό σημαίνει ότι το βλέπουν όλοι όσοι έχουν ή είχαν πρόσβαση, κάθε fork, κάθε CI και κάθε laptop που το έκανε clone. Και τα ιδιωτικά repos γίνονται κάποτε δημόσια κατά λάθος.
Αρκεί να ξαναγράψω το ιστορικό του git;
Όχι. Βοηθά για το μέλλον, αλλά τα παλιά αντίγραφα μένουν. Το κλειδί πρέπει να αλλάξει στον πάροχο.
Πόσο συχνά πρέπει να γίνεται η σάρωση;
Συνεχώς, με κάθε συγχρονισμό. Ένα κλειδί που μπαίνει σήμερα πρέπει να το μάθεις σήμερα, όχι στον ετήσιο έλεγχο.
