[レポート]SEC362: サーバーレスアプリケーションを保護するためのベストプラクティス #reinvent

re:Invent2018 SEC362のセッションレポートです。サーバレスアプリケーションのセキュリティベストプラクティスについて紹介されました。
2018.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、臼田です。

本記事はAWSの一大イベントであるre:Inventの下記セッションについてのレポートです。

SEC362 - Best Practices for Securing Serverless Applications

Serverless for security professionals is a concept that deviates from traditional Infrastructure such as servers, network, and storage infrastructure. Serverless represents a new ecosystem of operational and security paradigms and enables new data flows. In this talk, we walk through a new model for securing serverless applications. We dissect a serverless application and examine the security best practices implemented. Participants learn to secure serverless applications using Amazon CloudFront, AWS WAF, Amazon Macie, AWS Secrets Manager, Amazon Cognito, AWS IAM, AWS KMS, AWS CloudTrail, AWS Config, and DevSecOps. Walk away with an understanding of the options and best practices for securing serverless workloads and adopting secure DevOps practices.

Armando Leite - Senior Manager, AWS

サーバレスサービスであるAWS LambdaやAPI Gateway等のサーバレスサービスをどのように保護すればいいかを紹介するセッションでした。

レポート

このセッションではサーバレスアプリケーションのベストプラクティスを紹介します。

まずはIdentity and Access Managementについてです。

サーバレスサービスで特にAPI Gatewayを利用する場合には認証手段は大きく3種類あります。

  • IAM
  • Cognito
  • Custom Lambda Authorizer

アイデンティティの管理はなるべくこれらの適切なサービスを利用すべきで、個別に実装する場合はよく注意する必要があります。

管理するIDが多いならCognitoを利用し、外部の認証DBがある場合にはCustom Lambda Authorizerを利用しましょう。

続いてIAMの設定です。

すべてのLambdaファンクションに対して最小権限を設定しましょう。最悪不具合があった場合でも必要外のリソースにアクセスされることを防ぎます。

続いてDetective control

各サービスを利用してデータを取得し異常に気づく必要があります。

  • CloudTrail
    • 様々なAWSへのAPIのログ
  • API Gateway
    • ソースIPとかユーザの情報が取れる
  • CloudWatch
    • Lambdaのログを確認
    • VPCフローログとかも利用できる
    • 簡単なクエリならすぐ検索できる
  • AWS X-Ray
    • アプリケーションのパフォーマンスをモニタリングできる
    • リクエストレスポンスにかかっている時間の細部がわかる

続いてデータプロテクション

  • センシティブデータは暗号化されたパラメータストアかシークレットマネージャを利用する
  • 特に機微なデータは誤ったロギングを防ぐためにクライアントサイドの暗号化を行う
    • 特にクレジットカードなど
  • 機微なデータはPOSTを利用してクエリストリングに記述することを避ける

入力値バリデーションについて

  • API Gateway側ではベージックなバリデーションを行う
    • 基本的なJSONの構造であることを確認する
  • アプリケーション要件のバリデーションはLambdaで適切な手段で行う
    • ライブラリやLambdaファンクション、サービスなどを利用する
    • 独自で実装はしない(脆弱性の源になる)

依存関係の検証

  • サードパーティライブラリの脆弱性はデプロイ前にスキャンする
  • DevOps/CI/CDによる自動テストとライブラリの自動スキャンを検討する

チョークトーク

  • Q: AWS WAFは利用できるか
    • A: 可能。今だとAPI GatewayでAWS WAFを直接利用できる

【新機能】API Gateway のステージに AWS WAF を直接関連づけられるようになりました

  • Q: GuardDutyは使えるか
    • A: 使えるとは言えるがGuardDutyは目的が違う。VPCフローログを確認するような用途には向いている
  • Q: LambdaをVPCにすることでセキュリティ的な意味があるか
    • A: VPC Lambdaは例えばDX経由でインターネットを出ないで実行するようなケースに向いている。セキュリティのためのものではない
  • Q: Lambdaのバリデーションチェックはどのように行えばいいか
    • A: 適切なメソッドを選択すること、入力値のそれぞれの方を文字数制限などを定義すること。swaggerなどで管理すると楽

まとめ

サーバレスアプリケーションのセキュリティベストプラクティスについて紹介されました。

一つ一つのことは当たり前ですが、きちんと守って行きましょう。