0Pricing
Cloud & IT Cert Prep · レッスン

サーバーレスと関数のセキュリティ

サーバーレス関数固有の攻撃対象領域(過剰な権限を持つIAMロール、イベントインジェクション、依存関係のリスク)を特定し、最小権限と入力検証の制御を適用します。

「サーバーレスと関数のセキュリティ」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

サーバーレスコンピューティングとは

サーバーレスコンピューティング(Functions as a Service、FaaS)では、開発者は基盤となるサーバーを管理せずに、イベント(HTTP リクエスト、キューメッセージ、データベーストリガー、スケジュールタイマーなど)によって呼び出される個々の関数をデプロイできます。主なプラットフォームには、AWS Lambda、Google Cloud Functions、Azure Functionsがあります。パッチ適用、スケーリング、インフラストラクチャの管理はクラウドプロバイダーが担います。運用上の負担が軽減される一方で、セキュリティ責任モデルは変化します。プロバイダーはランタイムを保護しますが、開発者は関数コード、権限、設定について全面的に責任を負います。

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

サーバーレス関数には、従来のアプリケーションとは異なる攻撃対象領域があります。関数は通常短時間(数秒から数分)しか実行されないため、従来の EDR やネットワーク監視は効果が低くなります。またイベント駆動であるため、さまざまな入力元(S3 イベント、API Gateway、SNS)から実行をトリガーできます。さらに、他のクラウドリソースにアクセスできるIAM 権限で実行されることが多く、悪意のあるコードを含む可能性があるサードパーティ製依存関係(npm、pip パッケージ)も使用します。攻撃対象領域は、イベント入力、IAM 権限、依存関係の信頼チェーンによって決まります。

過剰な権限を持つ IAM ロール:最大の脅威

最も一般的なサーバーレスのセキュリティ脆弱性は、過剰な権限を持つ IAM ロールです。開発者がある関数から 1 つの S3 バケットにアクセスする必要がある場合、権限エラーを避けるために s3:*(S3 へのフルアクセス)を割り当てたくなることがあります。このロールを持つ関数が侵害されたり脆弱性を悪用されたりすると、アカウント内の任意のバケットの読み取り、書き込み、削除が可能になります。対策は、厳格な最小権限の IAM ロールを使用することです。各関数には専用のロールを割り当て、その関数固有のタスクに必要な最小限の権限だけを付与します。AWS IAM Access AnalyzerやCloudsplainingなどのツールは、過剰な権限を持つ Lambda ロールを自動的に特定します。

# IAM policy: least privilege for specific Lambda function
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Action': ['s3:GetObject'],
    'Resource': 'arn:aws:s3:::my-specific-bucket/uploads/*'
  }]
}

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

イベントインジェクションは、イベントペイロード内の攻撃者が制御するデータが、関数コードによって安全でない形で処理されると発生します。サーバーレス関数は多くのイベントソース(HTTP ヘッダー、クエリパラメーター、データベース変更レコード、キューメッセージの本文、メールの内容など)によってトリガーされるため、そのいずれにも悪意のあるペイロードが含まれる可能性があります。一般的なインジェクションの種類には、イベントデータを使って関数がデータベースを検索する場合のSQL インジェクション、NoSQL インジェクション(JSON ペイロード内の MongoDB 演算子)、イベントデータを OS コマンドで使用する場合のコマンドインジェクション、イベントデータ内の URL を取得する場合のSSRF(Server-Side Request Forgery)があります。入力値の検証とパラメーター化クエリは不可欠な防御策です。

# Vulnerable: event data used directly in shell command
# const filename = event.filename;
# exec('convert ' + filename + ' output.jpg');

# Safe: validate and sanitize input
# const filename = path.basename(event.filename);
# if (!/^[a-z0-9_-]+\.(jpg|png)$/i.test(filename)) throw new Error('Invalid');
# execFile('convert', [filename, 'output.jpg']);

