Jak mogę bezpiecznie zapisać moje tajne klucze i hasło w moim systemie kontroli wersji?

134

Zachowuję ważne ustawienia, takie jak nazwy hostów i porty serwerów programistycznych i produkcyjnych w moim systemie kontroli wersji. Ale wiem, że trzymanie tajemnic (takich jak klucze prywatne i hasła do baz danych) w repozytorium VCS jest złą praktyką .

Jednak hasła - jak każde inne ustawienie - wydają się być wersjonowane. Więc co to jest właściwy sposób kontrolowania wersji haseł?

Wyobrażam sobie, że wymagałoby to trzymania sekretów w ich własnym pliku „ustawień sekretów” oraz szyfrowania tego pliku i kontrolowania wersji. Ale jakie technologie? A jak to zrobić poprawnie? Czy jest na to lepszy sposób?


Generalnie zadaję pytanie, ale w moim konkretnym przypadku chciałbym przechowywać tajne klucze i hasła do witryny Django / Python za pomocą git i github .

Również, idealnym rozwiązaniem byłoby zrobić coś magicznego kiedy wciskam / pull z git - na przykład, jeśli zaszyfrowany plik haseł zmienia skrypt jest uruchamiany, które pyta o hasło i deszyfruje go na miejsce.


EDIT: Dla jasności, ja jestem z prośbą o miejsce przechowywania produkcji tajemnice.

Chris W.
źródło
1
Właściwie przekaż trochę pieniędzy, aby całe repo było prywatne.
John Mee,
29
@JohnMee Właściwie już płacę za prywatne repozytorium, ale kwestia pozostaje - nie powinieneś przechowywać poufnych informacji w swoim repozytorium.
Chris W.,
1
Myślę, że większość powodów, dla których uzyskanie satysfakcjonujących odpowiedzi będzie trudne, jest fakt, że staroświeckie hasło w postaci zwykłego tekstu do połączenia z bazą danych jest reliktem mniej wrogiej epoki. Prawidłowa odpowiedź brzmi: „Twój kod nie powinien wymagać sekretu”, ale systemy, do których uzyskujesz dostęp, nie dają dużego wyboru.
msw
4
Czemu? Wersja kontrolująca hasła do usług zewnętrznych ma wartość zerową. Główną zaletą kontroli wersji jest to, że można przejrzeć historyczne wersje aplikacji, o których wiadomo, że działają, i je uruchomić . Jednak stare hasła są dla Ciebie bezużyteczne. Jeśli zostały odwołane, już nigdy nie będą działać.
Panika pułkownika
1
Możliwy duplikat: programmers.stackexchange.com/questions/205606/…
Użytkownik

Odpowiedzi:

100

Masz rację, chcąc zaszyfrować swój poufny plik ustawień, zachowując jednocześnie kontrolę wersji. Jak wspomniałeś, najlepszym rozwiązaniem byłoby takie, w którym Git w sposób przejrzysty zaszyfruje niektóre poufne pliki po ich wysłaniu, aby lokalnie (tj. Na dowolnym komputerze, który ma Twój certyfikat), możesz użyć pliku ustawień, ale Git lub Dropbox lub ktokolwiek jest przechowywanie plików w VC nie daje możliwości odczytania informacji w postaci zwykłego tekstu.

Samouczek dotyczący przezroczystego szyfrowania / deszyfrowania podczas wypychania / ściągania

W tym streszczeniu https://gist.github.com/873637 pokazano samouczek dotyczący korzystania z sterownika smudge / clean filter Git z openssl do przezroczystego szyfrowania przesłanych plików. Musisz tylko przeprowadzić wstępną konfigurację.

Podsumowanie tego, jak to działa

Zasadniczo będziesz tworzyć .gitencryptfolder zawierający 3 skrypty bash,

clean_filter_openssl 
smudge_filter_openssl 
diff_filter_openssl 

które są używane przez Git do deszyfrowania, szyfrowania i obsługi różnic Git. Główne hasło i sól (naprawione!) Są zdefiniowane w tych skryptach i MUSISZ upewnić się, że plik .gitencrypt nigdy nie zostanie przesłany. Przykładowy clean_filter_opensslskrypt:

#!/bin/bash

