Function Compute で HTTP トリガーの JSON Web トークン(JWT)認証を設定できます。 この方法では、有効なトークンを持つクライアントのみがトリガーにアクセスできます。 これにより、不正アクセスや悪意のあるアクセスをブロックすることで、HTTP セキュリティが向上します。
バックグラウンド
概要
Function Compute では、HTTP トリガーの JWT 認証を有効にすることができます。 JWT(RFC 7519)は、リクエストを認証するための、使いやすくトークンベースのメソッドです。 ユーザーのステータス情報は、クライアントから提供される tokens に格納されます。 関数またはサーバーはトークンを保存しません。 したがって、このメソッドはサーバーレス アプリケーションに特に適しています。 Function Compute は、HTTP トリガーに設定されている公開 JSON Web Key Set(JWKS)を使用して、HTTP リクエストに対して JWT 認証を実行できます。 Function Compute は、HTTP トリガーの構成に基づいて、claims をパラメーターとして関数に転送します。 この方法では、関数でリクエスト認証は不要になり、ビジネス ロジックに集中できます。 認証プロセスと JWT の tokens の基本情報については、「JWT ベースの認証」および「JSON Web トークンの概要」をご参照ください。
JWT 認証プロセス
前の図は、Function Compute における HTTP トリガーの JWT 認証のワークフローを示しています。 このプロセスでは、非対称暗号化アルゴリズムが使用されます。 次の項目では、プロセスの詳細について説明します。
クライアントは、カスタム認証サービスに認証リクエストを送信します。 ほとんどの場合、クライアントユーザーのユーザー名とパスワードがリクエストで指定されます。
カスタム認証サービスは、リクエスト内のユーザー名やパスワードなどの認証情報を読み取って検証します。 リクエストが検証に合格すると、認証サービスは秘密鍵を使用して標準の
tokenを生成します。カスタム認証サービスは、
tokenを含むレスポンスをクライアントに転送します。 クライアントはtokenをオンプレミスのマシンにキャッシュします。クライアントは、
tokenを含むビジネスリクエストを HTTP トリガーに送信します。HTTP トリガーは、設定された公開鍵を使用して、リクエスト内の
tokenを検証します。検証に合格すると、リクエストは保護された関数に渡されます。
保護された関数はリクエストを処理し、レスポンスを返します。
HTTP トリガーは、ビジネスレスポンスをクライアントに転送します。
始める前に
関数と、その関数の HTTP トリガーを作成します。 詳細については、「関数の作成」および「ステップ 1: トリガーの作成」をご参照ください。
制限事項
ビジネス要件に基づいて JWT を生成および配布できます。 Function Compute は、トリガーに設定されている公開 JWKS を使用して JWT を認証します。
kid(キー ID)のない JSON Web Key(JWK)がサポートされています。トークンは、
header、queryパラメーター(GET メソッドを使用)、フォーム パラメーター(POST メソッドを使用)、またはcookieから読み取ることができます。claimsをheaders、queryパラメーター(GET メソッドを使用)、フォーム パラメーター(POST メソッドを使用)、およびcookiesとして関数に転送できます。HTTP トリガーの JWKS を設定できます。 JWKS が設定されると、システムは JWKS 内で、
kidがtokenの kid と同じ公開 JWK を検索し、その公開 JWK を使用してtokenの署名を検証します。 トリガーの 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 を使用して、リクエスト内の
tokensなどの機密情報を保護することをお勧めします。
手順
ステップ 1: JWT 認証の設定
Function Compute コンソール にログオンします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数詳細ページの下部にある [構成] タブをクリックします。 左側のナビゲーションウィンドウで、[トリガー] をクリックします。 表示されるページで、HTTP トリガーを見つけ、[アクション] 列の [変更] をクリックします。
トリガーの変更パネルで、次のパラメーターを設定し、[OK] をクリックします。
[認証方法] を [JWT 認証] に設定します。

[JWKS] を設定します。
HTTP トリガーの JWT 認証を設定するには、有効な JWKS を提供する必要があります。 JWKS は手動で生成することも、Web ブラウザーで JSON Web Key generator を検索して mkjwk.org などのオンライン ジェネレーターを使用することもできます。 Privacy Enhanced Mail(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 トークンの構成] セクションで、
tokenの読み取り位置と名前を選択します。tokenの 読み取り位置 パラメーターは、ヘッダー、Cookie、クエリ パラメーター、またはフォーム パラメーターに設定できます。tokenの 読み取り位置 パラメーターをヘッダーに設定する場合は、[パラメーター名] と [プレフィックスの削除] パラメーターを指定する必要があります。 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----- <ステップ 1 で生成された X.509 PEM 形式の秘密鍵を使用します。> -----END PRIVATE KEY----- """ headers = { "alg": "RS256", // 署名アルゴリズム "typ": "JWT" // トークンタイプ } payload = { "sub": "1234567890", // サブジェクト "name": "John Snow", // 名前 "iat": int(time.time()), # トークンが発行された時刻。 "exp": int(time.time()) + 60 * 60, # トークンの有効期間を 1 時間に設定します。 } encoded = jwt.encode(payload=payload, key=private_key.encode(), headers=headers) print("Generated token: %s" % encoded) // 生成されたトークン
Postman を使用して、HTTP サービスに想定どおりにアクセスできるかどうかを検証します。
ページからインターネット URL を取得し、Postman に入力します。
Postman の ヘッダー タブでトークン パラメーターを設定します。 次に、[送信] をクリックします。 次の表に、トークンの構成を示します。
名前
値
説明
キー
Authentication[JWT トークンの構成] セクションで指定したトークンの名前。
値
Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9uIFNub3ciLCJhZG1pbiI6dHJ1ZSwiZXhwIjo0ODI5NTk3NjQxfQ.eRcobbpjAd3OSMxcWbmbicOTLjO2vuLR9F2QZMK4rz1JqfSRHgwQVqNxcfOIO9ckDMNlF_3jtdfCfvXfka-phJZpHmnaQJxmnOA8zA3R4wF4GUQdz5zkt74cK9jLAXpokwrviz2ROehwxTCwa0naRd_N9eFhvTRnP3u7L0xn3ll4iOf8Q4jS0mVLpjyTa5WiBkN5xi9hkFxd__p98Pah_Yf0hVQ2ldGSyTtAMmdM1Bvzad-kdZ_wW0jcctIla9bLnOo-Enr14EsGvziMh_QTZ3HQtJuToSKZ11xkNgaz7an5de6PuF5ISXQzxigpFVIkG765aEDVtEnFkMO0xyPGLgJWT 値。 [JWT トークンの構成] の プレフィックスの削除 パラメーターの値が含まれています。 この例では、プレフィックスの削除 パラメーターは
Bearerに設定されています。重要リクエストヘッダーの JWT パラメーターのプレフィックスとスペースは、[JWT トークンの構成] セクションの [プレフィックスの削除] パラメーターのプレフィックスとスペースと同じである必要があります。 それ以外の場合、トリガーがトークンを解析するときにエラーが発生し、「無効または期限切れの jwt」エラーが報告されます。