依存関係のリスク:サードパーティ製パッケージ

サーバーレス関数は、数十個のサードパーティ製パッケージに依存することがよくあります。これらの依存関係はサプライチェーンリスクをもたらします。悪意のあるパッケージや侵害されたパッケージは、関数の実行環境内で任意のコードを実行し、環境変数(多くの場合、Secret が含まれます)にアクセスし、外部ネットワーク接続を行い、関数の IAM ロールを使ってクラウドリソースにアクセスできます。event-stream npm packageの侵害(2018 年)や、数多くのtyposquatting パッケージによる著名な攻撃は、このリスクを示しています。対策には、依存関係の固定、CI/CD でのSCA スキャン、依存関係を最小限に抑えることが含まれます。

サーバーレスの Secret:環境変数

サーバーレス関数では、クラウドコンソールで設定した環境変数を通じて Secret を受け取ることがよくあります。これらの環境変数は、Lambda の設定に対する IAM アクセス権を持つすべてのユーザーから見えるほか、関数内で実行されるあらゆるコードからアクセスできます。ベストプラクティスは、Secret を平文の環境変数として直接保存しないことです。代わりに ARN または Secret 名を保存し、実行時にAWS Secrets ManagerまたはParameter Storeから Secret を取得します。また、保管時の Lambda 環境変数に対してKMS 暗号化を有効にし、環境変数を決してログに出力しないでください(多くのデバッグロガーはエラー発生時にすべての環境変数をダンプします)。

# Retrieve secret at runtime instead of hardcoding
# Using AWS SDK in Lambda
# const secretsClient = new SecretsManagerClient({});
# const response = await secretsClient.send(
#   new GetSecretValueCommand({ SecretId: 'prod/myapp/db-password' })
# );
# const dbPassword = response.SecretString;

関数のタイムアウトと同時実行数の制限

サーバーレス関数に対するサービス拒否は、大量の呼び出しという形を取ることがあります。関数を繰り返しトリガーできる攻撃者によって、アカウントの同時実行数の上限(Lambda のデフォルトはリージョンあたり 1,000 件の同時実行)が使い果たされると、アカウント内の他の関数を実行できなくなります。ユーザーが制御する入力を処理する関数では、API Gateway レベルでレート制限を実装し、ペイロードサイズの上限を検証し、暴走した実行を防ぐために適切なタイムアウト値を設定する必要があります。また、入力サイズを制限していない場合、XML/YAML の解析時にBillion Laughs 型の展開攻撃を受ける可能性もあります。

# AWS Lambda: set reserved concurrency to prevent account-wide DoS
aws lambda put-function-concurrency \
  --function-name my-api-handler \
  --reserved-concurrent-executions 100

VPC 統合とネットワーク分離

デフォルトでは、AWS Lambda 関数はインターネットアクセスを備えた AWS 管理の VPC で実行されますが、プライベート VPC 内のリソース(RDS データベース、ElastiCache、プライベート API)にはアクセスできません。プライベートリソースにアクセスするには、特定のサブネットとセキュリティグループを指定して、Lambda をVPC内で実行するよう設定する必要があります。ただし、VPC に接続された Lambda 関数はデフォルトではインターネットにアクセスできないため、外部へのインターネットアクセスにはNAT Gatewayが必要です。Lambda 関数に関連付けるセキュリティグループには最小権限の原則を適用し、必要な特定のポートと宛先だけを許可してください。本番関数のセキュリティグループでは、送信ルールに 0.0.0.0/0 を使用しないでください。

サーバーレス関数の監視