SALT_FIXED=<your-salt> # 24 or less hex characters
PASS_FIXED=<your-passphrase>

openssl enc -base64 -aes-256-ecb -S $SALT_FIXED -k $PASS_FIXED

Podobnie dla smudge_filter_open_ssli diff_filter_oepnssl. Zobacz Gist.

Twoje repozytorium z poufnymi informacjami powinno mieć plik .gitattribute (niezaszyfrowany i zawarty w repozytorium), który odwołuje się do katalogu .gitencrypt (który zawiera wszystko, czego Git potrzebuje do zaszyfrowania / odszyfrowania projektu w sposób przejrzysty) i który jest obecny na twoim lokalnym komputerze.

.gitattribute zawartość:

* filter=openssl diff=openssl
[merge]
    renormalize = true

Na koniec musisz również dodać następującą zawartość do swojego .git/configpliku

[filter "openssl"]
    smudge = ~/.gitencrypt/smudge_filter_openssl
    clean = ~/.gitencrypt/clean_filter_openssl
[diff "openssl"]
    textconv = ~/.gitencrypt/diff_filter_openssl

Teraz, gdy wypychasz repozytorium zawierające poufne informacje do zdalnego repozytorium, pliki zostaną zaszyfrowane w sposób przezroczysty. Podczas ściągania z komputera lokalnego, który ma katalog .gitencrypt (zawierający Twoje hasło), pliki zostaną odszyfrowane w sposób przezroczysty.

Uwagi

Powinienem zauważyć, że ten samouczek nie opisuje sposobu tylko zaszyfrowania poufnego pliku ustawień. Spowoduje to przezroczyste zaszyfrowanie całego repozytorium, które jest przesłane do zdalnego hosta VC i odszyfrowanie całego repozytorium, aby zostało całkowicie odszyfrowane lokalnie. Aby osiągnąć pożądane zachowanie, możesz umieścić poufne pliki dla jednego lub wielu projektów w jednym sensitive_settings_repo. Możesz zbadać, jak ta przezroczysta technika szyfrowania działa z podmodułami Git http://git-scm.com/book/en/Git-Tools-Submodules, jeśli naprawdę potrzebujesz, aby poufne pliki znajdowały się w tym samym repozytorium.

Użycie stałego hasła mogłoby teoretycznie prowadzić do luk w zabezpieczeniach siłowych, gdyby atakujący mieli dostęp do wielu zaszyfrowanych repozytoriów / plików. IMO, prawdopodobieństwo tego jest bardzo niskie. Jak wspomniano na dole tego samouczka, nieużywanie stałego hasła spowoduje, że lokalne wersje repozytorium na różnych maszynach będą zawsze pokazywać, że zmiany zaszły ze statusem „git”.

dgh
źródło
1
Och, bardzo interesujące. Brzmi to prawie dokładnie tak, jak chcę (z wyjątkiem szyfrowania całego repozytorium).
Chris W.
Możesz zachować wszystkie wrażliwe pliki ustawień dla wielu aplikacji w jednym zaszyfrowanym repozytorium lub dodać zaszyfrowane repozytorium z wrażliwymi ustawieniami do swojego projektu jako moduł podrzędny Git, jak opisano tutaj git-scm.com/book/en/Git-Tools-Submodules .
dgh
Przechowywanie haseł / ustawień produkcyjnych w (zaszyfrowanych) modułach podrzędnych nie jest rzadkością. stackoverflow.com/questions/11207284/… . Ułatwiłoby to nawet zarządzanie ustawieniami w różnych projektach.
dgh
Warto sprawdzić github.com/AGWA/git-crypt, aby uzyskać zaktualizowane rozwiązanie. Ma tę zaletę, że pozwala na zaszyfrowanie poszczególnych plików i twierdzi, że jest „dający się udowodnić semantycznie bezpieczny”. Sam autor sedna zasugerował, że to narzędzie jest lepsze, na github.com/shadowhand/git-encrypt .
geekley
52

Heroku popycha użycie zmiennych środowiskowych dla ustawień i tajnych kluczy:

