🔒

生成AIでプログラミング学習、その前に|社内SEが知っておくべきセキュリティの基本

に公開

生成AIでプログラミング学習、その前に|社内SEが知っておくべきセキュリティの基本

1. はじめに

「会社の古いPHPシステム、保守しろと言われても触れない...」
「生成AIで学びたいけど、会社のコードを貼っていいのか分からない」
「セキュリティポリシー的にアウトじゃない?でも誰に相談すればいいか分からない」

この記事は、そんな悩みを抱える社内SEや情報システム部門の方々に向けて書いています。

本シリーズでは、セキュリティを守りながら生成AI(ChatGPT、Claude、Geminiなど)でPHPを学ぶ方法 を、ハンズオン形式で実践していきます。この記事は、その基礎となる「生成AIとセキュリティの基本」を理解するためのものです。

1.1 このシリーズ全体の流れ

記事 タイトル
今ここ 生成AIとセキュリティの基礎知識
DockerでPHP+MySQL開発環境を作る
PHP基礎文法とDB接続の安全な書き方
PHPでTODOリスト作成(CRUDとセキュリティ対策)
手続き型PHPをクラスベースにリファクタリング
PHP実務で使うデバッグとセキュリティチェックリスト
攻撃者の視点で学ぶPHPセキュリティ

1.2 この記事の目的

  • 生成AIのリスクを正しく理解すること
  • 「何を貼っていいか、何を貼ってはいけないか」を明確にすること
  • この後の学習シリーズで実践する「安全な使い方」の基礎を築くこと

2. なぜセキュリティが重要なのか

生成AI(ChatGPT、Claude、Geminiなど)にコードやテキストを入力すると、そのデータは外部サーバーに送信 されます。そして、多くの場合、AIモデルの学習に使用される可能性があります

2.1 生成AIのデータ利用ポリシー

主要な生成AIのデータ取り扱い

ChatGPT(OpenAI)

  • 無料版・Plus版入出力データがAIモデルの学習に使用されるOpenAI 利用規約(日本語)
  • Enterprise/Team版・APIデータは学習に使用されない

Claude(Anthropic)

