重要な設定ファイルをバージョン管理で維持しながら暗号化するのは、まさに正しいことです。あなたが言及したように、最良の解決策は、Gitが特定の機密ファイルをプッシュするときに透過的に暗号化して、ローカルで(つまり、証明書を持つ任意のマシンで)設定ファイルを使用できるようにすることですが、GitやDropboxなどの誰でもファイルをVCに保存しても、プレーンテキストで情報を読み取ることはできません。
プッシュ/プル中の透過的な暗号化/復号化に関するチュートリアル
この要旨https://gist.github.com/873637は、opensslでGitのsmudge / cleanフィルタードライバーを使用して、プッシュされたファイルを透過的に暗号化する方法のチュートリアルを示しています。初期設定を行うだけです。
仕組みの概要
基本的に、.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」で発生したことが常に表示されます。