「個人開発だし、狙われないでしょ」って思ってない?
それ、めちゃくちゃ危険。実際、個人開発サービスがハックされて、ユーザー情報流出したり、AWSの請求が100万円来たりする事例がある。
セキュリティ事故起こしたら、信頼は一瞬で失われる。せっかく育てたサービスが終わる。
ということで、個人開発でも最低限やるべきセキュリティ対策をチェックリスト形式でまとめた。
実際にあったヤバい事例
まず、実際に起きた事故を知ってほしい。
事例1:APIキー流出で請求100万円
GitHubにAWSのAPIキーをコミット。数時間でマイニングに使われて、請求100万円。「public リポジトリだと気づかなかった」って。
事例2:SQLインジェクションで全データ削除
入力値のサニタイズ忘れて、SQLインジェクション食らう。全ユーザーデータ消される。バックアップもなくてサービス終了。
事例3:XSSでユーザーセッション乗っ取り
ユーザー投稿をそのまま表示してXSS脆弱性。管理者アカウント乗っ取られて、全ユーザーにスパムメール送信される。
事例4:総当たり攻撃で不正ログイン
ログイン試行回数制限なし。総当たり攻撃で管理者アカウント突破される。
どれも「まさか自分が」って思ってた人たち。でも起きた。
認証・認可のセキュリティ対策
□ パスワードは必ずハッシュ化
- bcryptかargon2使う
- 絶対に平文保存しない
- saltも忘れずに
□ ログイン試行回数制限
- 5回失敗したら15分ロック
- IPアドレス単位でも制限
□ セッション管理
- セッションIDは推測不可能に
- HTTPOnlyフラグ必須
- Secureフラグ必須(HTTPS環境)
□ 2要素認証の実装
- 管理者アカウントは必須
- ユーザーにも推奨
□ JWT使うなら
- 有効期限短めに(15分とか)
- リフレッシュトークン使う
- secretは絶対に漏らさない
入力値検証とサニタイズ
□ 全ての入力値を検証
- フロントの検証だけじゃダメ
- バックエンドで必ず再検証
- 型、長さ、形式をチェック
□ SQLインジェクション対策
- プリペアドステートメント使用
- ORMの使用推奨
- 生のSQL書かない
□ XSS対策
- ユーザー入力は必ずエスケープ
- ReactならデフォルトでOK
- innerHTMLは使わない
□ ファイルアップロード
- 拡張子チェック
- MIMEタイプ検証
- ファイルサイズ制限
- ウィルススキャン(可能なら)
APIセキュリティ
□ CORS設定
- 許可するオリジン明確に
- は使わない
- credentialsは慎重に
□ Rate Limiting
- API呼び出し回数制限
- IPアドレス単位
- ユーザー単位
□ APIキー管理
- 環境変数で管理
- .envファイルは.gitignoreに
- 定期的にローテーション
□ HTTPSonly
- HTTP は使わない
- Let’s Encrypt で無料SSL
- HSTSヘッダー設定
インフラ・環境設定
□ 本番と開発環境分離
- DBも分ける
- APIキーも分ける
- デバッグモードOFF
□ エラーメッセージ
- 本番では詳細出さない
- スタックトレース隠す
- ユーザーには一般的なメッセージ
□ 依存関係の管理
- npm audit定期実行
- Dependabot有効化
- 脆弱性あったら即更新
□ バックアップ
- 自動バックアップ設定
- 複数箇所に保存
- リストアテスト実施
データ保護
□ 個人情報の暗号化
- 重要データは暗号化して保存
- 通信時もHTTPS必須
- 不要なデータは保存しない
□ GDPR/個人情報保護法対応
- プライバシーポリシー作成
- データ削除機能実装
- 同意取得の仕組み
□ ログの管理
- パスワードはログに出さない
- 個人情報もログに出さない
- ログは定期的に削除
監視・検知
□ エラー監視
- Sentry導入
- 異常なエラー急増を検知
- 即座に通知受け取る
□ アクセスログ監視
- 異常なアクセスパターン検知
- 大量アクセス検知
- 不正なURLアクセス検知
□ セキュリティヘッダー
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self'
緊急時の対応準備
□ インシデント対応計画
- 連絡先リスト作成
- 対応手順書作成
- 定期的に訓練
□ ユーザーへの連絡手段
- メール一斉送信の準備
- お知らせページの準備
- SNSでの告知準備
□ サービス停止の準備
- メンテナンスモード実装
- 一時停止の手順確認
- データ保全の手順確認
便利なセキュリティツール
無料で使えるツール:
- OWASP ZAP:脆弱性スキャナー
- Mozilla Observatory:Webサイトセキュリティチェック
- Have I Been Pwned:漏洩チェック
- Snyk:依存関係の脆弱性チェック
チェックサービス:
bash
# npmの脆弱性チェック
npm audit
# Dockerイメージの脆弱性チェック
docker scan イメージ名
# SSL証明書チェック
https://www.ssllabs.com/ssltest/
よくある甘い考え
「個人情報扱ってないから大丈夫」 → メールアドレスも個人情報。パスワード流出したら他サービスにも影響。
「アクセス少ないから狙われない」 → 自動化された攻撃は規模関係なく来る。
「OAuthだけだから安全」 → トークン管理ミスったら意味ない。
「フレームワークが守ってくれる」 → 設定ミスったら脆弱性生まれる。
セキュリティ対策の優先順位
全部一度にやるのは大変。優先順位つけるなら:
最優先(今すぐ)
- APIキーの環境変数化
- HTTPS化
- パスワードハッシュ化
高優先(1週間以内) 4. 入力値検証 5. SQLインジェクション対策 6. XSS対策
中優先(1ヶ月以内) 7. ログイン試行回数制限 8. バックアップ設定 9. エラー監視導入
低優先(できれば) 10. 2要素認証 11. Rate Limiting 12. セキュリティヘッダー
まとめ
セキュリティは後回しにしがちだけど、事故起きてからじゃ遅い。
最低限、APIキー管理、HTTPS、パスワードハッシュ化だけは絶対やれ。これだけで大事故は防げる。
完璧なセキュリティは無理でも、基本的な対策してれば、狙われにくくなる。泥棒も鍵のかかってない家から狙うのと同じ。
セキュリティは保険。面倒だけど、やっとけば安心して開発に集中できる。
今すぐ自分のコード見直して、APIキー直書きしてないかチェックしよう。してたら、今すぐ環境変数に移そう。それが第一歩だ。