生成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)
- 個人向けプラン(Free/Pro/Max):デフォルトで学習に使用される(設定でオフ可能)(Claude プライバシーポリシー)
- Claude for Work・API:データは学習に使用されない
- 詳細な設定方法や注意点:プライバシーポリシーの変更(2025年9月28日からオプトアウト方式へ)や設定手順については、要注意!Anthropic(Claude)のプライバシーポリシーの変更!の記事が詳しく解説しています。
Gemini(Google)
- 無料版:人間のレビュアーによる確認があり、最大3年間保存される可能性。機械学習に使用される可能性あり(設定でオフ可能)(Gemini アプリのプライバシー ハブ)
- Google Workspace版・API:トレーニングに使用されない
2.2 重要なポイント
- 無料版や個人向けプランでは、入力したデータが学習に使用される可能性が高い
- 学習されたデータは、他のユーザーへの回答に混入する可能性がある
- 一度入力したデータは、完全に削除できない場合が多い
2.3 情報漏洩のリスク
生成AIに入力したデータは、以下のリスクがあります。
-
AIモデルの学習データとして使用される
- 学習されたデータが、他のユーザーへの回答に混入する可能性
- 機密情報が、第三者に漏洩するリスク
-
外部サーバーに保存される
- データは外部サーバーに送信され、会社が回収することは不可能
- サーバーが攻撃された場合、情報が漏洩するリスク
-
人間のレビュアーが確認する可能性
- 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にリーク|Gizmodo、Samsungのエンジニアが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か?
- 直接的なセキュリティリスク
- 不正アクセスの原因になる
- GitHubの調査によると、2,328件のユーザー名とパスワードがハードコーディングされた状態で公開されている(リポジトリからの機微なデータの削除 | GitHub Docs)
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_master→products(英語の汎用名) -
patent_no→reference_no(特許番号であることを隠す) -
naibu_price→price(内部価格であることを隠す)
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でダミーデータを自動生成 | QiitaやChatGPTでダミーデータ作成 | 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 - ユーザー名・パスワード → 汎用的な文字列
- テーブル名 →
users、ordersなど汎用的な名前
例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 - 機密性の高いディレクトリ名(
secret、company)を削除
4.5 匿名化の実践チェックリスト
生成AIに質問する前に、必ず以下を確認してください。全て ✅ になったら、質問OKです。
-
IPアドレス・ホスト名を
localhostに置換 - パスワード・APIキーをダミー文字列に置換
-
テーブル名を汎用的な名前(
users,ordersなど)に置換 - 社内固有の用語を削除または汎用的な表現に置換
-
ファイルパスを
/path/to/に置換 - コメント内の機密情報を削除
- エラーメッセージから社内情報を削除
全て ✅ になったら、質問OK
このチェックリストを印刷して、質問する前に必ず確認する習慣をつけましょう。
このチェックリストの根拠となる情報源
このチェックリストは、以下の信頼できる公的機関・セキュリティ専門家の情報をもとに作成されています。
1. 公的機関のガイドライン
IPA(情報処理推進機構)「テキスト生成AIの導入・運用ガイドライン」
- 機密情報をAIに入力するリスクと対策を詳しく解説
- プロンプト入力時の注意喚起、データ暗号化、保持期間設定などを推奨
- 📄 IPAガイドライン(2024年7月更新)
- 📝 解説記事(Qiita)
JDLA(日本ディープラーニング協会)「生成AIの利用ガイドライン」
- 入力してはいけない情報として「個人情報」「秘密情報」「機密情報」を明示
- 企業が利用ガイドラインを策定する際のひな形を無料公開
- 📄 JDLAガイドライン公式ページ
- 📝 解説記事(@DIME)
2. パスワード・APIキーの漏洩リスク
GitHub上のハードコーディング問題
- Unit 42(Palo Alto Networks)の調査:GitHubリポジトリで2,328件のハードコードされたパスワードを発見
- GitGuardian調査(2021年):600万件以上の機密データが流出(前年比2倍)
- GitHubへのコミット1,000件中3件が機密情報を流出
- 📄 Unit 42 調査レポート
- 📄 GitGuardian 2021年調査
- 📝 トヨタのGitHub情報漏洩事例
GitHub公式ドキュメント
- 2,328件のユーザー名とパスワードがハードコーディングされた状態で公開
- 機密データをリポジトリから削除する方法を解説
- 📄 GitHub Docs:機密データの削除
3. テーブル名・カラム名漏洩のリスク(SQLインジェクション)
IPA「安全なウェブサイトの作り方」
- エラーメッセージでテーブル名やカラム名が表示されると、攻撃の標的になる
- プレースホルダの利用など、SQLインジェクション対策を詳しく解説
- 📄 IPA:SQLインジェクション対策
セキュリティ専門メディアの解説
- エラーメッセージの詳細表示は攻撃者にとってのイージーモード
- テーブル名・カラム名から業務内容が推測され、攻撃の糸口になる
- 📝 SQLインジェクション解説(ハッキング体験会)
- 📝 SQLインジェクション対策(ESET)
- 📝 攻撃遮断くん解説
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の利用に関する規定
- 機密情報の取り扱いに関する規定
- 外部サービスへのデータ送信に関する規定
参考:企業のガイドライン策定状況
- 国内企業の45.0%が生成AIを業務利用している
- しかし、ガイドライン策定率は19.5%にとどまる
- 14.4%の企業は「利用を従業員判断に任せている」状態(ChatGPT社内規定ガイドライン 2025年版|株式会社MoMo)
参考資料
- IPA(情報処理推進機構):「テキスト生成AIの導入・運用ガイドライン」(2024年7月公開)
- JDLA(日本ディープラーニング協会):「生成AIの利用ガイドライン」(無料公開、企業がカスタマイズ可能)
5.3 「分からなければ使わない」が鉄則
重要な原則
- 社内のセキュリティポリシーが不明確な場合、使わないのが最善
- 「使っていい」と明確に言われない限り、使わない
- リスクを理解した上で、慎重に判断する
IPAガイドラインが推奨する対策
- プロンプト入力時の注意喚起(機密情報を入力しないよう警告)
- プロンプトの暗号化(データ送信時に暗号化)
- データ保持期間の設定(短期間に設定)
- 利活用ガイドラインの策定とユーザ教育
6. この記事シリーズでの実践方法
この記事シリーズでは、完全にダミーのTODOリスト でPHPを学びます。
6.1 完全にダミーのTODOリストで学ぶ
学習用の環境
- Dockerで構築したローカル環境
- 実際の業務とは完全に切り離された環境
- 失敗しても、コンテナを作り直せばOK
学習用のデータ
- すべてダミーデータ
- 実際の業務コードは一切使用しない
- テーブル名も
todos、usersなど汎用的な名前
6.2 実際の業務コードは一切使わない
このシリーズの原則
- 実際の業務コードを記事に載せない
- 実際のテーブル名・カラム名を使わない
- 実際のエラーログをそのまま載せない
すべて匿名化
- コード例はすべてダミー
- エラーメッセージも匿名化済み
- ファイルパスも
/path/to/に置換
6.3 学んだことを、後で業務に応用する
学習の流れ
- ダミーデータでPHPの基本を学ぶ
- 生成AIに安全に質問する方法を実践する
- 学んだ知識を、実際の業務に応用する(ただし、セキュリティは守る)
応用時の注意
- 実際の業務コードを生成AIに貼り付けない
- 匿名化テクニックを活用する
- セキュリティポリシーを守る
7. まとめ
生成AIは強力なツールですが、使い方を間違えると情報漏洩のリスク があります。
この記事で学んだこと
- 生成AIのデータ利用ポリシーとリスク
- 絶対に貼ってはいけない情報
- 匿名化テクニックの実践方法
- セキュリティポリシーの確認方法
次のステップ
この記事シリーズでは、セキュリティを守りながら、ダミーデータでPHPを学びます。次回は、DockerでPHP学習環境を構築 する方法を解説します。
重要な原則
会社のコードは絶対に貼らない
セキュリティを守りながら、賢く使おう
実践的な手順に従って、安全に学んでいこう
8. 参考資料
公式ドキュメント
信頼できる解説記事
- ChatGPTの利用規約【2024年3月時点】|ロジットパートナーズ法律会計事務所
- サムスン、機密情報をChatGPTにリーク|Gizmodo
- ChatGPTの社内利用規程はこう作る|AI経営総合研究所
9. 📚 シリーズ記事一覧
この記事: 生成AIとセキュリティの基礎知識
次の記事: DockerでPHP+MySQL開発環境を作る
→ 本番環境とは完全に切り離されたローカル環境で、失敗しても安心して学べる環境を構築します。
Discussion