クラウド・インフラセキュリティ

サーバーレスセキュリティ

約 3 分で読めます

サーバーレスセキュリティとは

サーバーレスセキュリティとは、AWS Lambda、Azure Functions、Google Cloud Functions などのサーバーレスコンピューティング環境に特有のセキュリティリスクに対処する取り組みです。

サーバーレスでは OS やランタイムの管理がプロバイダーに委ねられるため、共有責任モデルにおける利用者の責任範囲が縮小します。しかし、責任がなくなるわけではありません。関数コードの脆弱性、IAM ロールの過剰権限、イベントソースからの不正入力、依存ライブラリの脆弱性など、アプリケーション層のセキュリティは利用者が全面的に責任を負います。

サーバーレス特有の攻撃対象面

サーバーレス環境では、従来のサーバーベースのアプリケーションとは異なる攻撃対象面 (アタックサーフェス) が存在します。

  • イベントインジェクション: Lambda 関数は API Gateway、S3、SQS、DynamoDB Streams など多様なイベントソースから呼び出される。各イベントソースからの入力を信頼せず、関数内で必ずバリデーションを行う。S3 のオブジェクトキーに悪意のあるパスが含まれるケースや、SQS メッセージに不正なペイロードが混入するケースがある
  • 過剰な権限: 開発の利便性から関数に広範な IAM 権限を付与しがちだが、1 つの関数が侵害されると付与された全権限が悪用される。関数ごとに個別の IAM ロールを割り当て、必要最小限のアクション・リソースのみを許可する
  • 依存関係の脆弱性: Lambda 関数が使用する npm パッケージや pip パッケージに既知の脆弱性が含まれている場合、関数の実行環境が危険にさらされる。IaC の CI/CD パイプラインに SCA (Software Composition Analysis) を組み込む
  • 環境変数の漏洩: シークレットを環境変数に格納する場合、関数のログ出力やエラーレスポンスに環境変数が含まれないよう注意する

サーバーレスセキュリティのベストプラクティス

サーバーレス環境のセキュリティを強化するための実践的な対策です。

  • 関数ごとの最小権限 IAM ロール: 全関数で共通の IAM ロールを使い回さない。AWS SAM や Serverless Framework のテンプレートで関数ごとにポリシーを定義する
  • 入力バリデーション: イベントソースに関わらず、関数が受け取るすべての入力を検証する。JSON Schema バリデーション、型チェック、サイズ制限を実装する
  • 実行時間とメモリの制限: タイムアウトとメモリサイズを必要最小限に設定する。暴走した関数や DoS 攻撃によるコスト増大を防止する
  • WAF の前段配置: API Gateway の前段に WAF を配置し、SQL インジェクションや XSS などの一般的な攻撃を関数に到達する前にブロックする
  • VPC 内実行の検討: データベースや内部 API にアクセスする関数は VPC 内で実行し、インターネットへの不要なアウトバウンド通信を遮断する

監視とインシデント対応

サーバーレス環境の監視は、従来のサーバー監視とは異なるアプローチが必要です。

  • 関数レベルのログ: CloudWatch Logs に構造化ログを出力し、リクエスト ID、実行時間、エラー情報を追跡可能にする。ログにシークレットや個人情報が含まれないようフィルタリングする
  • 異常検知: 関数の呼び出し回数、エラー率、実行時間の異常をアラートで検知する。通常と異なるパターン (深夜の大量呼び出し、特定 IP からの集中アクセス) を監視する
  • 分散トレーシング: AWS X-Ray などで関数間の呼び出しチェーンを可視化し、異常な呼び出しパターンやレイテンシの急増を検出する

コンテナベースのアプリケーションと比較して、サーバーレスは実行環境が短命 (エフェメラル) であるため、フォレンジック調査が困難です。ログとトレースを十分に記録し、インシデント発生時に事後分析できる体制を整えておくことが重要です。

よくある誤解

サーバーレスはサーバーがないのでセキュリティの心配が不要
サーバーレスでも関数コードの脆弱性、IAM の設定ミス、依存ライブラリの脆弱性、イベントソースからの不正入力など、アプリケーション層のセキュリティリスクは存在します。OS 管理の負担は減りますが、セキュリティの責任がなくなるわけではありません。
Lambda 関数は短時間しか実行されないので攻撃される時間がない
関数の実行時間が短くても、1 回の実行で機密データの窃取やリソースの不正利用は可能です。また、関数が繰り返し呼び出される環境では、攻撃者は何度でも試行できます。実行時間の短さはセキュリティの保証にはなりません。

関連用語

関連記事