Tradycyjne podejście do obsługi takich zmiennych konfiguracyjnych polega na umieszczeniu ich w źródle - w jakimś pliku właściwości. Jest to proces podatny na błędy i jest szczególnie skomplikowany w przypadku aplikacji typu open source, które często muszą utrzymywać oddzielne (i prywatne) gałęzie z konfiguracjami specyficznymi dla aplikacji.

Lepszym rozwiązaniem jest użycie zmiennych środowiskowych i trzymanie kluczy z dala od kodu. Na tradycyjnym hoście lub pracując lokalnie możesz ustawić zmienne środowiskowe w swoim bashrc. Na Heroku używasz zmiennych konfiguracyjnych.

Dzięki .envForemanowi i plikom Heroku zapewnia godny pozazdroszczenia zestaw narzędzi do eksportu, importu i synchronizacji zmiennych środowiskowych.


Osobiście uważam, że zapisywanie tajnych kluczy obok kodu jest niewłaściwe. Jest to zasadniczo niezgodne z kontrolą źródła, ponieważ klucze są przeznaczone dla usług zewnętrznych w kodzie . Jedynym dobrodziejstwem byłoby to, że programista może sklonować HEAD i uruchomić aplikację bez żadnej konfiguracji. Załóżmy jednak, że programista sprawdza historyczną wersję kodu. Ich kopia będzie zawierała hasło do bazy danych z zeszłego roku, więc aplikacja nie będzie działać w przypadku dzisiejszej bazy danych.

Dzięki powyższej metodzie Heroku programista może pobrać zeszłoroczną aplikację, skonfigurować ją przy użyciu dzisiejszych kluczy i pomyślnie uruchomić ją w dzisiejszej bazie danych.

Colonel Panic
źródło
1
Ta odpowiedź nie ma wystarczającej uwagi, ale większość pokrywa się ze sposobem Linuksa.
Nikolay Fominyh
11
Więc jeśli zmienne środowiskowe są ustawione w bashrc i wdrażasz nowy serwer, to co tworzy bashrc? Czy to nie wystarczy przenieść hasła z repozytorium kodu źródłowego do konfiguracji wdrożenia? (co przypuszczalnie znajduje się również w repozytorium kodu źródłowego, czy we własnym repozytorium?)
Jonathan Hartley
@JonathanHartley twój .bashrc nie powinien znajdować się w repozytorium kodu twojej aplikacji Django.
Steve
4
Przepraszam, mój komentarz jest niejednoznaczny, ale to dlatego, że jestem naprawdę zdezorientowany. Uwielbiam brzmienie punktu widzenia tej odpowiedzi, ale nigdy go w pełni nie rozumiałem. Jeśli wdrażam w kilku różnych środowiskach, z których każdy zawiera kilka hostów i być może kilka typów hostów, to oczywiście muszę zautomatyzować tworzenie plików .bashrc, które będą istnieć na każdym hoście, aby ustawić jego zmienne środowiskowe. Czy odpowiedź brzmi, że powinienem mieć drugie repozytorium, niezależne od mojego źródła, które zawiera wszystkie ustawienia, które staną się zmiennymi środowiskowymi w .bashrc po wdrożeniu?
Jonathan Hartley
1
Wystarczy je skonfigurować tylko raz NA KAŻDĄ maszynę, na której wdrażasz. Jeśli proces wdrażania polega na „uruchomieniu nowej maszyny i przetestowaniu, czy wszystko jest w porządku, zanim przekierujesz na nią ruch, a następnie strzelisz w głowę starej”, co jest najlepszą praktyką IMHO, to naprawdę musisz zautomatyzować tworzenie wszystkiego, co ustawia env vars.
Jonathan Hartley
16

Moim zdaniem najczystszym sposobem jest użycie zmiennych środowiskowych. Na przykład nie będziesz musiał zajmować się plikami .dist , a stan projektu w środowisku produkcyjnym byłby taki sam, jak na komputerze lokalnym.

Polecam przeczytanie rozdziału poświęconego konfiguracji aplikacji Twelve-Factor , pozostałe też, jeśli jesteś zainteresowany.

