私たちは美容室向けのSaaSを開発・運営しています。
あるとき、実験としてこう決めました。
「設計の指示は最小限。Claude Code などのAIに、ほぼ全自動で作らせてみる」
結果から言うと、サービスはちゃんと動きました。
ログインでき、データが保存され、画面も綺麗。
ところが、あとからセキュリティ診断をしてみると、“普通に使う分には気づかない穴”がいくつも見つかりました。
AIが作ったままの状態で何が起きていたのか。そして、どう手直ししたのかをまとめます。
■ AIに任せた結果① 環境変数が“増殖”していた
【AIが作った状態】
機能を足すたびに、AIは必要な設定値を「その場で」追加していきました。フロント、バックエンド、ローカルの .env、それぞれに同じ値が重複し、使われていない古い設定が残り続け、ローカルと本番の値が別物になって、どれが正本かわからない状態に。さらに、サーバー専用の値がフロントの公開変数に入りかけていました。
【手直し】
・値の正本を1か所に決め、それ以外の重複を削除
・「どの値を、どのサービスが読むか」を台帳にまとめる
・ビルド後の配信ファイルに秘密の値が含まれていないか、毎回検索する
■ AIに任せた結果② 「環境変数に入れた=安全」で止まっていた
【AIが作った状態】
秘密の値は環境変数に入っていましたが、その先の設計はありませんでした。お客様から預かる外部サービスのログイン情報も、そのままDBに保存される作りでした。開発用の「デモボタン」に管理者のIDとパスワードが書かれたまま、画面側のコードに残っていたこともあります。
【手直し】
・預かったログイン情報は、DB上で暗号化して保存
・復号鍵を持つサーバーを限定し、鍵を持たない処理は専用の内部APIで受け取る
・鍵をなくすと復号できなくなるため、鍵の保管とローテーション手順を決める
・画面側のコードから秘密の値を一掃
■ AIに任せた結果③ テナント設計が“なんとなく”だった
【AIが作った状態】
複数の会社が使う前提なのに、「マルチテナント(全社で1つのDB)か、会社ごとにDBを分けるか」という判断がされないまま、全社のデータが1つのDBに入り、会社ごとの絞り込みは主に画面側で行われていました。さらにAIアシスタント機能では、AIに渡す指示文に全社分の店舗名が入っており、他社の情報が回答に出かねない状態でした。
【手直し】
・方式を明示的に決め直した
・マルチテナント:運用は楽だが、権限チェック1か所の漏れが情報漏えいに直結する → DB側の行単位の制御(RLS)とアプリ側の確認を二重化
・DB分離:混ざる心配は構造的に少ないが、社数が増えるほど運用が重い → 扱うデータが重い導入企業は、専用DBに分離
・AIに渡す情報は「その人が見てよいものだけ」に限定
■ AIに任せた結果④ “正常な操作”しか想定していなかった
【AIが作った状態】
有料機能のボタンは画面で隠しているだけで、サーバーでは契約を確認していない。パスワード変更で「今のパスワード」が空のとき、確認が飛ばされる。デバッグ用のエンドポイントが本番に残っている。テストも「正しく使ったとき動くか」だけでした。
【手直し】
・契約・権限の確認はすべてサーバー側(APIとDB)に集約
・「空の入力」「想定外の値」「他人のIDを指定」など、壊す側の視点のテストを追加
・本番に不要な開発用の機能を棚卸しして削除
■ AIに任せた結果⑤ 本番だけが“正しい状態”になっていた
【AIが作った状態】
不具合を直すたびに本番のDBへ直接変更を入れていった結果、本番にしか存在しないテーブルや列が積み重なり、「リポジトリから本番を作り直せない」状態になっていました。AIの利用回数・費用にも上限がなく、1件の不具合でAIが同じ処理を繰り返し、利用料が一気に跳ね上がったこともあります。
【手直し】
・本番との差分をすべて洗い出し、マイグレーションとして復元
・DBの変更は必ずマイグレーション経由に統一
・AI機能に、1日・1人あたりの回数と費用の上限を設定
・CIでシークレット混入と依存パッケージの脆弱性を自動検査
■ 実験してわかったこと
AIに任せてよかったこと
・画面やAPIを作るスピード
・既存コードの修正、テストの量産
人が決めないといけないこと
・秘密の値をどこに置き、誰が読めるか
・テナントをどう分けるか(共有か、分離か)
・「壊す側」から見たときに何が起きるか
AIは「言われたことを、動く形で」作るのは本当に得意です。ただ、言われていない“守り”は、ほとんど自分からは作りません。設計の判断と、壊す側の視点でのチェックは、今も人の仕事でした。
■ 同じようにAIでサービスを作った方へ
「動いているけど、中身が大丈夫か自信がない」という方向けに、ココナラでセキュリティ診断(擬似ハッキング・PDF報告つき)を受け付けています。今回の実験で見つかったような穴を、同じ視点で確認します。
https://coconala.com/services/4430899