Cloud Security

Serverless Security

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

Category: Cloud Security / Updated: 2026-05-26

📖

Overview

サーバーレスセキュリティ(Serverless Security)とは、AWS Lambda、Azure Functions、Google Cloud Functionsなどのサーバーレスコンピューティング環境におけるセキュリティリスクを特定・管理・軽減するための取り組みです。サーバーレスアーキテクチャでは、インフラの管理をクラウドプロバイダに委任することで運用負荷を軽減できますが、アプリケーションレベルの新たなセキュリティ課題が生じます。

サーバーレス環境では、従来のサーバーベースのセキュリティツール(WAF、IDS/IPS、エンドポイントエージェントなど)をそのまま適用することが困難です。関数は短命(ミリ秒〜数分)で実行され、イベント駆動で動的にスケーリングするため、従来の境界防御モデルが通用しません。代わりに、関数ごとの権限制御、入力データの検証、依存ライブラリの管理など、よりきめ細かなアプリケーション中心のセキュリティアプローチが必要です。

また、サーバーレスアーキテクチャでは、複数のクラウドサービス(API Gateway、S3、DynamoDB、SQSなど)がイベントソースとして連携するため、攻撃対象面が関数コードだけでなくサービス間の統合ポイントにまで広がります。各トリガーソースからの入力データを信頼せず、すべてのイベントデータに対して適切なバリデーションとサニタイゼーションを実施することが重要です。

🔬

Details

イベントインジェクション攻撃

イベントインジェクションは、サーバーレス環境に特有の攻撃手法です。サーバーレス関数は、API Gateway、S3、SNS、SQS、CloudWatch Events、Cognitoなど多様なイベントソースからトリガーされます。攻撃者はこれらのイベントソースに悪意のあるペイロードを注入し、関数内でOSコマンドインジェクション、SQLインジェクション、NoSQLインジェクションなどの攻撃を実行します。

例えば、S3バケットへのファイルアップロードをトリガーとするLambda関数において、ファイル名に悪意のあるコマンドを含めることで、関数内でのシェルコマンド実行時にOSコマンドインジェクションが発生する可能性があります。従来のWebアプリケーションとは異なり、サーバーレス関数のイベントソースは多岐にわたるため、すべての入力経路に対する防御が必要です。

過剰な権限とIAMロールの管理

サーバーレス関数には、クラウドリソースへのアクセス権限としてIAMロールが付与されます。開発者が迅速な開発を優先して過剰な権限(例:AmazonS3FullAccess)を付与するケースが非常に多く、関数が侵害された場合の被害が拡大します。

最小権限の原則に従い、各関数に必要最小限のIAMポリシーを個別に設定することが重要です。すべての関数で同一のIAMロールを共有するのではなく、関数ごとに独立したロールを割り当て、アクセスするリソースとアクション(s3:GetObject、dynamodb:PutItemなど)を厳密に限定してください。

コールドスタートとセキュリティへの影響

コールドスタートとは、サーバーレス関数が一定期間非活性状態の後に呼び出された際、新しいコンテナの初期化に時間がかかる現象です。セキュリティの観点では、コールドスタートは実行環境のリフレッシュを意味するため、マルウェアの永続化を困難にする利点があります。

一方で、ウォームスタート(既存のコンテナを再利用する場合)では、前回の実行で残ったデータ(/tmpディレクトリのファイル、環境変数のキャッシュ、グローバル変数)が次の呼び出しに引き継がれる可能性があります。機密データの残留リスクを軽減するため、処理完了後に一時データを確実に削除する実装が推奨されます。

サードパーティ依存関係の脆弱性

サーバーレス関数は通常、npm、pip、Mavenなどのパッケージマネージャーを通じて多くのサードパーティライブラリに依存しています。これらの依存関係に含まれる脆弱性は、サプライチェーン攻撃の対象となります。

SCA(Software Composition Analysis)ツールを使用して、デプロイ前に依存関係の脆弱性を自動的にスキャンしてください。また、使用していない依存関係を削除し、関数のデプロイパッケージを最小限に保つことで、攻撃対象面を縮小できます。

サーバーレス環境の可観測性

サーバーレス環境では、関数の実行が一時的かつ分散的であるため、従来のログ収集やモニタリング手法が十分に機能しない場合があります。分散トレーシング(AWS X-Ray、Jaegerなど)を導入し、マイクロサービス間のリクエストフローを可視化することで、異常な呼び出しパターンや不審なデータフローを検出できます。

