Function ComputeでHTTPトリガーのJSON Webトークン (JWT) 認証を設定できます。 これにより、有効なトークンを持つクライアントのみがトリガーにアクセスできます。 これにより、不正または悪意のあるアクセスをブロックしてHTTPセキュリティを向上させます。
背景
概要
Function Computeでは、HTTPトリガーのJWT認証を有効にできます。 JWT (RFC 7519) は、リクエストを認証するための使いやすいトークンベースの方法です。 ユーザステータス情報は、クライアントによって提供されるトークン
に格納される。 関数またはサーバーはトークンを保存しません。 したがって、この方法は、サーバーレスアプリケーションに特に適しています。 Function Computeは、HTTPリクエストに対してJWT認証を実行するためにHTTPトリガー用に設定されたパブリックJSON Webキーセット (JWKS) を使用できます。 Function Computeは、HTTPトリガーの設定に基づいて、クレーム
をパラメーターとして関数に転送します。 これにより、関数ではリクエスト認証が不要になり、ビジネスロジックに集中できます。 認証プロセスの詳細とJWTのトークン
に関する基本情報については、「JWTベースの認証」および「JSON Webトークンの概要」をご参照ください。
JWT认证プロセス
上の図は、Function ComputeのHTTPトリガーに対するJWT認証のワークフローを示しています。 このプロセスでは、非対称暗号化アルゴリズムが使用される。 以下の項目は、プロセスの詳細を説明します。
クライアントは、認証要求をカスタム認証サービスに送信します。 ほとんどの場合、クライアントユーザーのユーザー名とパスワードはリクエストで指定されています。
カスタム認証サービスは、リクエスト内のユーザー名やパスワードなどの認証情報を読み取り、検証します。 リクエストが検証に合格した後、認証サービスは秘密鍵を使用して標準の
トークン
を生成します。カスタム認証サービスは、
トークン
を含む応答をクライアントに転送します。 クライアントは、トークン
をオンプレミスのマシンにキャッシュします。クライアントは、
トークン
を含むビジネスリクエストをHTTPトリガーに送信します。HTTPトリガーは、設定された公開キーを使用して、リクエスト内の
トークン
を検証します。検証に合格した後、リクエストは保護された関数に渡されます。
protected関数はリクエストを処理し、レスポンスを返します。
HTTPトリガーは、ビジネス応答をクライアントに転送します。
始める前に
関数と関数のHTTPトリガーを作成します。 詳細については、「関数の作成」および「手順1: トリガーの作成」をご参照ください。
制限事項
ビジネス要件に基づいてJWTを生成および配布できます。 Function Computeは、トリガー用に設定されたパブリックJWKSを使用してJWTを認証します。
kid
(キーID) を持たないJSON Webキー (JWK) がサポートされています。トークンは、
ヘッダー
、クエリ
パラメーター (GETメソッドを使用) 、フォームパラメーター (POSTメソッドを使用) 、またはcookie
から読み取ることができます。クレーム
をヘッダー
、クエリ
パラメーター (GETメソッドを使用) 、フォームパラメーター (POSTメソッドを使用) 、およびCookie
として関数に転送できます。HTTPトリガーのJWKSを設定できます。 JWKSが設定された後、システムは、
トークン
内のkidと同じkid
を持つパブリックJWKを求めてJWKSを検索し、パブリックJWKを使用してトークン
の署名を検証します。 トリガーのJWKSは、kid
が存在しないか、空の文字列に設定されているJWKを1つだけ持つことができます。次の表に、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に含める必要があります。
リクエスト内の
トークン
などの機密情報を保護し、トークンの漏洩を防ぐために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がトークンを取得すると、[プレフィックスの削除] パラメーターで指定されたプレフィックスが削除されます。重要プレフィックスの削除パラメーターを設定するときに、プレフィックスの後にスペースが存在するかどうかを確認します。 指定したプレフィックスの後にスペースを追加することを推奨します (例:
Bearer
) 。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設定の確認
このセクションでは、HTTPトリガーのJWT設定に基づいてツールを使用して、HTTPサービスに期待どおりにアクセスできるかどうかを確認する方法について説明します。 このセクションでは、Postmanが使用されます。
手順1で生成されたX.509 PEM形式の秘密鍵を秘密鍵として使用して、JWTを発行します。 次の手順では、Pythonを例として使用して、ローカルスクリプトを使用してトークンを生成するプロセスを示します。
PyJWTモジュールをインストールします。
pip install PyJWT
オンプレミスマシンで次のPythonスクリプトを実行して、JWTを生成します。
import jwt import time private_key = """ -----BEGIN PRIVATE KEY----- <Use the private key in the X.509 PEM format generated in Step 1> -----END PRIVATE KEY----- """ headers = { "alg": "RS256", "typ": "JWT" } payload = { "sub": "1234567890", "name": "John Snow", "iat": int(time.time()), # The time when the token was issued. "exp": int(time.time()) + 60 * 60, # Set the validity period of the token to 1 hour. } encoded = jwt.encode(payload=payload, key=private_key.encode(), headers=headers) print("Generated token: %s" % encoded)
Postmanを使用して、HTTPサービスに期待どおりにアクセスできるかどうかを確認します。
ページからインターネットURLを取得し、PostmanにURLを入力します。
Postmanの [ヘッダー] タブでトークンパラメーターを設定します。 次に、[送信] をクリックします。 次の表に、トークンの設定を示します。
名前
値
説明
Key
認証
[JWTトークン設定] セクションで指定したトークンの名前。
値
ベアラーeyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLg
JWTトークン設定のプレフィックスの削除パラメーターの値を含むJWT値。 この例では、Remove Prefixパラメーターは
Bearer
に設定されています。重要リクエストヘッダーのJWTパラメーターのプレフィックスとスペースは、[JWTトークン設定] セクションの [プレフィックスの削除] パラメーターと同じである必要があります。 それ以外の場合、トリガーがトークンを解析し、「invalidまたはexpired jwt」エラーを報告するときにエラーが発生します。