サーバーレスのセキュリティ監視には、従来のホスト監視とは異なるアプローチが必要です。関数は一時的に実行されるため、ホストベースのエージェントは実用的ではありません。効果的な監視では、すべての Lambda API 呼び出し(呼び出し、設定変更、ロールの引き受け)を記録するAWS CloudTrail、異常なパターンがないか関数の実行ログを検索するCloudWatch Logs Insights、通常とは異なる Lambda のネットワークアクティビティを含む脅威を検知するAmazon GuardDutyを使用します。また、Protego(現在は Check Point の一部)や、レイヤーを通じて関数に計測機能を組み込みランタイムの可視性を提供するDatadogのサーバーレス監視など、商用のサーバーレスネイティブセキュリティツールも利用できます。

# Query CloudWatch Logs for Lambda errors and anomalies
aws logs start-query \
  --log-group-name '/aws/lambda/my-function' \
  --start-time $(date -d '-1 hour' +%s) \
  --end-time $(date +%s) \
  --query-string 'fields @timestamp, @message | filter @message like /ERROR|WARN|credential/'

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

サーバーレスのセキュリティテストには、専用のツールが必要です。PureSec CLI(現在は Check Point の一部)とProwlerは、サーバーレスに関するクラウド設定のミスをスキャンします。DAST ツールは、HTTP でトリガーされる関数をテストしてインジェクションの脆弱性を検出できます。Bandit(Python)や ESLint のセキュリティプラグインなどを使った関数コードの静的解析では、安全でないコーディングパターンを検出できます。また、手動テストでは各関数をトリガーできるすべてのイベントソースを洗い出し、それぞれに不正な形式のペイロードや悪意のあるペイロードを送ってテストする必要があります。OWASP Serverless Top 10 は、サーバーレスアーキテクチャに特化した包括的な脆弱性チェックリストを提供します。

# Prowler: check Lambda security posture
prowler aws --service lambda
# Checks: public URL, over-privileged roles, unencrypted env vars,
# outdated runtime, missing VPC config, excessive timeout

サーバーレスにおける共有責任

サーバーレスコンピューティングでは、共有責任モデルにおける責任の範囲がさらにプロバイダー側へ移ります。クラウドプロバイダーは、関数のランタイム環境、OS のパッチ、基盤となるインフラストラクチャのセキュリティ、物理施設を担当します。顧客は、関数コードのセキュリティ、IAM 権限の設計、Secret の管理、入力値の検証、依存関係の管理、ログ設定、ネットワークポリシーを引き続き担当します。インフラストラクチャに対する責任が減っても、セキュリティに対する責任が減るわけではありません。セキュリティ投資の重点が、主にアプリケーションレベルと IAM のセキュリティへ移るだけです。

クイックチェック

このレッスンで扱った CompTIA Security+(SY0-701)の概念について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、過剰な権限を持つ IAM ロールがサーバーレスにおける主要なリスクであり、各関数に専用の最小権限ロールが必要であること、イベントインジェクション攻撃が、入力値の検証を行わない関数に攻撃者が制御するデータを渡すあらゆるイベントソースを悪用すること、そしてサードパーティ製パッケージによる依存関係のサプライチェーンリスクが、IAM 認証情報や Secret にアクセスできる状態で関数の実行を侵害する可能性があることを学びました。次は、デプロイ前に設定ミスを検出するための Infrastructure as Code セキュリティスキャンについて学びます。

よくある質問

「サーバーレスと関数のセキュリティ」レッスンは無料ですか?

はい。「サーバーレスと関数のセキュリティ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

「サーバーレスと関数のセキュリティ」で何を学びますか?

サーバーレス関数固有の攻撃対象領域(過剰な権限を持つIAMロール、イベントインジェクション、依存関係のリスク)を特定し、最小権限と入力検証の制御を適用します。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cloud & IT Cert Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「サーバーレスと関数のセキュリティ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?

はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コンテナセキュリティ:イメージの堅牢化とランタイム保護
  2. Kubernetesセキュリティ:RBAC、ネットワークポリシー、Podセキュリティ
  3. サーバーレスと関数のセキュリティ
  4. Infrastructure as Codeのセキュリティスキャン
← Cloud & IT Cert Prepに戻る