Gemini(Google)

  • 無料版人間のレビュアーによる確認があり、最大3年間保存される可能性。機械学習に使用される可能性あり(設定でオフ可能)(Gemini アプリのプライバシー ハブ
  • Google Workspace版・APIトレーニングに使用されない

2.2 重要なポイント

  • 無料版や個人向けプランでは、入力したデータが学習に使用される可能性が高い
  • 学習されたデータは、他のユーザーへの回答に混入する可能性がある
  • 一度入力したデータは、完全に削除できない場合が多い

2.3 情報漏洩のリスク

生成AIに入力したデータは、以下のリスクがあります。

  1. AIモデルの学習データとして使用される

    • 学習されたデータが、他のユーザーへの回答に混入する可能性
    • 機密情報が、第三者に漏洩するリスク
  2. 外部サーバーに保存される

    • データは外部サーバーに送信され、会社が回収することは不可能
    • サーバーが攻撃された場合、情報が漏洩するリスク
  3. 人間のレビュアーが確認する可能性

    • Geminiなど、人間のレビュアーが確認するサービスもある
    • 機密情報が人間の目に触れるリスク

2.4 実際にあったインシデント事例

Samsung社の事例(2023年3月)

Samsung社は2023年3月にChatGPT使用禁止を解除しましたが、わずか20日で3件の機密情報流出が発生 しました。

ケース1:半導体データベースのソースコード流出

  • 半導体工場測定データベースのダウンロードプログラムにバグ発見
  • プログラムのソースコード全体をコピーしてChatGPTに貼り付け
  • コードの修正を依頼

ケース2:歩留まり計算プログラムの流出

  • 歩留まりや不良チップを特定するプログラムのテストシーケンスを最適化するため
  • プログラムのソースコード全体をChatGPTに入力
  • コードの最適化を依頼

ケース3:社内会議の議事録作成

  • 社内会議をスマートフォンで録音
  • 音声認識アプリで文字起こし
  • 文字起こしデータをChatGPTに投げて議事録作成を試行

Samsung社の対応:

  • プロンプトを1,024バイトに制限する緊急措置
  • 最終的に2023年5月にChatGPTや生成AIツールの使用を全面禁止
  • 3人の従業員が懲戒処分を受けた

参考: 詳細はサムスン、機密情報をChatGPTにリーク|GizmodoSamsungのエンジニアがChatGPTに社外秘のソースコードを貼り付け|GIGAZINEを参照してください。

統計データ:

  • 調査会社Cyberhavenによると、3.1%の従業員が1度は会社の機密情報をChatGPTに入力している(サムスン、機密情報をChatGPTにリーク|Gizmodo
  • 従業員10万人レベルの大企業は、週に何百件もOpenAIに機密情報を共有している可能性

2.5 なぜこのような事故が起きるのか

  • ChatGPTがあまりに便利でつい過信してしまう
  • 「コードの修正」「議事録作成」など、日常業務で有用すぎる
  • セキュリティリスクの認識不足

3. 絶対に貼ってはいけない情報

生成AIに質問する際、以下の情報は絶対に貼ってはいけません

3.1 実際の業務コード

❌ NG例

// 社内の顧客管理システムのコード
function getCustomerData($customer_id) {
    $db = new mysqli('192.168.1.100', 'admin', 'P@ssw0rd123', 'customer_db');
    $result = $db->query("SELECT * FROM customer_orders WHERE customer_id = $customer_id");
    // ...
}

なぜNGか?

  • コードから業務ロジックが推測できる
  • データベース構造が分かる
  • セキュリティホールが発見される可能性

3.2 顧客情報、個人情報

❌ NG例

  • 顧客の氏名、メールアドレス、電話番号
  • 個人の識別情報(ID番号、パスポート番号など)
  • 健康情報、金融情報

なぜNGか?

  • 個人情報保護法違反のリスク
  • 顧客の信頼を損なう
  • 法的責任を問われる可能性

3.3 社内システムの構成情報

❌ NG例

  • サーバーのIPアドレス、ホスト名
  • 社内ネットワークの構成情報
  • ファイルパス(/var/www/company/secret/など)

なぜNGか?

  • システムの構造が分かり、攻撃の標的になる可能性
  • 社内のセキュリティ体制が推測できる

3.4 データベースのテーブル名・カラム名

❌ NG例

SELECT * FROM seihin_master WHERE patent_no = '12345';

なぜNGか?

  • テーブル名から業務内容が推測できるseihin_master = 製品マスタ、patent_no = 特許番号)
  • データベース構造が分かり、SQLインジェクション攻撃の標的になる可能性

3.5 APIキーやパスワード

❌ NG例

$api_key = 'sk-1234567890abcdefghijklmnopqrstuvwxyz';
$password = 'P@ssw0rd123';

なぜNGか?

3.6 「これらを含むエラーログ」もNG

❌ NG例

Fatal error: Uncaught mysqli_sql_exception: 
Connection refused in /var/www/company/secret/includes/db.php:15
Stack trace:
#0 /var/www/company/secret/includes/db.php(15): mysqli->__construct('192.168.1.100', 'admin', '***', 'customer_orders_db')

なぜNGか?

  • ファイルパスから社内構造が分かる
  • IPアドレス、データベース名が含まれる
  • エラーメッセージからシステムの脆弱性が推測できる

4. 生成AIに質問する際の「匿名化テクニック」

実際の業務コードを貼らずに、生成AIから効果的に学ぶ方法を紹介します。

4.1 具体例を抽象化する方法

テーブル名・カラム名を汎用的な名前に置き換えることで、業務内容を推測できないようにします。

❌ NG例:実際のコードをそのまま貼る

// 社内の製品管理システム
$query = "
    SELECT 
        seihin_master.seihin_code,
        seihin_master.patent_no,
        kokyaku_order.naibu_price
    FROM seihin_master
    INNER JOIN kokyaku_order 
        ON seihin_master.seihin_code = kokyaku_order.seihin_code
    WHERE kokyaku_order.customer_type = 'VIP'
";

✅ OK例:汎用的な名前に置き換える

// 商品管理システム
$query = "
    SELECT 
        products.product_code,
        products.reference_no,
        orders.price
    FROM products
    INNER JOIN orders 
        ON products.product_code = orders.product_code
    WHERE orders.customer_type = 'VIP'
";

匿名化のポイント

  • seihin_masterproducts(英語の汎用名)
  • patent_noreference_no(特許番号であることを隠す)
  • naibu_priceprice(内部価格であることを隠す)

4.2 ダミーデータの作成

実際のデータを使わず、学習用のダミーデータを作成します。これにより、実際の業務データを一切使わずに学習できます。

方法1:ChatGPTでダミーデータ生成

プロンプト例:
「20行のCSVデータを作成してください。
列は「ID、氏名、メールアドレス」で、
IDは1から連番、氏名は日本人の名前、
メールアドレスはランダムに生成してください。」

方法2:PythonのFakerライブラリ

from faker import Faker
fake = Faker('ja_JP')  # 日本語データ生成

for i in range(10):
    print(f"{i+1}, {fake.name()}, {fake.email()}")

出力例

1, 佐藤 太郎, taro.sato@example.com
2, 鈴木 花子, hanako.suzuki@example.com
3, 高橋 一郎, ichiro.takahashi@example.com

方法3:オンラインツール

  • Toolpods:CSV/JSON形式でダミーデータ生成(日本語対応)
  • Lorem Ipsum生成ツール:ダミーテキストの生成

参考: ダミーデータ作成の詳細は、Pythonでダミーデータを自動生成 | QiitaChatGPTでダミーデータ作成 | Qiitaを参照してください。

4.3 質問の仕方の工夫

実際のテーブル構造や業務ロジックを晒さずに、抽象化した質問をすることで、セキュリティを守りながら効果的に学べます。

❌ NG例:具体的すぎる質問

「うちの会社のusersテーブル(user_id, email, password, created_at)に
接続するコードを書いて」

→ 実際のテーブル構造を晒している

✅ OK例:抽象化した質問

「TODOリストのtodosテーブル(id, title, status, created_at)に
接続するサンプルコードを教えて」

→ 完全にダミーのデータ構造

4.4 実例:Before(NG例)/ After(OK例)

実際のコードを匿名化する具体的な例を示します。

例1:データベース接続

❌ NG例(実際の情報)

<?php
$db = new mysqli(
    '192.168.1.100',              // 社内サーバーのIPアドレス
    'admin',                       // 実際のユーザー名
    'P@ssw0rd123',                 // 実際のパスワード
    'customer_orders_db'           // 実際のデータベース名
);

$query = "SELECT * FROM customer_orders WHERE customer_id = $id";
$result = $db->query($query);
?>

✅ OK例(匿名化済み)

<?php
$db = new mysqli(
    'localhost',                   // 汎用的なホスト名
    'dbuser',                      // ダミーのユーザー名
    'password',                    // ダミーのパスワード
    'mydb'                         // 汎用的なデータベース名
);

$query = "SELECT * FROM users WHERE id = $id";
$result = $db->query($query);
?>

匿名化のポイント

  • IPアドレス → localhost
  • ユーザー名・パスワード → 汎用的な文字列
  • テーブル名 → usersorders など汎用的な名前

例2:エラーメッセージの匿名化

❌ NG例(機密情報が含まれる)

Fatal error: Uncaught mysqli_sql_exception: 
Connection refused in /var/www/company/secret/includes/db.php:15
Stack trace:
#0 /var/www/company/secret/includes/db.php(15): mysqli->__construct('192.168.1.100', 'admin', '***', 'customer_orders_db')
#1 /var/www/company/secret/pages/login.php(42): include('/var/www/company...')

✅ OK例(匿名化済み)

Fatal error: Uncaught mysqli_sql_exception: 
Connection refused in /path/to/includes/db.php:15
Stack trace:
#0 /path/to/includes/db.php(15): mysqli->__construct('localhost', 'dbuser', '***', 'mydb')
#1 /path/to/pages/login.php(42): include('/path/to/includ...')

匿名化のポイント

  • ファイルパス → /path/to/ に置換
  • IPアドレス → localhost
  • 機密性の高いディレクトリ名(secretcompany)を削除

4.5 匿名化の実践チェックリスト

生成AIに質問する前に、必ず以下を確認してください。全て ✅ になったら、質問OKです。

  • IPアドレス・ホスト名を localhost に置換
  • パスワード・APIキーをダミー文字列に置換
  • テーブル名を汎用的な名前(users, orders など)に置換
  • 社内固有の用語を削除または汎用的な表現に置換
  • ファイルパスを /path/to/ に置換
  • コメント内の機密情報を削除
  • エラーメッセージから社内情報を削除

全て ✅ になったら、質問OK

このチェックリストを印刷して、質問する前に必ず確認する習慣をつけましょう。

このチェックリストの根拠となる情報源

このチェックリストは、以下の信頼できる公的機関・セキュリティ専門家の情報をもとに作成されています。

1. 公的機関のガイドライン
IPA(情報処理推進機構)「テキスト生成AIの導入・運用ガイドライン」
JDLA(日本ディープラーニング協会)「生成AIの利用ガイドライン」
2. パスワード・APIキーの漏洩リスク
GitHub上のハードコーディング問題
GitHub公式ドキュメント
  • 2,328件のユーザー名とパスワードがハードコーディングされた状態で公開
  • 機密データをリポジトリから削除する方法を解説
  • 📄 GitHub Docs:機密データの削除
3. テーブル名・カラム名漏洩のリスク(SQLインジェクション)
IPA「安全なウェブサイトの作り方」
  • エラーメッセージでテーブル名やカラム名が表示されると、攻撃の標的になる
  • プレースホルダの利用など、SQLインジェクション対策を詳しく解説
  • 📄 IPA:SQLインジェクション対策
セキュリティ専門メディアの解説
4. 実際の情報漏洩事例
Samsung社のChatGPT情報漏洩事件(2023年3月)
  • わずか20日間で3件の機密情報流出
  • 半導体データベースのソースコード全体を貼り付け
  • 最終的にChatGPT使用を全面禁止
  • 📄 Gizmodo報道
  • 📄 GIGAZINE報道
統計データ
  • 調査会社Cyberhavenによると、3.1%の従業員が会社の機密情報をChatGPTに入力
  • 従業員10万人規模の企業は、週に何百件もOpenAIに機密情報を共有している可能性
5. セキュアコーディングの基本原則
JPCERT/CC(日本コンピュータ緊急対応センター)
  • プログラムコード内でのパスワード等の機密情報の取り扱い方針
  • セキュリティテスト済みの暗号化ライブラリの使用を推奨
  • 📄 JPCERT:機密情報の扱い方

5. セキュリティポリシーの確認方法

5.1 社内のセキュリティ担当者に相談

生成AIの利用について、まずは社内のセキュリティ担当者に相談 してください。

相談すべき内容

  • 生成AIの利用が許可されているか
  • どのような用途で使用可能か
  • データの取り扱いに関するルール
  • 利用可能なツール(Enterprise版、APIなど)

5.2 利用規定の確認

社内の利用規定やセキュリティポリシーを確認してください。

確認すべき項目

  • 生成AIの利用に関する規定
  • 機密情報の取り扱いに関する規定
  • 外部サービスへのデータ送信に関する規定

参考:企業のガイドライン策定状況

参考資料

5.3 「分からなければ使わない」が鉄則

重要な原則

  • 社内のセキュリティポリシーが不明確な場合、使わないのが最善
  • 「使っていい」と明確に言われない限り、使わない
  • リスクを理解した上で、慎重に判断する

IPAガイドラインが推奨する対策

IPA テキスト生成AIの導入・運用ガイドライン):

  • プロンプト入力時の注意喚起(機密情報を入力しないよう警告)
  • プロンプトの暗号化(データ送信時に暗号化)
  • データ保持期間の設定(短期間に設定)
  • 利活用ガイドラインの策定とユーザ教育

