バージョン管理バックエンドファイルシステムの使用
VCS ベースのバックエンド(git、svn)を使用すると、ファイルがチェックアウトされるか、ローカルファイルシステムに複製されます。デフォルトでは、プレフィックスが config-repo- のシステム一時ディレクトリに配置されます。たとえば、Linux では、/tmp/config-repo-<randomid> の場合があります。一部のオペレーティングシステムは、一時ディレクトリを定期的にクリーンアップ (英語) します。これにより、プロパティの欠落など、予期しない動作が発生する可能性があります。この問題を回避するには、spring.cloud.config.server.git.basedir または spring.cloud.config.server.svn.basedir をシステムの一時構造に存在しないディレクトリに設定して、ConfigServer が使用するディレクトリを変更します。 |
ローカルパス強化
バージョン管理バックエンド(Git または SVN)がローカルファイルシステムにアクセスする際、time-of-check/time-of-use(TOCTOU)攻撃や意図しないシンボリックリンクの動作を軽減するために、追加のチェックが適用されます。これらの対策は、通常のホストセキュリティ強化(ファイルシステムのアクセス許可、専用サービスアカウント、ワールド書き込み不可の親ディレクトリなど)を補完するものであり、それらに取って代わるものではありません。
file:リポジトリ URISCM クライアントが
file:リポジトリを開く前に、サーバーは設定されたパスを解決し、リポジトリのルートまたは中間パスコンポーネントで見つかったシンボリックリンクを拒否します。パスの各セグメントはLinkOption.NOFOLLOW_LINKSで個別にチェックされるため、リーフではなく親ディレクトリにシンボリックリンクを配置しても回避できません。Git の場合、リポジトリのルート内の.gitエントリは、シンボリックリンクではなく実際のディレクトリであることも追加で検証されます。すべてのfile:URI に対して、具体的なシンボリックリンクではないディレクトリパスを設定してください。- 作業ディレクトリと
basedir(spring.cloud.config.server.[git|svn].basedir) サーバーが
basedirにクローンまたはチェックアウトする際、空のリーフディレクトリを準備します (そのパスにある以前のシンボリックリンクを削除するなど)。次に、排他的な OS レベルのディレクトリ作成を使用してリーフを作成します。これにより、パスの同時置換が発生した場合、SCM 操作がサイレントにリダイレクトされるのではなく、エラーとして表示されます。古いコンテンツは、再帰的な削除中にディレクトリシンボリックリンクをたどらずに削除されます。解決されたbasedirパスは、同時パス置換のウィンドウを狭めるために、SCM クライアントを呼び出す直前に再検証されます。SVN の場合、作業ディレクトリとその.svnメタデータディレクトリも、各更新操作の前に再検証されます。- 一時ディレクトリのクリーンアップ
basedirが自動的に作成される場合(明示的な値が設定されていない場合のデフォルト値)、プロセス終了時にbasedirを削除するための JVM シャットダウンフックが登録されます。このフックはシンボリックリンクに安全な再帰的削除を使用します。つまり、ディレクトリのシンボリックリンクをたどらず、処理を進める前にbasedir自体がシンボリックリンクに置き換えられていないかを確認します。シンボリックリンクによる置き換えが検出された場合、削除されるのはシンボリックリンクのみであり、意図した一時ディレクトリ以外のファイルは影響を受けません。