株式会社renue
AI導入・DXの悩みをプロに相談してみませんか?
AIやDXに関する悩みがありましたら、お気軽にrenueの無料相談をご利用ください。 renueのAI支援実績、コンサルティングの方針や進め方をご紹介します。
ソースコード納品前のセキュリティ検品とは?なぜ「grep一発」では不十分なのか
受託開発やPoC開発において、ソースコードをクライアントに納品する場面は頻繁に発生します。しかし、開発中のコードベースには社名、個人の開発環境パス、APIキー、データベース接続文字列、Azure/AWSリソース名、案件名など、本来クライアントに渡してはならない情報が散在しています。
2025年には、公開GitHubリポジトリだけで2,900万件の新しいハードコードされたシークレットが発見されており、前年比34%増という過去最大の増加を記録しました。2022年に確認されたシークレットの64%は、4年後の現在もなお悪用可能な状態で残っています。
本記事では、ソースコード納品前に実施すべきセキュリティ検品(コードサニタイズ)の手法を、実際の開発現場で使われるチェックリストと具体的な作業手順に基づいて解説します。
納品前に除去すべき7カテゴリの情報
ソースコード納品前のサニタイズで対象となる情報は、大きく7つのカテゴリに分類できます。
1. 企業固有情報(社名・組織名)
開発会社の社名がコードベース全体に散在しているケースは非常に多く見られます。
- ロガー名:
logger = getLogger("mycompany.service") - docstring・コメント:
# Created by MyCompany Inc. - 環境変数テンプレート:
.env.example内のサンプル値 - Terraform変数名:
mycompany_vpn_ip→client_vpn_ipに変更
Terraform変数名のリネームは、tfstateへの影響を事前に確認する必要があります。.github/、.tfvars、CI/CDからの-var参照がないことを確認してから実施します。
2. クレデンシャル・シークレット
- APIキー:OpenAI、Anthropic、Azure等のAPIキー
- データベース接続文字列:
DB_URL=mysql+pymysql://user:password@host:3306/db - デフォルトパスワード:docker-compose.ymlのフォールバック値(
rootpassword等) - KeyVault名・リソース名:Azure KeyVaultの実名
- Terraformのtfplanファイル:commit済みのtfplanにはクレデンシャルが含まれる場合がある
特に注意すべきは、commit済みのtfplanファイルです。実際の開発現場で、コミットされたtfplanファイルの中身を確認したところ、複数のクレデンシャルが含まれていたという事例が報告されています。
3. 個人開発環境パス
/Users/developer_name/Desktop/project/...C:\Users\developer_name\Documents\...
これらは開発者の氏名を含む場合があり、個人情報保護の観点からも除去が必要です。
4. 案件固有情報(プロジェクトコード・クライアント名)
- 変数名に含まれる案件名:
toyota_failure_data→analysis_data - コメント内の案件コード
- テストデータに含まれる実企業名
5. インフラリソース名
- Azure Resource Group名、ACR名
- AWS S3バケット名、Lambda関数名
- GCPプロジェクトID
6. 不要なAPI設定項目
- コードから参照されていないAPI設定(例:PROMPTLAYER等の実験用サービス)
- 開発時にのみ使用したデバッグ用エンドポイント設定
7. テスト・デバッグ用の残留コード
- デバッグページの表示制御コード
- テスト用ユーザー作成スクリプト
- 開発用のseedデータ
3コミット構成のサニタイズ作業手順
効率的にサニタイズを進めるため、変更対象をレイヤー別に3つのコミットに分割します。レイヤーごとに分けることで、レビュー時に「この変更はどの層に影響するか」が明確になります。
コミット1:アプリケーションコード・環境変数テンプレート
最もリスクの高い層から着手します。
- ロガー名の匿名化
- auth設定のdocstringからの社名除去
- 各
.env.example内のデフォルト値をプレースホルダーに置換 docker-compose.ymlのデフォルトパスワードフォールバック値の削除
なぜフォールバック値を削除するか:.env未設定時に弱いパスワードで起動できてしまう状態は、クライアント環境でのセキュリティリスクとなります。
コミット2:ドキュメント
docs/配下のサンプル値(メールアドレス、KeyVault名、FQDN、個人パス)をプレースホルダーに統一- README内の実環境URLをダミーに置換
コミット3:インフラ・スクリプト
terraform/内の変数名・リソース名から社名を除去scripts/内のハードコードパスとフォールバック値をプレースホルダーに変更
grepベースの完了検証
サニタイズ作業の完了条件は、grepで残存がゼロ件になることです。以下のパターンを検索します。
| 検索対象 | grepパターン例 | 許容される残存 |
|---|---|---|
| 社名 | grep -ri "mycompany" --include="*.{py,ts,yml,md,tf}" | 0件 |
| 案件名 | grep -ri "project_code_name" | 0件 |
| 個人パス | grep -ri "/Users/" --include="*.{py,ts,yml}" | 0件(ドキュメント内のプレースホルダーは除く) |
| デフォルトパスワード | grep -ri "rootpassword\|password123" | 0件 |
| APIキー形式 | grep -rE "sk-[a-zA-Z0-9]{20,}\|AKIA[A-Z0-9]{16}" | 0件 |
スコープ外の判断基準
すべてのファイルをサニタイズ対象にすると、作業量が膨大になります。以下の判断基準でスコープを制御します。
スコープ外とすべきもの
data/配下の実データ:顧客の実データ(故障記録、機器リスト等)は匿名化ではなく「納品物から除外」で対応- ロックファイル内の案件名:
# viaコメントのみで動作に無関係。パッケージマネージャの再実行で自然に消える - デバッグページの除去:ページ定義の削除は機能変更を伴うため、別PRで対応
「変更はプレースホルダー置換のみ。ロジックには触れない」原則
サニタイズ作業では、ロジックの変更は一切行わないことが重要です。ロジック変更とサニタイズを同じコミットに混ぜると、レビューの負荷が跳ね上がり、デグレードのリスクも高まります。
シークレット検出ツールの活用
手動のgrepだけでは見落としが発生します。専用のシークレット検出ツールを併用することを推奨します。
主要ツール比較(2026年版)
| ツール | 特徴 | 検出精度 | 用途 |
|---|---|---|---|
| GitGuardian | 450以上の専用検出器、ML搭載の汎用検出 | 85-95% | CI/CD統合、リポジトリ全体スキャン |
| TruffleHog | OSSで利用可能、Git履歴全体をスキャン | 中〜高 | コミット履歴のレトロスキャン |
| GitHub Secret Scanning | GitHub標準搭載、プッシュ時に自動検出 | 高(パートナーパターン) | プッシュブロック、アラート |
| gitleaks | 軽量OSS、CIパイプライン組み込み容易 | 中 | pre-commitフック |
Prevention-Firstアプローチ
先進的な組織は「検出→修正」ではなく「最初からシークレットを混入させない」Prevention-Firstアプローチを採用しています。このアプローチを採用した組織では、誤検知率5%以下を維持し、リーク率を70-90%削減しています。
具体的には以下を実装します。
- pre-commitフックでのスキャン:コミット前にローカルでシークレットを検出
- CI/CDパイプラインでのスキャン:PR作成時に自動検出し、マージをブロック
- シークレットマネージャーの標準化:HashiCorp Vault、AWS Secrets Manager、1Password CLIでシークレットを一元管理
Terraform変数リネームの安全な手順
インフラコードのサニタイズで最もリスクが高いのが、Terraform変数名の変更です。変数名を変えるとtfstateとの不整合が発生する可能性があります。
事前確認チェックリスト
- .tfvarsファイルの確認:変更する変数名が
.tfvarsで参照されていないか - CI/CDの確認:
-varフラグで外部から値を渡していないか - GitHub Actionsの確認:
.github/workflows/内で変数名を参照していないか - tfstateの確認:変数がリソース属性(resource name等)に使われている場合、リソースの再作成が発生する可能性がある
変数がローカル変数や設定値としてのみ使われている場合(例:VPN IPアドレスの変数名をmycompany_vpn_ip→client_vpn_ipに変更)、tfstateへの影響はありません。
docker-compose.ymlのサニタイズ
コンテナ化された開発環境では、docker-compose.ymlに機密情報が集中します。
よくある問題パターン
- デフォルトパスワードのフォールバック:
${DB_PASSWORD:-rootpassword}→.env未設定で弱いパスワードが使われる - ACR認証情報のハードコード:ACRのログイン情報がスクリプト内に直書き
- ボリュームマウントのパス:開発者のローカルパスが残っている
推奨対応
- フォールバック値を削除し、
.env必須にする .env.exampleにプレースホルダーと説明コメントを記載- ボリュームパスを相対パスに統一
AIエージェントを活用したサニタイズ効率化
AIコーディングエージェントを活用することで、サニタイズ作業を大幅に効率化できます。
AIに依頼する際のプロンプト設計
サニタイズ作業をAIに依頼する際は、以下の構造で指示します。
- スコープの明確化:対象ディレクトリ、除外対象を明示
- 「ロジックに触れない」制約の明記:プレースホルダー置換・削除・リネームのみ
- 完了条件の定義:grepで残存ゼロを完了条件として明示
- コミット分割の指示:レイヤー別(アプリ→ドキュメント→インフラ)に分割
業務をトレースし、各ステップの依存関係を理解してから自動化に取り組むことが重要です。「コードサニタイズを自動化」と言っても、どのファイルのどの情報を何に置換するかを事前に定義しなければ、漏れや誤置換が発生します。
AIエージェント活用の注意点
- AIにコードを渡す際のリスク:AIサービスにソースコードを送信する行為自体が、機密情報の外部送信となる可能性がある。エンタープライズプランやオンプレミスLLMの利用を検討
- AIの置換ミス:AIが文脈を誤解し、正常なコードまで書き換えるリスクがある。必ず差分レビューを実施
納品前セキュリティ検品チェックリスト
| チェック項目 | 確認方法 | 完了基準 |
|---|---|---|
| 社名・組織名の除去 | grep -ri "社名" | 残存0件 |
| 案件名・プロジェクトコードの除去 | grep -ri "案件名" | 残存0件 |
| 個人開発環境パスの除去 | grep -ri "/Users/" | 残存0件 |
| デフォルトパスワードの除去 | grep -ri "password" *.yml *.yaml | フォールバック値0件 |
| APIキー・トークンの除去 | シークレット検出ツール実行 | 検出0件 |
| tfplanファイルの除外 | git ls-files *.tfplan | 残存0件 |
| インフラリソース名の匿名化 | grep -ri "リソース名パターン" | 残存0件 |
| 不要API設定の除去 | コード参照確認 | 未使用設定0件 |
| .env.exampleの整備 | プレースホルダー確認 | 実値0件 |
| テストデータの確認 | 実企業名・実データ確認 | 実データ0件 |
| Git履歴の確認 | gitleaks / TruffleHog実行 | 歴史的シークレット0件 |
| ビルド確認 | yarn build / docker build | エラー0件 |
まとめ:サニタイズは「最後の作業」ではなく「プロセスに組み込む」
ソースコード納品前のセキュリティ検品は、プロジェクト終盤の「最後のタスク」として扱われがちですが、それでは漏れが生じます。理想的には、以下のようにプロセスに組み込みます。
- 開発開始時:
.env.exampleをプレースホルダーで作成、.gitignoreでシークレット系ファイルを除外 - 開発中:pre-commitフックでシークレット混入を防止、CI/CDでスキャン
- 納品前:本記事のチェックリストに基づくサニタイズ実施、レイヤー別コミット
- 納品後:commit済みのシークレットがあった場合は即座にローテーション
「後から消す」のではなく「最初から入れない」。Prevention-Firstの考え方を組織の開発文化に根付かせることが、長期的なセキュリティ向上の鍵です。
あわせて読みたい
- 5Sとは|整理・整頓・清掃・清潔・しつけの意味・目的・進め方を解説
- AIリードスコアリング実装ガイド【2026年版】— 4要素スコアリング×テリトリー管理×ステータス倍率の本番アーキテクチャ
- AIカスタマーサポート完全ガイド【2026年版】— RAG・チャットボット・有人連携の実装パターンとツール比較
関連記事
開発プロセスの改善はrenueにご相談ください。

