Function Computeでは、HTTPトリガーのJSON Web Token (JWT) 認証を設定して、有効なJWTを持つクライアントのみが関数にアクセスできるようにします。 これにより、HTTPサービスのセキュリティが強化され、不正アクセスや悪意のある攻撃が効果的に防止されます。
背景情報
概要
Function Computeでは、HTTPトリガーのJWT認証を有効にできます。 JWT (RFC 7519) は、リクエストを認証するための使いやすいトークンベースの方法です。 ユーザステータス情報は、クライアントによって提供されるトークン
に格納される。 関数またはサーバーはトークンを保存しません。 したがって、この方法は、サーバーレスアプリケーションに特に適しています。 Function Computeは、HTTPトリガー用に設定されたパブリックJSON Webキーセット (JWKS) を使用して、HTTPリクエストにJWT認証を実装できます。 Function Computeは、HTTPトリガーの設定に基づいてクレーム
を関数に転送します。 これにより、関数ではリクエスト認証が不要になり、ビジネスロジックに集中できます。 認証プロセスの詳細とJWTのトークン
に関する基本情報については、「JWTベースの認証」および「JSON Webトークンの概要」をご参照ください。
JWT认证プロセス
上の図は、Function ComputeのHTTPトリガーに対するJWT認証のワークフローを示しています。 このプロセスでは、非対称暗号化アルゴリズムが使用される。 次の項目は、プロセスの詳細を説明します。
クライアントは、認証要求をカスタム認証サービスに送信します。 ほとんどの場合、リクエストにはユーザー名とパスワードが指定されています。
カスタム認証サービスは、リクエスト内のユーザー名やパスワードなどの認証情報を読み取り、検証します。 リクエストが検証に合格した後、認証サービスは秘密鍵を使用して標準の
トークン
を生成します。カスタム認証サービスは、
トークン
を含む応答をクライアントに転送します。 クライアントは、トークン
をオンプレミスのマシンにキャッシュします。クライアントは、
トークン
を含むビジネスリクエストをHTTPトリガーに送信します。HTTPトリガーは、設定された公開キーを使用して、リクエスト内の
トークン
を検証します。検証に合格した後、リクエストは保護された関数に渡されます。
protected関数はリクエストを処理し、レスポンスを返します。
HTTPトリガーは、ビジネス応答をクライアントに転送します。
前提条件
関数とHTTPトリガーが作成されます。 詳細については、「関数の作成」および「手順1: トリガーの作成」をご参照ください。
制限事項
ビジネス要件に基づいた方法でJWTを生成および配布できます。 Function Computeは、HTTPトリガー用に設定されたパブリックJWKSを使用してJWTを認証します。
kid
(キーID) なしのJSON Webキー (JWK) がサポートされています。トークンは、
ヘッダー
、クエリ
パラメーター (GETメソッドを使用) 、フォームパラメーター (POSTメソッドを使用) 、またはcookie
から読み取ることができます。クレーム
をヘッダー
、クエリ
パラメーター (GETメソッドを使用) 、フォームパラメーター (POSTメソッドを使用) 、またはCookie
として関数に転送できます。HTTPトリガーのJWKSを設定できます。 JWKSが設定された後、システムは、トークン内のkidに一致する
kid
を持つパブリックJWKをJWKSから検索し、このパブリックJWKを使用してトークン
の署名を検証します。 トリガーのJWKSのJWKのkid
を最大1つだけ指定しないか、空の文字列に設定できます。次の表に、Function ComputeのJWTでサポートされているアルゴリズムを示します。
署名アルゴリズム
alg value
RSASSA-PKCS1-V1_5
RS256、RS384、またはRS512
RSASSA-PSS
PS256、PS384、またはPS512
楕円カーブ (ECDSA)
ES256、ES384、またはES512
HMAC
HS256、HS384、またはHS512
EdDSA
EdDSA
重要ハッシュベースのメッセージ認証コード (HMAC) 署名アルゴリズムは、対称暗号化を使用する。 この暗号化は安全性が低い。 セキュリティを強化するために、非対称暗号化アルゴリズムを使用することを推奨します。
非対称暗号化アルゴリズムを使用する場合は、セキュリティのために秘密鍵ではなく、公開鍵に関する情報のみをJWTに含める必要があります。
HTTPSを使用して、リクエスト内の
トークン
などの機密情報を保護し、トークンのリークを防ぐことを推奨します。
手順
ステップ1: JWT認証の設定
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
機能の詳細ページの下部で、[設定] タブをクリックします。 左側のナビゲーションウィンドウで、[トリガー] をクリックします。 表示されるページで、HTTPトリガーを見つけ、[操作] 列の [変更] をクリックします。
[トリガーの変更] パネルで、次のパラメーターを設定し、OKをクリックします。
[認証方法] を [JWT認証] に設定します。
JWKSを設定します。
HTTPトリガーのJWT認証を設定するには、有効なJWKSを指定する必要があります。 JWKSを自分で生成するか、WebブラウザーでJSON web Keyジェネレーターで検索して、mkjwk.orgなどのオンラインジェネレーターを取得できます。 PEM形式のキーがある場合は、jwxなどのツールを使用してキーをJWKS形式に変換できます。
このトピックでは、mkjwk.orgを例として使用して、JWKSを生成する方法について説明します。 次の図に示す例では、[キーの使用] を [署名] に、[アルゴリズム] を [RS256] に、[X.509を表示] を [はい] に設定し、[生成] をクリックして秘密鍵を生成します。 コードでは、秘密鍵を使用してJWTを発行する必要があります。 公開鍵の内容をコピーし、コピーした内容をコンソールのJWKS入力ボックスに貼り付けます。
次のサンプルコードは、設定されたJWKSを示しています。
{ "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: JWT認証の検証
Postmanなどのツールに、アクセスするURLや使用するトークンなどの情報を入力して、HTTPサービスにアクセスできるかどうかを確認します。
「手順1: JWT認証の設定」で生成された秘密鍵を使用して、JWTを作成します。
Postmanを使用して、HTTPサービスに期待どおりにアクセスできるかどうかを確認します。
タブからインターネットURLを取得し、PostmanにURLを入力します。
Postmanの [ヘッダー] タブでトークンパラメーターを設定します。 次の表に例を示します。
列
例
説明
Key
認証
[JWTトークン設定] セクションで指定したトークンの名前。
値
ベアラーeyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLg
トークンの読み取りに使用されるヘッダー。 削除するプレフィックスとトークンの間にスペースを残す必要があります。 プレフィックスを除いたヘッダ部分がトークンとして使用される。
[送信] をクリックし、HTTPサービスの返された情報を表示します。 次の図に例を示します。
返された情報の
nametofunction
は、クレームによって関数に渡される名前を示します。