IBM Cloud Docs
Web チャット・セキュリティーの有効化

Web チャット・セキュリティーの有効化

Web チャット・セキュリティーを有効にするには、Web アプリケーション・サーバー・コード、Web チャット組み込みスクリプト、および Web チャット統合設定を変更する必要があります。

セキュリティーを有効にする完全な NodeJS リファレンス実装については、 watsonx Assistant Web チャットのセキュリティーの有効化を参照してください。

開始前に

セキュリティーを有効にする前に、 RS256 公開鍵と秘密鍵のペアを作成する必要があります。 OpenSSL や PuTTYgenなどのツールを使用できます。

例えば、 OpenSSLを使用してコマンド・プロンプトで鍵ペアを作成するには、コマンド openssl genrsa -out key.pem 2048 を使用します。

生成された鍵ペアを安全な場所に保存します。

これらの鍵がサーバー・コードによってのみアクセス可能であることを確認してください。 Web サイトを介してクライアント・ブラウザーに渡さないでください。

JWT の生成

Web チャット・セキュリティーを使用するには、各メッセージとともに JSON Web トークン (JWT) をアシスタントに送信するように Web サイトで Web チャットを構成する必要があります。 JWT は、Web サイトから送信されるメッセージの発信元を検証するために使用され、オプションで追加の暗号化データを送信するために使用されます。 Web サイトでは、各セッションの開始時、および既存の JWT の有効期限が切れるたびに、新しい JWT を生成できる必要があります。

Web サイト・コードに JWT をハードコーディングしたり、ユーザー間で JWT を共有したりしないでください。

サーバー上で、秘密鍵で署名された JSON Web トークン (JWT) を生成して返す関数を実装します。 このトークンを使用して、Web サイトから送信されたメッセージの発信元を検証し、オプションで追加の暗号化データを送信します。

ほとんどのプログラミング言語は、トークンの生成に使用できる JWT ライブラリーが提供されています。 署名された JWT を検証するために、Web チャット統合は jsonwebtoken ライブラリーと RS256 アルゴリズムを使用します。

JWT ペイロードでは、以下のクレームを指定する必要があります。

  • sub: Web チャットと対話しているお客様を識別する固有のユーザー ID。 これは、生成された固有 ID (匿名ユーザーの場合) または認証されたユーザー ID のいずれかです。 sub 値の使用方法について詳しくは、 Web チャットでのユーザーの認証 を参照してください。

    セキュリティーを確保するには、JWT を各ユーザーに固有のものにする必要があります。 ユーザーの認証済みログイン情報、または生成された固有 ID のいずれかを使用します。 複数のユーザーに対して同じ JWT または同じ sub 値を再使用しないでください。

  • exp: これを超えると JWT が無効になる有効期限。 多くの JWT ライブラリーは、この値を自動的に設定します。 一時的な exp クレーム (例えば、 1h) を設定します。

    exp クレームなしで JWT を作成しないでください。 この要求は正式には必須ではありませんが、JWT へのアクセス権限を持つすべてのユーザーがコピーして後でアシスタントにアクセスするために使用できるため、この要求を省略すると機密漏れが発生します。 有効期限を設定すると、このエクスポージャーが制限されます。

以下の JavaScript の例は、 jsonwebtoken ライブラリーを使用して JWT を生成する方法を示しています。

// Sample NodeJS code on your server.
const jwt = require('jsonwebtoken');

// Returns a signed JWT signed with the RS256 algorithm.
function createJWT() {
  const payload = {
    sub: 'some-user-id', // Identifies user for billing purposes
  };
  // The "expiresIn" option adds an "exp" claim to the payload.
  return jwt.sign(payload,
    process.env.YOUR_PRIVATE_RSA_KEY,
    { algorithm: 'RS256', expiresIn: '1h' });
}

JWT を組み込むための Web チャットの構成

署名付き JWT を生成する機能を実装したので、Web チャット・インスタンスを更新して、送信する各メッセージに署名付き JWT を組み込む必要があります。 Web チャット・セキュリティーを有効にすると、適切な秘密鍵で署名されていないメッセージはすべて拒否されます。

Web サイト HTML で、Web チャット組み込みスクリプトを更新して、各セッションの開始時、および既存の JWT の有効期限が切れるたびに、新しい JWT を指定します。 これを行う最も簡単な方法は、 identityTokenExpired イベントをサブスクライブし、そのイベントを受信したときに新しい JWT を生成することです。 identityTokenExpired イベントは、以下の両方の状態で起動されます。

  • identityToken 構成オプションを使用して JWT が指定されなかった場合は、新規セッションの開始時。

  • 前に指定した JWT の有効期限が切れたとき。

onLoad イベント・ハンドラーで、 on() インスタンス・メソッドを使用して、 identityTokenExpired イベントをサブスクライブします。

コールバックで、新しい JWT を生成するために実装したサーバー上の関数を呼び出します。 次に、以下の例のように、イベントの identityToken パラメーターを使用して、新しい JWT を指定します。

instance.on({ type: 'identityTokenExpired',
              handler: async function(event) {
                const jwtFromServer = await fetch('http://example.com:3001/createJWT');
                event.identityToken = jwtFromServer;
}});

指定した新規 JWT は、Web サイト上の Web チャット・インスタンスから (トークンの有効期限が切れるまで) 後続の各メッセージとともに自動的に送信されます。

Web チャット構成オブジェクトの identityToken プロパティーを使用して、セッションの開始時に JWT を指定することもできます。 ただし、セッション中に JWT の有効期限が切れないことが確実でない限り、 identityTokenExpired 用のイベント・ハンドラーを作成する必要があります。

Web チャット設定の更新

署名付き JWT を送信するように Web チャットを構成したので、Web チャット統合設定で Web チャット・セキュリティーを有効にすることができます。

Web チャット・セキュリティーを有効にすると、Web チャット・インスタンス (署名付き JWT を送信するように構成したもの) 以外の発信元からのメッセージは拒否されます。 これは、Web チャット・セキュリティーを有効にすると、共有可能プレビュー・リンクが無効になることを意味します。共有可能プレビュー・リンクは、メッセージとともに JWT を送信しません。 プレビュー・リンクについて詳しくは、 共有へのリンクのコピー を参照してください。

セキュリティーを有効にするには、以下の手順を実行します。

  1. Web チャット統合設定の 「セキュリティー」 タブで、 「Web チャットの保護」 スイッチを 「オン」 に設定します。

  2. 「公開鍵」 フィールドに、 公開鍵 を貼り付けます。

    watsonx Assistant は、公開鍵を使用して、着信メッセージが Web サイトから発信されたことを検証します。

次の図は、Web チャット・セキュリティーが有効になっている場合の、Web チャットとアシスタントの間のメッセージのフローを示しています。

Web チャットのセキュリティー・メッセージ・フロー