6. この記事シリーズでの実践方法

この記事シリーズでは、完全にダミーのTODOリスト でPHPを学びます。

6.1 完全にダミーのTODOリストで学ぶ

学習用の環境

  • Dockerで構築したローカル環境
  • 実際の業務とは完全に切り離された環境
  • 失敗しても、コンテナを作り直せばOK

学習用のデータ

  • すべてダミーデータ
  • 実際の業務コードは一切使用しない
  • テーブル名も todosusers など汎用的な名前

6.2 実際の業務コードは一切使わない

このシリーズの原則

  • 実際の業務コードを記事に載せない
  • 実際のテーブル名・カラム名を使わない
  • 実際のエラーログをそのまま載せない

すべて匿名化

  • コード例はすべてダミー
  • エラーメッセージも匿名化済み
  • ファイルパスも /path/to/ に置換

6.3 学んだことを、後で業務に応用する

学習の流れ

  1. ダミーデータでPHPの基本を学ぶ
  2. 生成AIに安全に質問する方法を実践する
  3. 学んだ知識を、実際の業務に応用する(ただし、セキュリティは守る)

応用時の注意

  • 実際の業務コードを生成AIに貼り付けない
  • 匿名化テクニックを活用する
  • セキュリティポリシーを守る

7. まとめ

