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

この記事では、セキュリティ担当者がサーバーレスな Functions に実装できる Azure のサービスとアクティビティについて説明します。 これらのガイドラインとリソースは、安全なコードを開発し、安全なアプリケーションをクラウドにデプロイするのに役立ちます。

計画

サーバーレスな Azure Functions の安全なアプリケーション環境の主な目的は、アプリケーションの実行を保護し、セキュリティの問題を速やかに特定、解決して、同様の問題が将来発生しないようにすることです。

OWASP サーバーレス トップ 10」では、サーバーレス アプリケーションの最も一般的なセキュリティ脆弱性が説明されているほか、それらを特定して防止する基本的な技術が紹介されています。

サーバーレス関数の開発、デプロイ、操作に関するセキュリティ計画は、多くの点において Web ベースやクラウド ホスト型のアプリケーションのものと非常に似通っています。 Azure App Service には、関数アプリ向けのホスティング インフラストラクチャが用意されています。 「Azure Functions のセキュリティ保護」の記事では、関数コードを実行する場合のセキュリティ戦略と、App Service を利用して関数をセキュリティで保護する方法について説明します。

Azure セキュリティ、ベスト プラクティス、共同責任の詳細については、以下を参照してください。

展開

サーバーレスな Functions のアプリケーションを運用環境用に用意するには、セキュリティ担当者は以下を行う必要があります。

  • 定期的なコード レビューを実施し、コードとライブラリの脆弱性を特定する。
  • Functions による実行に必要なリソースのアクセス許可を定義する。
  • インバウンドおよびアウトバウンド通信のネットワーク セキュリティ規則を構成する。
  • 機密データへのアクセスを特定して分類する。

Azure Functions 用の Azure セキュリティ ベースライン」の記事には、ご自身のデプロイのセキュリティ体制を改善するために役立つ追加の推奨事項が含まれています。

コードの安全性を確保する

コード内のセキュリティ脆弱性とエラーを見つけて、プロジェクトと依存関係のセキュリティ脆弱性を管理します。

詳細については、次を参照してください。

入力の検証を実行する

サーバーレス Functions は、Blob Storage、Azure Cosmos DB NoSQL データベース、イベント ハブ、キュー、Graph イベントなど、さまざまなイベント ソースによってトリガーされる場合があります。 厳密には、インジェクションは API 呼び出しから直接送られてくる入力に限りません。 Functions では、使用可能なイベント ソースからその他の入力を利用する場合もあります。

原則として、入力は信頼せず、それが有効であると思い込まないようにします。 入力をサニタイズまたは検証する安全な API を常に使用しましょう。 可能な場合は、SQL クエリの用意されたステートメントのように、変数をバインドまたはパラメーター化する API を使用します。

詳細については、次を参照してください。

開発、テスト、運用用の HTTP エンドポイントを保護する

Azure Functions では、HTTP 関数のエンドポイントにアクセスするのをより困難にするようにキーを使用できます。 運用環境で関数エンドポイントを完全に保護するには、次の関数アプリレベルのセキュリティ オプションをどれか実装することを検討してください。

詳細については、「運用環境で HTTP エンドポイントを保護します」を参照してください。

Azure ロールベースのアクセス制御 (Azure RBAC) を設定する

Azure のロールベースのアクセス制御 (Azure RBAC) には、Azure リソースへのアクセスを制御するためにユーザー、グループ、サービス プリンシパル、マネージド ID に割り当てられる複数の Azure 組み込みロールが用意されています。 組み込みロールでご自分の組織のニーズに対応できない場合、独自の Azure カスタム ロールを作成することができます。

デプロイ前に各 Functions アプリを確認して、余計なアクセス許可がないかを調べます。 関数を慎重に検証して、正常な実行に必要なだけの "最小特権" のアクセス許可が各関数に適用されるようにします。

Azure RBAC を使用して、特定のスコープ内のユーザー、グループ、アプリケーションにアクセス許可を割り当てます。 ロール割り当てのスコープには、サブスクリプション、リソース グループ、または単独のリソースを指定できます。 可能な限り、ワイルドカードの使用は避けてください。

Azure RBAC の詳細については、以下の項目を参照してください。

マネージド ID とキー コンテナーを使用する

クラウド アプリケーションの構築時における一般的な課題は、クラウド サービスへの認証用の資格情報をコード内でどのように管理するかです。 資格情報は、アプリケーション コード、開発者のワークステーション、またはソース管理で一切表示されないようにする必要があります。 代わりに、キー コンテナーを使用してキーと資格情報の格納と取得を行います。 Azure Key Vault には、資格情報、シークレット、その他のキーを安全に格納する方法が用意されています。 コードによって Key Vault に対する認証が行われ、資格情報が取得されます。

詳細については、「App Service と Azure Functions の Key Vault 参照を使用する」を参照してください。

マネージド ID を使用すると、特定のアクセス キーまたは接続文字列なしで Functions アプリがアクセス リソース (キー コンテナーやストレージ アカウントなど) にアクセスできます。 ログの完全な監査証跡には、リソースへの要求を実施した ID が表示されます。 Azure RBAC とマネージド ID を使用して、Azure Functions アプリケーションがアクセスできるリソースを細かく厳密に制御します。

詳細については、次を参照してください。

Shared Access Signature (SAS) トークンを使用してリソースへのアクセスを制限する

Shared Access Signature (SAS) により、データのセキュリティを損なうことなく、ストレージ アカウント内のリソースへのセキュリティ保護された委任アクセスが提供されます。 SAS を使用すると、クライアントがデータにアクセスする方法をきめ細かく制御できます。 パラメーターの中でも、クライアントがアクセスできるリソース、それらのリソースに対して持つアクセス許可、SAS の有効期間などを制御できます。

詳細については、「Shared Access Signatures (SAS) を使用して Azure Storage リソースへの制限付きアクセスを許可する」を参照してください。

BLOB ストレージを保護する

機密データを特定して分類し、機密データのストレージを最小限の必要な内容のみに抑えます。 機密データのストレージのために、多要素認証と転送中と保存中のデータ暗号化を追加します。 SAS トークンを使用して、Azure Storage リソースへの制限付きアクセスを許可します。

詳しくは、「BLOB ストレージのセキュリティに関する推奨事項」を参照してください。

Optimization

アプリケーションが運用環境に配置されると、セキュリティ担当者はワークフローの最適化とスケーリングの準備を支援できます。

Microsoft Defender for Cloud を使用してセキュリティに関する推奨事項を適用する

Microsoft Defender for Cloud は、潜在的なセキュリティ脆弱性を特定して推奨事項を作成する、アプリケーション用のセキュリティ スキャン ソリューションです。 推奨事項にしたがって、必要なコントロールを構成し、リソースを強化、保護できます。

詳細については、次を参照してください。

アプリケーション ガバナンス ポリシーを適用する

一元的で一貫性のある実施内容と安全対策を大規模にアプリケーションに適用します。 詳細については、「Azure Policy の組み込みのポリシー定義」を参照してください。

次のステップ