Der Umgang mit Passwörtern in Repositorys wird je nach genauem Problem unterschiedlich behandelt.
1. Tu es nicht.
Und Möglichkeiten, dies zu vermeiden, werden in einigen Antworten behandelt - .gitignore, config.example usw.
oder 2. Repository nur autorisierten Personen zugänglich machen
Dh Leute, die das Passwort kennen dürfen. chmod
und Benutzergruppen kommen in den Sinn; Auch Probleme wie sollten Github- oder AWS-Mitarbeiter sehen dürfen, wenn Sie Ihre Repositorys oder Server extern hosten?
oder 3. Verschlüsseln Sie die sensiblen Daten (Zweck dieser Antwort)
Wenn Sie Ihre Konfigurationsdateien, die vertrauliche Informationen (wie Kennwörter) enthalten, an einem öffentlichen Ort speichern möchten, müssen diese verschlüsselt werden. Die Dateien können bei der Wiederherstellung aus dem Repository entschlüsselt oder sogar direkt aus ihrer verschlüsselten Form verwendet werden.
Ein Beispiel für eine Javascript-Lösung zur Verwendung verschlüsselter Konfigurationsdaten ist unten dargestellt.
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);
So können Sie eine verschlüsselte Konfigurationsdatei wiederherstellen, in der nur wenige Zeilen Javascript geschrieben sind.
Beachten Sie, dass das Einfügen einer Datei config.RSA
in ein Git-Repository diese effektiv zu einer Binärdatei machen würde und daher viele der Vorteile von etwas wie Git verlieren würde, z. B. die Möglichkeit, Änderungen daran vorzunehmen.
Die Lösung hierfür könnte darin bestehen, Schlüsselwertpaare oder möglicherweise nur Werte zu verschlüsseln. Sie können alle Werte verschlüsseln, z. B. wenn Sie eine separate Datei für vertrauliche Informationen haben, oder nur die vertraulichen Werte verschlüsseln, wenn Sie alle Werte in einer Datei haben. (siehe unten)
Mein Beispiel oben ist für jeden, der einen Test damit durchführen möchte, oder als Beispiel für den Anfang, da davon ausgegangen wird, dass einige RSA-Schlüssel und eine verschlüsselte Konfigurationsdatei vorhanden sind, etwas nutzlos config.RSA
.
Hier sind einige zusätzliche Codezeilen, die zum Erstellen von RSA-Schlüsseln und einer Konfigurationsdatei zum Spielen hinzugefügt wurden.
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);
Nur Werte verschlüsseln
fs.writeFileSync('config.RSA', JSON.stringify(config,null,2), 'utf8');
Mit so etwas können Sie eine Konfigurationsdatei mit verschlüsselten Werten entschlüsseln.
const savedconfig = JSON.parse(fs.readFileSync('config.RSA', 'utf8'));
let config = {...savedconfig};
Object.keys(savedconfig).forEach(key => {
config[key] = privatekey.decrypt(savedconfig[key], 'utf8');
});
Mit jedem Konfigurationselement in einer separaten Zeile (z. B. Hello
und Goodbye
höher) erkennt Git besser, was in einer Datei vor sich geht, und speichert Änderungen an Informationen als Unterschiede und nicht als vollständige Dateien. Git wird auch in der Lage sein, Zusammenführungen und Cherry Picks usw. besser zu verwalten.
Je mehr Sie Änderungen an vertraulichen Informationen in der Versionskontrolle vornehmen möchten, desto mehr bewegen Sie sich in Richtung einer SAFE REPOSITORY-Lösung (2) und weg von einer ENCRYPTED INFO (3) -Lösung.