Innanzitutto, il motivo non di sicurezza:
Flusso di lavoro per la modifica della password
Le password cambiano indipendentemente dal codice di un'applicazione software. Se un DBA modifica una password del database, ha senso che gli sviluppatori debbano aggiornare il codice, ottenere una nuova build e rilasciare in produzione e provare a cronometrare tutto? Le password sono un artefatto di configurazione runtime, non un artefatto di sviluppo. Devono essere iniettati tramite file di configurazione, variabili di ambiente o qualsiasi paradigma di configurazione che si sta utilizzando.
Ambito di autorizzazione
Generalmente, i sistemi di controllo delle versioni forniscono il controllo dell'autorizzazione in modo che solo gli utenti autorizzati possano accedervi. Ma all'interno di un repository, i permessi sono generalmente di tipo lettura / scrittura, o di sola lettura, o possibilmente alcuni campanelli e fischietti come fornisce GitHub. È improbabile che trovi limiti di sicurezza che consentano agli sviluppatori di ottenere codice sorgente, ma password non . Se riesci a clonare un repository, puoi clonare un repository. Periodo. In molti ambienti, gli sviluppatori non hanno pieno accesso alla produzione. A volte hanno accesso in sola lettura ai database di produzione, a volte nessun accesso. Che cosa succede se gli sviluppatori hanno generalmente accesso, ma non vuoi che tutti i tirocinanti, i nuovi assunti, ecc. Abbiano accesso?
Ambienti
Che cosa succede se disponi di più ambienti, ad esempio un ambiente di sviluppo, un ambiente di controllo qualità, la gestione temporanea e la produzione? Vuoi memorizzare tutte le loro password nel controllo della versione? In che modo l'app sa quale usare? L'app dovrebbe avere un modo per conoscere l'ambiente, che finirebbe per essere un'impostazione di configurazione. Se è possibile impostare il nome dell'ambiente come impostazione di configurazione, è possibile impostare la password del database come impostazione di configurazione (insieme alla stringa di connessione, nome utente, ecc.)
Storia
Come altri hanno già menzionato, il controllo della versione è progettato per preservare la cronologia. Quindi le password più vecchie saranno ancora recuperabili, il che potrebbe non essere la cosa migliore.
Compromesso
Quante volte abbiamo visto i titoli nelle notizie sul codice sorgente di alcuni prodotti che sono trapelati al mondo? Il codice sorgente è qualsiasi cosa si trovi nel controllo della versione. Questo è probabilmente il motivo principale per non inserire password nel controllo della versione!
Tuttavia ...
Detto questo, le password devono essere memorizzate da qualche parte . Ciò a cui alludono le preoccupazioni di cui sopra non significa necessariamente che non debbano essere memorizzati nel controllo di versione, piuttosto che non dovrebbero essere memorizzati nel repository del codice sorgente del prodotto nel controllo di versione. Avere un repository separato per la gestione della configurazione, le operazioni, ecc. È molto ragionevole. La chiave è dividere le operazioni dallo sviluppo quando si tratta di credenziali di sicurezza, non necessariamente per evitare del tutto il controllo della versione.
Inoltre, per gli ambienti non di produzione, ho memorizzato le password e le chiavi API per i sistemi esterni nei file di configurazione all'interno del codice sorgente del prodotto come predefinite. Perché? Per renderlo indolore quando uno sviluppatore estrae il codice, può semplicemente costruirlo ed eseguirlo senza dover andare a scaricare ulteriori file di configurazione. Queste sono credenziali che raramente cambiano e non portano a segreti commerciali. Ma non lo farei mai con i segreti di produzione.
Quindi la linea di fondo è ... dipende.