プロファイルは同時に二つの役割を果たします。接続設定を記録することと、実際に機能する資格情報のまとまりを運ぶことです。ファイルの拡張子は、手にしているのがどちらなのかを何も教えてくれません。リポジトリに属すると判断する前に、中身を読んでください。

以下の手順は、クライアントのテンプレートをバージョン管理の対象として検討している状況を前提としています。順番に実行し、取り消せないものをコミットする前に止まってください。

ステージしようとしているファイルを読む

実際のバイト列から始めます。別のファイルを参照するプロファイルは、それらを埋め込むものとはまったく違って見えるからです。PEM ブロックの目印と、ca、cert、key、tls-auth、tls-crypt という名前のインラインタグを検索すれば、同じ走査でどちらの場合も分かります。暗号化された秘密鍵も依然として機微な素材であり、共有の tls-auth や tls-crypt の鍵は、利用者の身元ではなくても資格情報です。プロファイルと一緒にステージされるものすべてに同じ確認を適用してください。資格情報ファイルを参照するアーカイブやセットアップ用スクリプトも含みます。

次に、作業ツリーではなくステージされた集合を見ます。git diff --cached はコミットに実際に何が入るかを示し、この判断で意味を持つのはその版だけです。

リポジトリが配布してよいものを決める

テンプレートは、共有されて確認済みの設定と、人が登録時に受け取るものすべてのための名前付きプレースホルダーを運べます。運べないのは使える身元です。リポジトリは読める全員に配布され、自動化もそこに含まれるからです。非公開のリポジトリは対象を狭めますが、各読者がその資格情報について権限を持つかという問いを変えはしません。

無視の規則は将来の追加を防ぎますが、すでに記録されたものには何もしません。この非対称性は、十回目のコミットの後ではなく最初の前にこそ腹に落としておく価値があります。インフラストラクチャの名前とアドレスは別の判断です。認証の秘密ではありませんが、チームが公表するつもりのない情報を明かすことがあります。すべての行をパスワードか公開かに振り分けるのではなく、その判断を明示的に下してください。

素材がすでに履歴にある場合

新しいコミットでその行を消しても、取得した人には古い版がそのまま残ります。露出は現実のものとして扱ってください。資格情報の種類を特定し、それを無効にできる機関を探します。クライアント証明書は失効され、失効リストが再生成されます、また共有の制御チャネル鍵は、サーバーとそれを使うすべてのクライアントで交換されます。

両者の影響範囲は大きく異なり、計画は始める前にどちらを実行するのかを明示すべきです。素材を持ち込んだコミットを git log --all -S 'BEGIN PRIVATE KEY' のような検索で特定し、後片付けの範囲を推測ではなく既知にします。同僚のクローンやフォークがすでに古いオブジェクトを保持していることがあるため、失効が先で後片付けが後になります。

封じ込めてから初めて後片付けする

履歴の書き換えは、編集したコミットより後のすべてのコミットを変えるので、まずリポジトリの所有者とそこで働く人たちの合意が必要です。強制プッシュは修理ではありません。独自の巻き戻しリスクを伴う調整の出来事です。日程を決め、バックアップを取り、いつ行うかをチームに伝えてください。

その後は、ツールの要約を信じるのではなく、現在のツリーと残った履歴を検証してください。

結果は二つの成果物として残します。共有しても安全なテンプレートと、登録の過程で発行された資格情報の一覧です。どちらも、使える身元がリポジトリに住むことを求めません。

この分離こそが本当の修正であり、次にプロファイルをコミットしたがる人にも耐えます。

関連記事