ファイルをバージョン管理で維持しながら、機密設定ファイルを暗号化したいというのはまさに正しいことです。あなたが言及したように、最良の解決策は、Gitが特定の機密ファイルをプッシュするときに透過的に暗号化し、ローカルで(つまり、証明書を持つ任意のマシンで)設定ファイルを使用できるようにすることですが、GitまたはDropboxまたは誰でもファイルを VC に保存しても、情報を平文で読み取ることはできません。
プッシュ/プル中の透過的な暗号化/復号化に関するチュートリアル
この gist https://gist.github.com/873637は、Git の smudge/clean フィルター ドライバーを openssl で使用して、プッシュされたファイルを透過的に暗号化する方法に関するチュートリアルを示しています。初期設定を行うだけです。
仕組みのまとめ
基本的に、.gitencrypt
3 つの bash スクリプトを含むフォルダーを作成します。
clean_filter_openssl
smudge_filter_openssl
diff_filter_openssl
これらは、復号化、暗号化、および Git diff のサポートのために Git によって使用されます。マスター パスフレーズとソルト (修正済み!) はこれらのスクリプト内で定義されており、.gitencrypt が実際にプッシュされないようにする必要があります。clean_filter_openssl
スクリプト例:
#!/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
smudge_filter_open_ssl
と についても同様ですdiff_filter_oepnssl
。要点を参照してください。
機密情報を含むリポジトリには、ローカル マシンに存在する .gitencrypt ディレクトリ (Git がプロジェクトを透過的に暗号化/復号化するために必要なすべてを含む) を参照する .gitattribute ファイル (暗号化されておらず、リポジトリに含まれる) が必要です。
.gitattribute
コンテンツ:
* filter=openssl diff=openssl
[merge]
renormalize = true
.git/config
最後に、次のコンテンツをファイルに追加する必要もあります
[filter "openssl"]
smudge = ~/.gitencrypt/smudge_filter_openssl
clean = ~/.gitencrypt/clean_filter_openssl
[diff "openssl"]
textconv = ~/.gitencrypt/diff_filter_openssl
これで、機密情報を含むリポジトリをリモート リポジトリにプッシュすると、ファイルが透過的に暗号化されます。.gitencrypt ディレクトリ (パスフレーズを含む) を持つローカル マシンからプルすると、ファイルは透過的に復号化されます。
ノート
このチュートリアルでは、機密設定ファイルのみを暗号化する方法については説明していないことに注意してください。これにより、リモート VC ホストにプッシュされるリポジトリ全体が透過的に暗号化され、リポジトリ全体が復号化されるため、完全にローカルで復号化されます。必要な動作を実現するために、1 つまたは複数のプロジェクトの機密ファイルを 1 つのsensitive_settings_repo に配置できます。機密ファイルを同じリポジトリに置く必要がある場合は、この透過的な暗号化技術が Git サブモジュールhttp://git-scm.com/book/en/Git-Tools-Submodulesでどのように機能するかを調べることができます。
攻撃者が多くの暗号化されたリポジトリ/ファイルにアクセスできる場合、固定パスフレーズを使用すると、理論的にはブルート フォース脆弱性につながる可能性があります。IMO、これの可能性は非常に低いです。このチュートリアルの最後にあるメモに記載されているように、固定パスフレーズを使用しないと、異なるマシン上にリポジトリのローカル バージョンが作成され、変更が発生したことが常に「git status」で示されます。