これまでサイドプロジェクトで遊び感覚でAPIを作り、公開して終わりにしていましたが、実際に数千人や数万人に使われるシステムとなると、それでは非常に危険で問題があると感じました。
この1年間でお客様案件に携わる中で、API周りの設計や実装に触れる機会が多かったため、APIセキュリティについて、自分の経験や感触、さらにネットで調べた知識を整理してまとめたいと思います。
1. 認証と認可
認証 (Authentication):
・OAuth 2.0やOpenID Connectなどの業界標準プロトコルを使用。
・短期トークンを利用し、長期的なアクセストークンの有効期限を避ける。
・APIキーやトークンをセキュアな方法で保管し、HTTPSでの送信を徹底。
認可 (Authorization):
・ロールベースアクセス制御 (RBAC) や属性ベースアクセス制御 (ABAC) を採用。
・ユーザーごとの権限を明確に定義し、必要最小限のアクセス権を付与。
2. 通信の暗号化
・API通信はすべてHTTPSを使用し、TLS(Transport Layer Security)で暗号化。
・古い暗号化アルゴリズム(例: SSL/TLS 1.0)を無効化し、TLS 1.2以上を使用。
・証明書の定期更新を自動化。
3. 入力データの検証
・APIで受け取るすべてのデータを検証。
・型、長さ、フォーマット(例: 電話番号、メールアドレスなど)を厳密にチェック。
・未検証のデータを直接データベースや内部サービスに渡さない。
・SQLインジェクションやクロスサイトスクリプティング (XSS) 攻撃を防ぐため、特殊文字のエスケープやプリペアードステートメントを使用。
4. エラーハンドリング
・エラーメッセージに詳細な情報を含めない。
例: スタックトレースや内部構造の情報は含めない。
・ユーザーには標準的なエラーコード(例: HTTP 400、403、500など)と適切なメッセージを返す。
5. APIレートリミット
・1ユーザーまたは1 IPアドレスごとにリクエストの上限を設定。
例: 1分あたりのリクエスト数を制限。
・レートリミットを設定することで、サービス妨害攻撃(DoS/DDoS)を緩和。
6. 監視とログ記録
・すべてのAPIリクエストとレスポンスをログに記録。
・ログには機密情報を含めない(例: パスワード、トークン)。
・APIへのアクセス状況を監視し、不正アクセスや異常なトラフィックを検知。
・ログはAWS CloudWatch LogsやELKスタックなどを利用して管理。
7. バージョン管理
・APIにバージョンを付与し、明確に管理(例: /v1/resource)。
・古いバージョンのAPIは段階的に廃止し、通知を行う。
8. セキュリティテスト
・OWASP API Security Top 10に基づき、APIを定期的にセキュリティ診断。
・ペネトレーションテストを実施し、脆弱性を発見して修正。
9. CORS(クロスオリジンリソース共有)設定
・必要なオリジン(ドメイン)だけにアクセスを許可。
・Access-Control-Allow-Origin ヘッダーを厳密に設定。
10. 秘密情報の管理
・APIキーやトークンは環境変数やAWS Secrets Managerで安全に管理。
・ソースコードに秘密情報をハードコードしない。
・トークンの使い捨て(例: ワンタイムトークン)を活用。
参考サイト