CloudWatch Logs、Cloud LoggingなどのクラウドネイティブなログサービスとSIEMを統合し、関数の実行ログ、エラーログ、IAMアクティビティを一元的に監視・分析する体制を構築することが重要です。

🛡️

Security Measures

  • 01
    関数ごとの最小権限IAMポリシー:各サーバーレス関数に対して個別のIAMロールを作成し、必要最小限の権限のみを付与してください。ワイルドカード(*)によるリソース指定やFullAccessポリシーの使用を禁止し、具体的なリソースARNとアクションを明示的に指定しましょう。
  • 02
    すべてのイベントソースからの入力検証:API Gateway、S3、SNS、SQSなど、すべてのトリガーソースからの入力データに対して厳格なバリデーションとサニタイゼーションを実施してください。イベントデータを信頼せず、型チェック、長さ制限、許可リストによるフィルタリングを適用しましょう。
  • 03
    依存関係の脆弱性スキャンと管理:Snyk、Dependabot、OWASP Dependency-Checkなどのツールを使用して、サードパーティライブラリの脆弱性を継続的にスキャンしてください。不要な依存関係を削除し、デプロイパッケージサイズを最小化することで攻撃対象面を縮小しましょう。
  • 04
    機密情報の安全な管理:APIキー、データベース接続文字列、暗号化キーなどの機密情報を関数コードや環境変数にハードコーディングしないでください。AWS Secrets Manager、Azure Key Vault、Google Secret Managerなどのシークレット管理サービスを使用し、実行時に動的に取得しましょう。
  • 05
    関数のタイムアウトとリソース制限:各関数に適切な実行タイムアウト、メモリ割り当て、同時実行数の制限を設定してください。過剰なタイムアウト設定は、攻撃者に長時間のリソース利用を許し、DoS攻撃やクリプトマイニングのリスクを高めます。
  • 06
    分散トレーシングと統合ログ監視:AWS X-RayやOpenTelemetryを導入し、関数間のリクエストフローを可視化してください。CloudWatch LogsやSIEMと統合して、異常な呼び出しパターン、エラー率の急増、不審なIAMアクティビティをリアルタイムで検知・アラートする体制を構築しましょう。
⚠️

Incidents

📋 AWS Lambda関数を悪用した暗号通貨マイニング(2022年)

2022年、複数の企業でAWS Lambda関数が暗号通貨マイニングに悪用される事件が報告されました。攻撃者は漏洩したAWSアクセスキーを使用してLambda関数を大量にデプロイし、各関数内でMoneroのマイニングを実行しました。

Lambda関数の短い実行時間制限を回避するため、攻撃者は関数を再帰的に呼び出す仕組みを構築し、同時に複数リージョンで数百の関数を並列実行していました。被害企業は数日間で数万ドルのクラウド利用料を請求されました。この事件は、IAMアクセスキーの適切な管理とLambdaの同時実行数制限の重要性を示しています。

📋 サーバーレスアプリケーションへのイベントインジェクション攻撃

あるフィンテック企業のサーバーレスアプリケーションにおいて、API Gatewayを通じたイベントインジェクション攻撃が発生しました。攻撃者はAPIリクエストのパラメータにNoSQLインジェクションのペイロードを注入し、DynamoDBに格納されたユーザーの金融取引データを不正に取得しました。

原因は、Lambda関数内でAPI Gatewayからのイベントデータを適切にバリデーションせず、そのままDynamoDBクエリに使用していたことでした。入力検証を追加し、パラメータ化されたクエリを使用するよう修正が行われました。この事例は、サーバーレス環境でもOWASP Top 10に含まれるインジェクション攻撃が有効であることを示しています。

📋 GitHub ActionsとLambdaのサプライチェーン攻撃(2023年)

2023年、人気のnpmパッケージが悪意のあるコードに改ざんされ、このパッケージを依存関係として使用していた多数のサーバーレスアプリケーションが影響を受ける事件が発生しました。改ざんされたパッケージには、Lambda関数の環境変数(AWSアクセスキーを含む)を外部サーバーに送信するバックドアが仕込まれていました。

攻撃者はパッケージメンテナーのnpmアカウントを乗っ取り、マイナーバージョンアップデートとして悪意のあるコードを公開しました。依存関係のバージョンを「^」や「~」で範囲指定していたプロジェクトは、自動的に悪意のあるバージョンを取得してしまいました。この事件は、サーバーレスアプリケーションにおけるサプライチェーンセキュリティと依存関係のバージョン固定の重要性を浮き彫りにしました。

🔗

Related Terms