HTTPサービスのセキュリティを向上させるために、Function ComputeでHTTPトリガーのJSON Web Token (JWT) 認証を設定できます。 これにより、非認証アクセスが拒否され、悪意のある攻撃がブロックされます。 有効なJWTが設定されているクライアントのみがHTTPサービスにアクセスできます。
背景
概要
Function Computeでは、HTTPトリガーのJWT認証を有効にできます。 JWTは、トークンに基づいてリクエストを認証する方法を定義するオープンスタンダード (RFC: 7519) です。 ユーザステータス情報は、クライアントによって提供されるトークン
に格納される。 関数またはサーバーはトークンを保存しません。 したがって、JWT認証はサーバーレスアプリケーションに適しています。 Function Computeは、HTTPトリガー用に設定されたパブリックJSON Webキーセット (JWKS) を使用して、HTTPリクエストにJWT認証を実装できます。 Function Computeは、HTTPトリガーの設定に基づいてクレーム
を関数に転送します。 このようにして、関数は手動でリクエストを認証する必要なしにビジネスロジックに集中できます。 認証プロセスの詳細とJWTのトークン
に関する基本情報については、「JWTベースの認証」および「JSON Webトークンの概要」をご参照ください。
JWT认证プロセス
上の図は、Function ComputeのHTTPトリガーに対するJWT認証のワークフローを示しています。 このプロセスでは、非対称暗号化アルゴリズムが使用される。 次の情報は、プロセスの詳細を説明しています。
クライアントは、認証要求をカスタム承認サーバーに送信します。 ほとんどの場合、ユーザーのユーザー名とパスワードはリクエストで指定されています。
カスタム承認サーバーは、認証要求内のユーザー名やパスワードなどの情報を読み取り、検証します。 リクエストが認証を通過した後、サーバーは秘密鍵を使用して標準の
トークン
を生成します。カスタム承認サーバーは、
トークン
を含む応答をクライアントに転送します。 クライアントは、トークン
をオンプレミスのマシンにキャッシュします。クライアントは、
トークン
を含むビジネスリクエストをHTTPトリガーに送信します。HTTPトリガーは、設定された公開キーを使用して、リクエスト内の
トークン
を検証します。トークンが検証された後、リクエストは保護された関数に渡されます。
protected関数は、要求を処理して応答します。
HTTPトリガーは、ビジネス応答をクライアントに転送します。
前提条件
制限事項
ビジネス要件に基づいてJWTを生成および配布できます。 Function Computeは、トリガー用に設定されたパブリックJWKSを使用してJWTを認証します。
kid
なしのJSON Webキー (JWK) がサポートされています。トークンは、
ヘッダー
、クエリ
(GETメソッドを使用) 、フォーム (POSTメソッドを使用) 、またはcookie
パラメーターから読み取ることができます。クレーム
をヘッダー
、クエリ
(GETメソッドを使用) 、フォーム (POSTメソッドを使用) 、またはCookie
として関数に転送できます。HTTPトリガーのJWKSを設定できます。 JWKSを設定すると、
トークン
のkid
パラメーターに似たパブリックJWKが検索され、トークンの署名を検証するために使用されます。 JWKのkid
を1つまで空にしたり、kidを空の文字列に設定したりできます。次の表に、Function ComputeのJWTでサポートされているアルゴリズムを示します。
署名アルゴリズム
alg値
RSASSA-PKCS1-V1_5
RS256、RS384、またはRS512
RSASSA-PSS
PS256、PS384、またはPS512
楕円カーブ (ECDSA)
ES256、ES384、またはES512
HMAC
HS256、HS384、またはHS512
EdDSA
EdDSA
重要ハッシュベースのメッセージ認証コード (HMAC) 署名アルゴリズムは、対称暗号化を使用しますが、これは安全性が低くなります。 セキュリティを確保するために、非対称暗号化アルゴリズムを使用することを推奨します。
非対称暗号化アルゴリズムを使用する場合は、セキュリティのために公開鍵に関する情報のみをJWTに含める必要があります。 JTWにプライベートキーを含める必要はありません。
HTTPSを使用して、リクエスト内の
トークン
などの機密情報を保護し、トークンのリークを防ぐことを推奨します。
手順
手順1: JWT認証の設定
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
[関数] ページで、目的の関数の名前をクリックします。 表示される [機能の詳細] ページで、[トリガー管理 (URL)] タブをクリックします。
トリガー管理 (URL)タブで、HTTPトリガーのアクション列で変更をクリックします。
[トリガーの変更] パネルで、次のパラメーターを設定し、OK をクリックします。
[認証方法] を [JWT認証] に設定します。
設定JWKS.
HTTPトリガーのJWT認証を設定するには、有効なJWKSを指定する必要があります。 手動でJWKSを準備するか、WebブラウザーでJSON web Keyジェネレーターを検索して、mkjwk.orgなどのオンラインジェネレーターを使用することができます。 プライバシー強化メール (PEM) 形式のキーがある場合は、jwxなどのツールを使用してキーをJWKS形式に変換できます。
この例では、mkjwk.orgを使用してJWKSを生成します。 JWKSを生成するページで、Show X.509をYesに設定して秘密鍵を表示します。 プライベートキーを使用してコードでJWTを発行する場合は、安全に保管してください。 Function Computeコンソールで、公開鍵の内容をJWKSのkeys配列にコピーできます。 詳細は以下の図をご参照ください。
サンプルコード:
{ "keys": [ { "alg": "RS256", "e": "AQAB", "kty": "RSA", "n": "u1LWgoomekdOMfB1lEe96OHehd4XRNCbZRm96RqwOYTTc28Sc_U5wKV2umDzolfoI682ct2BNnRRahYgZPhbOCzHYM6i8sRXjz9Ghx3QHw9zrYACtArwQxrTFiejbfzDPGdPrMQg7T8wjtLtkSyDmCzeXpbIdwmxuLyt_ahLfHelr94kEksMDa42V4Fi5bMW4cCLjlEKzBEHGmFdT8UbLPCvpgsM84JK63e5ifdeI9NdadbC8ZMiR--dFCujT7AgRRyMzxgdn2l-nZJ2ZaYzbLUtAW5_U2kfRVkDNa8d1g__2V5zjU6nfLJ1S2MoXMgRgDPeHpEehZVu2kNaSFvDUQ", "use": "sig" } ] }
[JWTトークン設定] セクションで、
トークン
の読み取り位置とトークン
の名前を選択します。トークン
の読み取り位置パラメーターをヘッダー、Cookie、クエリパラメーター、またはフォームパラメーターに設定できます。トークン
の読み取り位置パラメーターをヘッダーに設定した場合、Function Computeがトークンを取得するときに削除するプレフィックスを指定する必要があります。では、JWTクレーム変換セクションで、パラメーターを関数に渡す位置、パラメーターの元の名前、およびパラメーターが関数に渡された後のパラメーターの新しい名前を選択します。
マッピングパラメーターの位置パラメーターをヘッダー、Cookie、クエリパラメーター、またはフォームパラメーターに設定できます。
リクエストマッチングモードを指定します。
すべて一致: すべてのHTTPリクエストは、JWTを使用して検証する必要があります。
ホワイトリストモード: [リクエストパスのホワイトリスト] で指定されたパスから送信されたHTTPリクエストは、JWTを使用して検証されません。 他の要求は、JWTを使用して検証される。
ブラックリストモード: [リクエストパスのブラックリスト] で指定されたパスから送信されたHTTPリクエストは、JWTを使用して検証されます。 その他のリクエストは、JWTを使用して検証されません。
ホワイトリストモードとブラックリストモードは、次の対応モードをサポートしています。
完全一致
パスが指定されたパスとまったく同じである場合にのみ、パスが一致します。 たとえば、[リクエストパスのブラックリスト] パラメーターを /aに設定した場合、/aから送信されるリクエストにはJWT検証が必要です。 /a/ から送信されるリクエストには、JWT検証は必要ありません。
ファジーマッチ
値は、アスタリスクのワイルドカード (*) が付加されたパスに設定できます。 たとえば、[リクエストパスのブラックリスト] パラメーターを /login/* に設定した場合、/login/ というプレフィックスが付いたパス (/login/aや /login/b/c/dなど) から送信されたリクエストは、JWTを使用して検証されます。
手順2: HTTPトリガーのJWT設定の確認
このセクションでは、インターネットエンドポイント、内部エンドポイント、トークンなどのHTTPトリガーの設定に基づいて、ツールを使用してHTTPサービスに期待どおりにアクセスできるかどうかについて説明します。 このセクションでは、デバッグとテストにPostmanを使用します。
手順1で生成された秘密鍵を使用してJWTを作成します。
Postmanを使用して、HTTPサービスにアクセスできるかどうかを確認します。
管理する関数の [トリガー管理 (URL)] タブで、HTTPトリガーのインターネットエンドポイントを取得します。 次に、Postmanページのアドレスバーにエンドポイントを入力します。
Postmanのヘッダーでトークンのパラメーターを設定します。 次の表に、トークンの設定を示します。
パラメーター
値
説明
Key
認証
[JWTトークン設定] セクションで指定したトークンの名前。
値
ベアラーeyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLg
トークンの読み取りに使用されるヘッダー。 削除するプレフィックスとトークンの間にスペースを残す必要があります。 プレフィックスを除いたヘッダ部分がトークンとして使用される。
HTTPサービスの返された情報を表示するには、[送信] をクリックします。 次の情報が返されます。
返された情報の
nametofunction
は、クレームによって関数に渡される名前を示します。
カスタムドメイン名でJWT認証を使用する
上の図は、HTTPトリガーがリクエストを処理する前に、カスタムドメイン名がユーザーリクエストを処理することを示しています。 JWT認証はHTTPトリガーで実行されます。 このセクションでは、カスタムドメイン名が設定されているシナリオでJWT認証を使用する方法について説明します。
書き換えポリシーが設定されていないカスタムドメイン名
書き換えポリシーが設定されていないカスタムドメイン名に対してルートが設定されている場合、着信HTTPリクエストのパスはカスタムドメイン名のパスです。
たとえば、次の表に、カスタムドメイン名www.fc-jwt.com
のルートルールを示します。 JWT-demo
関数のHTTPトリガーのjwt設定の [リクエストパスのブラックリスト] パラメーターの値は、/fc-jwt/auth/* です。
パス | サービス | 関数 | バージョン |
/fc-jwt/* | jwt | jwt-デモ | 1 |
リクエストのURLが /fc-jwt/auth/aliyunの場合、リクエストのパスが [リクエストパスのブラックリスト] パラメーターで指定された値と一致するため、HTTPトリガーはHTTPリクエストを検証します。
書き換えポリシーが設定されたカスタムドメイン名
書き換えポリシーが設定されたカスタムドメイン名にルートが設定されている場合、受信HTTPリクエストのパスはURLに書き換えられます。 カスタムドメイン名の書き換え機能の詳細については、「書き換えポリシーの設定 (パブリックレビュー) 」をご参照ください。
たとえば、次の表に、カスタムドメイン名www.fc-jwt.com
のルートルールを示します。 JWT-demo
関数のHTTPトリガーのjwt設定では、[リクエストパスのブラックリスト] パラメーターに /fc-jwt/auth/* が指定され、ワイルドカード書き換えポリシーが設定されています。 一致ルールは /fc-jwt/*
で、置換ルールは /$1
です。
パス | サービス | 関数 | バージョン |
/fc-jwt/* | jwt | jwt-デモ | 1 |
リクエストのURLが /fc-jwt/auth/aliyunの場合、書き換えられたURLは /auth/aliyunです。 ワイルドカード書き換えルールの詳細については、「書き換えポリシーの設定 (パブリックレビュー) 」をご参照ください。 HTTPトリガーはリクエストを検証しません。 この場合、HTTPトリガーへのリクエストのパスは /auth/aliyunで、[リクエストパスのブラックリスト] パラメーターの値と一致しません。
リクエストパスブラックリストパラメーターを /auth/* に設定した場合、HTTPトリガーは、URLが /fc-JWT /auth/aliyunであるリクエストに対してjwt認証を実行します。