Samy Dindane
źródło
6
Wygląda na to, że zmienne środowiskowe są dobrym sposobem na uruchomienie aplikacji z tajnymi ustawieniami ... ale nadal nie odpowiada na pytanie, gdzie zachować te ustawienia.
Chris W.,
2
Zwykle powinieneś mieć plik README dla każdej aplikacji. Tam określ, które zmienne środowiskowe powinny zostać ustawione, i za każdym razem, gdy wdrażasz projekt, po prostu postępuj zgodnie z instrukcjami i ustaw każdą z nich. Możesz także utworzyć skrypt powłoki z wieloma export MY_ENV_VAR=, a podczas wdrażania po prostu wypełnij go odpowiednimi wartościami i sourcegotowe. Jeśli przez trzymanie masz na myśli wersję ustawień, nie powinieneś tego robić w pierwszej kolejności.
Samy Dindane
Głosujcie też za Aplikacją Dwunastu Czynników - naprawdę świetna rzecz.
Chris W.
4
@Samy: A jeśli zautomatyzowałeś wdrażanie?
Jonathan Hartley
3
@Samy Nadal nie rozumiem, jak zostaną ustawione zmienne środowiskowe. Strona aplikacji 12-składnikowej też tego nie wyjaśnia (chyba że jesteś na Heroku, którego nie jest moim obecnym projektem). Czy mówimy, że skrypt generujący musi zapytać centralny magazyn konfiguracji „Jestem maszyną X, proszę podaj moje dane konfiguracyjne ”, a to odpowiada wartościami zmiennych środowiskowych, które powinny zostać ustawione. W takim razie myślę , że nie potrzebujesz już wygenerowanego skryptu. Szaleńczo spekuluję tutaj, czy szczekam na właściwe drzewo?
Jonathan Hartley
10

Opcją byłoby umieszczenie poświadczeń związanych z projektem w zaszyfrowanym kontenerze (TrueCrypt lub Keepass) i przesłanie go.

Zaktualizuj jako odpowiedź z mojego komentarza poniżej:

Przy okazji ciekawe pytanie. Właśnie znalazłem to: github.com/shadowhand/git-encrypt, który wygląda bardzo obiecująco w przypadku automatycznego szyfrowania

schneck
źródło
Byłoby miło mieć coś, co mógłbym zautomatyzować. Taki, że jeśli mój zaszyfrowany plik hasła się zmieni, automatycznie odszyfruje nowy plik.
Chris W.,
7
Przy okazji ciekawe pytanie. Właśnie znalazłem to: github.com/shadowhand/git-encrypt, który wygląda bardzo obiecująco w przypadku automatycznego szyfrowania.
schneck
1
Wow świetne. Opis git-encryptbrzmi jak dokładnie to, czego szukam. „Podczas pracy ze zdalnym repozytorium git, które jest hostowane na serwerze pamięci masowej innej firmy, poufność danych czasami staje się problemem. W tym artykule przedstawiono procedury konfigurowania repozytoriów git dla których lokalne katalogi robocze są normalne (niezaszyfrowane), ale zatwierdzona zawartość jest zaszyfrowana. " (Oczywiście chcę tylko zaszyfrować część moich treści ...)
Chris W.,
@schneck zamieść swój komentarz jako odpowiedź, aby Chris mógł go zaakceptować - wygląda na to, że właśnie tego szuka.
Tony Abou-Assaleh
9

Sugeruję użycie do tego plików konfiguracyjnych i nie wersjonowanie ich.

Możesz jednak wersjonować przykłady plików.

Nie widzę problemu z udostępnianiem ustawień programistycznych. Z definicji nie powinien zawierać żadnych wartościowych danych.