生成AIは強力なツールですが、使い方を間違えると情報漏洩のリスク があります。

この記事で学んだこと

  • 生成AIのデータ利用ポリシーとリスク
  • 絶対に貼ってはいけない情報
  • 匿名化テクニックの実践方法
  • セキュリティポリシーの確認方法

次のステップ

この記事シリーズでは、セキュリティを守りながら、ダミーデータでPHPを学びます。次回は、DockerでPHP学習環境を構築 する方法を解説します。

重要な原則

会社のコードは絶対に貼らない
セキュリティを守りながら、賢く使おう
実践的な手順に従って、安全に学んでいこう


8. 参考資料

公式ドキュメント

信頼できる解説記事


9. 📚 シリーズ記事一覧

この記事: 生成AIとセキュリティの基礎知識

次の記事: DockerでPHP+MySQL開発環境を作る
→ 本番環境とは完全に切り離されたローカル環境で、失敗しても安心して学べる環境を構築します。

シリーズ全体

  1. 生成AIとセキュリティの基礎知識 ← 今ここ
  2. DockerでPHP+MySQL開発環境を作る
  3. PHP基礎文法とDB接続の安全な書き方
  4. PHPでTODOリスト作成(CRUDとセキュリティ対策)
  5. 手続き型PHPをクラスベースにリファクタリング
  6. PHP実務で使うデバッグとセキュリティチェックリスト
  7. 攻撃者の視点で学ぶPHPセキュリティ

Discussion