変更要約: AZ-400 第2章を深掘り(比較表・シナリオ・FAQ・ひっかけ・深掘り段落を各節に追加、図を日本語版に対応)
2.3リポジトリ管理とセキュリティ
リポジトリの統制——アクセス権限、大きなファイル(Git LFS)、サブモジュール、シークレットスキャン、モノレポ vs マルチレポ——を理解します。健全で安全なリポジトリを維持します。
リポジトリは健全さと安全さを保ちます。権限、巨大ファイル、シークレット混入を管理し、構成(モノ/マルチ)を選びます。
2.3.1リポジトリの管理
- アクセス権限:読み取り/コントリビュート/管理を最小権限で付与する。
- Git LFS:大きなバイナリを管理し、リポジトリの肥大化を防ぐ。
- シークレットスキャン:コミットに混入したAPIキー等を検出(プッシュ保護で push 自体を阻止)。
- モノレポ vs マルチレポ:単一で統合容易 か 独立で疎結合 かをチーム構造で選ぶ。
「巨大バイナリ=Git LFS」「コミットの機密混入検出=シークレットスキャン/プッシュ保護」「権限は最小権限」「構成=モノレポ(統合容易)/マルチレポ(独立)」 は AZ-400 で頻出です。誤ってキーをコミットしてしまった場合は履歴からの削除+キーのローテーションが必要です。
AZ-400 のリポジトリ管理は「健全性・セキュリティ・構成の選択」を問います。アクセス権限は最小権限で、Azure DevOps なら読み取り/コントリビュート/管理、GitHub なら Read/Triage/Write/Maintain/Admin をチーム/個人に付与し、保護ブランチへの直接 push 権限は絞ります。巨大バイナリは Git LFS(実体を別ストレージに置きポインタだけ追跡)で扱い、リポジトリの肥大化とクローン遅延を防ぎます。複数リポジトリの共有コードは、サブモジュール(特定コミットを参照、密結合で扱いがやや煩雑)かパッケージ化(Artifacts/npm/NuGet 等でバージョン配布、疎結合で推奨)で管理します。セキュリティの要はシークレットの混入防止で、シークレットスキャン+プッシュ保護(検出時に push 自体を拒否)でコミット前/時点に阻止し、万一漏れた場合は履歴からの削除(git filter-repo/BFG)だけでなく必ずキーをローテーション(無効化)します——一度公開された秘密は履歴を消しても漏洩済みだからです。依存関係の脆弱性(Dependabot 等)やコードスキャン(SAST)もパイプラインに組み込みます。構成は、モノレポ(横断的な変更・統一 CI・コード共有が容易だが大規模化に工夫)とマルチレポ(チーム独立・権限分離・疎結合だが横断変更が手間)をチーム構造で選びます。設計の要は、最小権限・LFS・シークレット保護(スキャン+ローテーション)・構成選択を組み合わせ、リポジトリを安全かつスケーラブルに保つことです。
| 課題 | 対策 | 要点 |
|---|---|---|
| 権限管理 | 最小権限のロール付与 | 保護ブランチへの直接 push を制限 |
| 巨大バイナリ | Git LFS | ポインタ+別ストレージ・肥大化防止 |
| 機密の混入 | シークレットスキャン+プッシュ保護 | 検出で push 拒否・漏洩時はローテーション必須 |
| リポジトリ構成 | モノレポ / マルチレポ | 統合容易 / 独立・疎結合 |
シナリオ:開発者が誤って本番 API キーをコミットし、リモートに push してしまった。最小限かつ正しい対応は?→
①即座にキーをローテーション(無効化して再発行)——これが最優先(一度 push された秘密は漏洩済み)。
②履歴から削除(git filter-repo/BFG で当該ブロブを除去し強制 push)。
③再発防止にシークレットスキャンのプッシュ保護を有効化し、機密はコードに置かず Key Vault/変数グループ(シークレット)から参照する運用に切り替えます。
FAQ:モノレポとマルチレポはどちらを選ぶ? 横断的なリファクタやコード共有が多く、統一した CI/依存管理をしたいならモノレポ(ただし大規模化時はスパースチェックアウトやビルドキャッシュの工夫が要る)。チームやサービスを独立して所有・リリースし、権限を分離したいならマルチレポ。組織やコンウェイの法則(チーム構造)に合わせて選び、共有コードはパッケージ化で疎結合に保つのが定石です。
ひっかけ:漏洩したキーへの対応を「履歴から削除すれば十分」とするのは誤り——push された時点で漏洩済みのため、必ずローテーション(無効化)が必要です。また巨大バイナリ問題を「.gitignore に入れる」だけで解決しようとするのも不十分で、リポジトリで版管理したいバイナリは Git LFS を使います。シークレットの恒久対策は、混入検出(スキャン)+外部のシークレットストア参照です。
2.3.2この節のまとめ
- 管理=最小権限+Git LFS(巨大ファイル)
- 安全=シークレットスキャン/プッシュ保護/構成=モノ/マルチレポ
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. 大きなバイナリ(動画やビルド成果物)をリポジトリに含めつつ肥大化を防ぎたい。何を使いますか?
Q2. API キーやパスワードが誤ってコミットされるのを、push の段階で検出・阻止したい。何を使いますか?
Q3. 誤って API キーを過去のコミットに含めてしまった。最低限すべき対応はどれですか?