TIK Tak
źródło
1
Ale gdzie przechowywać kanoniczne rekordy haseł? Denerwowałbym się, gdyby te dane znajdowały się tylko w pliku konfiguracyjnym na komputerze, który pewnego dnia może wybuchnąć.
Chris W.,
@ChrisW. Jeśli maszyna wybuchnie, nie potrzebujesz już hasła ... Jeśli jednak masz tylko jedną kopię danych na swojej maszynie produkcyjnej, powinno to wywołać czerwoną flagę. Ale to nie znaczy, że powinno być w VCS. Powinien istnieć RAID, pełne kopie zapasowe uzupełnione o przyrostowe kopie zapasowe na nośnikach magnetycznych i optycznych. Wiele korporacji ma procedurę kontroli zmian, która może dyktować, jak i gdzie przechowywać hasła i inne wrażliwe materiały również na papierze.
Steve Buzonas
@ChrisW Nie chcę być szorstki, ale wygląda na to, że nie mówisz nam prawdy, a hasła, które chcesz przechowywać, nie są używane w programowaniu, ale w produkcji. Czy to nie prawda? W przeciwnym razie, dlaczego zależy Ci na maszynach deweloperskich lub testowych i hasłach programistycznych? Nikt by tego nie zrobił.
tiktak
Przy okazji, w naszej firmie wszystkie hasła programistyczne są dostępne w wersji papierowej oraz w intranecie. Ponieważ nie mają wartości. Są tam, ponieważ oprogramowanie, które tworzymy, wymaga uwierzytelniania.
tiktak
@tiktak, masz rację - moje pytanie dotyczy tego, co zrobić z hasłami produkcyjnymi. Nie obchodzi mnie szczególnie przechowywanie haseł programistycznych w A VCS w postaci przejrzystej. Przepraszam, jeśli nie wyjaśniłem tego wystarczająco jasno.
Chris W.,
7

Czarna skrzynka został niedawno wydany przez StackExchange i chociaż jeszcze go nie używałem, wydaje się, że dokładnie rozwiązuje problemy i obsługuje funkcje wymagane w tym pytaniu.

Z opisu na https://github.com/StackExchange/blackbox :

Bezpiecznie przechowuj sekrety w repozytorium VCS (np. Git lub Mercurial). Te polecenia ułatwiają szyfrowanie GPG określonych plików w repozytorium, dzięki czemu są one „zaszyfrowane w spoczynku” w repozytorium. Jednak skrypty ułatwiają ich odszyfrowanie, gdy trzeba je wyświetlić lub edytować, i odszyfrować w celu wykorzystania w produkcji.

Chris W.
źródło
7

Odkąd zadałem to pytanie zdecydowałem się na rozwiązanie, z którego korzystam przy tworzeniu małej aplikacji z małym zespołem ludzi.

git-crypt

git-crypt używa GPG do przezroczystego szyfrowania plików, gdy ich nazwy pasują do określonych wzorców. Na przykład, jeśli dodasz do .gitattributespliku ...

*.secret.* filter=git-crypt diff=git-crypt

... potem plik taki jak config.secret.json będzie zawsze przesyłany do zdalnego repozytorium z szyfrowaniem, ale pozostanie niezaszyfrowany w lokalnym systemie plików.

Jeśli chcę dodać nowy klucz GPG (osobę) do twojego repozytorium, który może odszyfrować chronione pliki, uruchom git-crypt add-gpg-user <gpg_user_key>. Tworzy to nowe zatwierdzenie. Nowy użytkownik będzie mógł odszyfrować kolejne zatwierdzenia.

Chris W.
źródło
5

Generalnie zadaję pytanie, ale w moim konkretnym przypadku chciałbym przechowywać tajne klucze i hasła do witryny Django / Python za pomocą git i github.

Nie, po prostu nie rób tego, nawet jeśli jest to twoje prywatne repozytorium i nigdy nie zamierzasz go udostępniać, nie rób tego.

Powinieneś stworzyć plik local_settings.py, umieścić go na VCS ignore iw swoim settings.py zrobić coś takiego

from local_settings import DATABASES, SECRET_KEY
DATABASES = DATABASES

SECRET_KEY = SECRET_KEY

Jeśli ustawienia twoich sekretów są tak wszechstronne, chętnie powiem, że robisz coś nie tak

Hedde van der Heide
źródło
9
Ale nadal będę musiał gdzieś śledzić te sekrety . Np. Keypass czy coś w tym stylu, prawda?
Chris W.,
Regulacja i realizacja przechowywania danych osobowych zależy od polityki firmy, dla której realizowany jest projekt. Bardzo wątpię, że kod źródłowy projektu jest właściwym miejscem, ponieważ każdy tester lub programista będący stroną trzecią może je zobaczyć
Hedde van der Heide
4

EDYCJA: Zakładam, że chcesz śledzić poprzednie wersje haseł - powiedzmy, dla skryptu, który uniemożliwiłby ponowne użycie hasła itp.

