La gestione delle password nei repository verrebbe gestita in modi diversi a seconda del problema esatto.
1. Non farlo.
E i modi per evitare di farlo sono trattati in alcune risposte: .gitignore, config.example, ecc
o 2. Rendere il repository accessibile solo alle persone autorizzate
Vale a dire persone a cui è permesso conoscere la password. chmod
e vengono in mente gruppi di utenti; anche problemi come dovrebbero consentire ai dipendenti di Github o AWS di vedere cose se si ospitano i propri repository o server esternamente?
o 3. Crittografare i dati sensibili (scopo di questa risposta)
Se si desidera archiviare i file di configurazione contenenti informazioni riservate (come password) in un luogo pubblico, è necessario crittografarli. I file potrebbero essere decrittografati quando recuperati dal repository o persino utilizzati direttamente dalla loro forma crittografata.
Di seguito è mostrata una soluzione javascript di esempio per l'utilizzo di dati di configurazione crittografati.
const fs = require('fs');
const NodeRSA = require('node-rsa');
let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));
const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');
console.log('decrypted: ', config);
Quindi puoi recuperare un file di configurazione crittografato scrivendo solo poche righe di Javascript.
Si noti che l'inserimento di un file config.RSA
in un repository git lo renderebbe effettivamente un file binario e quindi perderebbe molti dei vantaggi di qualcosa come Git, ad esempio la capacità di selezionare le modifiche.
La soluzione potrebbe essere quella di crittografare coppie di valori chiave o forse solo valori. È possibile crittografare tutti i valori, ad esempio se si dispone di un file separato per le informazioni riservate o crittografare solo i valori sensibili se si hanno tutti i valori in un unico file. (vedi sotto)
Il mio esempio di cui sopra è un po 'inutile per chiunque voglia fare un test con esso, o come esempio per iniziare dal momento che presuppone l'esistenza di alcune chiavi RSA e un file di configurazione crittografato config.RSA
.
Quindi ecco alcune righe extra di codice aggiunte per creare chiavi RSA e un file di configurazione con cui giocare.
const fs = require('fs');
const NodeRSA = require('node-rsa');
/////////////////////////////
// Generate some keys for testing
/////////////////////////////
const examplekey = new NodeRSA({b: 2048});
fs.writeFileSync('private.key', examplekey.exportKey('pkcs8-private'));
fs.writeFileSync('public.key', examplekey.exportKey('pkcs8-public'));
/////////////////////////////
// Do this on the Machine creating the config file
/////////////////////////////
const configToStore = {Goodbye: 'Cruel world'};
let publickey = new NodeRSA();
publickey.importKey(fs.readFileSync('public.key', 'utf8'));
fs.writeFileSync('config.RSA', publickey.encrypt(configToStore, 'base64'), 'utf8');
/////////////////////////////
// Do this on the Machine consuming the config file
/////////////////////////////
let privatekey = new NodeRSA();
privatekey.importKey(fs.readFileSync('private.key', 'utf8'));
const config = privatekey.decrypt(fs.readFileSync('config.RSA', 'utf8'), 'json');
console.log('decrypted: ', config);
Crittografia dei soli valori
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Puoi decrittografare un file di configurazione con valori crittografati usando qualcosa del genere.
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
Con ogni elemento di configurazione su una riga separata (ad es. Hello
E Goodbye
sopra), Git riconoscerà meglio cosa sta succedendo in un file e memorizzerà le modifiche agli elementi di informazione come differenze piuttosto che come file completi. Git sarà anche in grado di gestire meglio le fusioni e le selezioni di ciliegie, ecc.
Tuttavia, più si desidera controllare le modifiche alle informazioni sensibili in una versione, più ci si sposta verso una soluzione di REPOSITORY SICURA (2) e si allontana da una soluzione di INFORMAZIONI CRIPTATE (3).