Myślę, że GnuPG jest najlepszym rozwiązaniem - jest już używany w jednym projekcie związanym z git (git-Annex) do szyfrowania zawartości repozytorium przechowywanej w usługach w chmurze. GnuPG (gnu pgp) zapewnia bardzo silne szyfrowanie oparte na kluczach.

  1. Trzymasz klucz na swoim lokalnym komputerze.
  2. Dodajesz „moje hasło” do ignorowanych plików.
  3. Na haku przed zatwierdzeniem szyfrujesz plik mypassword do pliku mypassword.gpg śledzonego przez git i dodajesz go do zatwierdzenia.
  4. Po podłączeniu haka po prostu odszyfrowujesz mypassword.gpg do mypassword.

Teraz, jeśli twój plik „moje hasło” nie zmienił się, zaszyfrowanie da ten sam zaszyfrowany tekst i nie zostanie dodany do indeksu (brak redundancji). Najmniejsza modyfikacja mypassword skutkuje radykalnie innym zaszyfrowanym tekstem i mypassword.gpg w obszarze pomostowym bardzo różni się od tego w repozytorium, dlatego zostanie dodany do zatwierdzenia. Nawet jeśli napastnik zdobędzie twój klucz gpg, nadal musi złamać hasło. Jeśli atakujący uzyska dostęp do zdalnego repozytorium z zaszyfrowanym tekstem, może porównać kilka zaszyfrowanych tekstów, ale ich liczba nie będzie wystarczająca, aby dać mu jakąkolwiek istotną przewagę.

Później możesz użyć .gitattributes, aby zapewnić deszyfrowanie w locie w celu zakończenia git diff hasła.

Możesz także mieć oddzielne klucze dla różnych typów haseł itp.

pielgrzym
źródło
3

Zwykle oddzielam hasło jako plik konfiguracyjny. i oddal je.

/yourapp
    main.py
    default.cfg.dist

A kiedy uruchomię main.py, umieść prawdziwe hasło w default.cfgskopiowanym.

ps. kiedy pracujesz z git lub hg. możesz zignorować *.cfgpliki do utworzenia .gitignorelub.hgignore

podziwiać
źródło
Pliki .dist to to, o czym mówiłem: przykłady prawdziwych plików konfiguracyjnych. Dobrą praktyką jest to, że powinno być możliwe uruchomienie oprogramowania tylko poprzez zmianę nazwy poprzez usunięcie rozszerzenia „.dist” (lub lepiej: kopiowanie), to znaczy, że powinieneś móc wypróbować oprogramowanie w kilka sekund, bez konieczności konfigurowania go podczas cały dzień.
tiktak
3

Zapewnij sposób na zastąpienie config

Jest to najlepszy sposób zarządzania zestawem rozsądnych ustawień domyślnych dla sprawdzanej konfiguracji bez konieczności jej kompletności lub zawierającej takie elementy, jak nazwy hostów i poświadczenia. Istnieje kilka sposobów na zastąpienie domyślnych konfiguracji.

Zmienne środowiskowe (jak już wspominali inni) są jednym ze sposobów na zrobienie tego.

Najlepszym sposobem jest poszukanie zewnętrznego pliku konfiguracyjnego, który zastępuje domyślne wartości konfiguracyjne. Pozwala to na zarządzanie zewnętrznymi konfiguracjami za pośrednictwem systemu zarządzania konfiguracją, takiego jak Chef, Puppet lub Cfengine. Zarządzanie konfiguracją jest standardową odpowiedzią w przypadku zarządzania konfiguracjami niezależnie od bazy kodu, więc nie musisz wykonywać wydania, aby zaktualizować konfigurację na jednym hoście lub w grupie hostów.

Do Twojej wiadomości: Szyfrowanie danych nie zawsze jest najlepszą praktyką, szczególnie w miejscach o ograniczonych zasobach. Może się zdarzyć, że szyfrowanie kredytów nie zapewni Ci dodatkowego ograniczenia ryzyka i po prostu doda niepotrzebną warstwę złożoności. Upewnij się, że wykonałeś odpowiednią analizę przed podjęciem decyzji.

dietbuddha
źródło
2

Zaszyfruj plik haseł, używając na przykład GPG. Dodaj klucze na komputerze lokalnym i na serwerze. Odszyfruj plik i umieść go poza folderami repozytoriów.

Używam pliku passwords.conf, znajdującego się w moim folderze domowym. Przy każdym wdrożeniu ten plik jest aktualizowany.

Willian
źródło
Następnie oprogramowanie musi odszyfrować plik hasła.
tiktak
Cóż, tylko podczas wdrażania witryny hasło zostaje odszyfrowane i zapisane w zwykłym pliku tekstowym z hasłami
Willian.
2

Nie, klucze prywatne i hasła nie podlegają kontroli wersji. Nie ma powodu, aby obciążać wszystkich dostępem do odczytu do repozytorium znajomością poufnych danych uwierzytelniających usług używanych w produkcji, podczas gdy najprawdopodobniej nie wszyscy powinni mieć dostęp do tych usług.

Począwszy od Django 1.4, Twoje projekty Django są teraz dostarczane z project.wsgimodułem, który definiuje applicationobiekt i jest to idealne miejsce, aby zacząć wymuszać użycie project.localmodułu ustawień, który zawiera konfiguracje specyficzne dla witryny.

Ten moduł ustawień jest ignorowany podczas kontroli wersji, ale jego obecność jest wymagana podczas uruchamiania instancji projektu jako aplikacji WSGI, co jest typowe dla środowisk produkcyjnych. Tak to powinno wyglądać:

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.local")

# This application object is used by the development server
# as well as any WSGI server configured to use this file.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Teraz możesz mieć local.pymoduł, którego właściciela i grupę można skonfigurować tak, aby tylko upoważniony personel i procesy Django mogły odczytywać zawartość pliku.

Filip Dupanović
źródło
2

Jeśli potrzebujesz VCS dla swoich sekretów, powinieneś przynajmniej przechowywać je w drugim repozytorium oddzielonym od twojego rzeczywistego kodu. Możesz więc dać członkom swojego zespołu dostęp do repozytorium kodu źródłowego, tak aby nie widzieli Twoich poświadczeń. Ponadto umieść to repozytorium w innym miejscu (np. Na własnym serwerze z zaszyfrowanym systemem plików, a nie na github) i aby sprawdzić je w systemie produkcyjnym, możesz użyć czegoś takiego jak git-submodule .

Bernhard Vallant
źródło
1

Innym podejściem mogłoby być całkowite uniknięcie zapisywania sekretów w systemach kontroli wersji i zamiast tego użycie narzędzia takiego jak repozytorium z hashicorp , tajnego magazynu z rolowaniem klucza i audytem, ​​z interfejsem API i wbudowanym szyfrowaniem.

Kai Peters
źródło
1

Tym się właśnie zajmuję:

  • Zachowaj wszystkie sekrety jako zmienne env w $ HOME / .secrets (go-r perms), które źródła $ HOME / .bashrc (w ten sposób, jeśli otworzysz .bashrc przed kimś, nie zobaczą sekretów)
  • Pliki konfiguracyjne są przechowywane w VCS jako szablony, takie jak config.properties przechowywane jako config.properties.tmpl
  • Pliki szablonów zawierają symbol zastępczy dla klucza tajnego, na przykład:

    my.password = ## MOJE_HASŁO ##

  • Podczas wdrażania aplikacji uruchamiany jest skrypt, który przekształca plik szablonu w plik docelowy, zastępując symbole zastępcze wartościami zmiennych środowiskowych, na przykład zmieniając ## MY_PASSWORD ## na wartość $ MOJE_HASŁO.

Pavel Chernikov
źródło
0

Możesz użyć EncFS, jeśli twój system to zapewnia. W ten sposób możesz zachować zaszyfrowane dane jako podfolder repozytorium, jednocześnie zapewniając aplikacji odszyfrowany widok danych zamontowanych na bok. Ponieważ szyfrowanie jest przezroczyste, nie są potrzebne żadne specjalne operacje w przypadku ściągania lub wypychania.

Wymagałoby to jednak zamontowania folderów EncFS, co może zrobić Twoja aplikacja na podstawie hasła przechowywanego w innym miejscu poza wersjonowanymi folderami (np. Zmienne środowiskowe).

dronus
źródło