次の方法で共有


Direct Line 拡張認証

適用対象: SDK v4

この記事では、ユーザーが Web チャット コントロールを使用してボットに接続するときの潜在的なセキュリティ リスクについて説明します。 また、Direct Line の強化された認証設定 とセキュリティで保護された ユーザー ID の処理を使用した軽減ソリューションも示します。

次の 2 つのユーザー ID があります。

  • チャネル ユーザーの ID。 攻撃者は 偽装に使用できます。
  • ボットがユーザーの認証に使用する ID プロバイダーからのユーザーの ID。 攻撃者は、 それを ID スプーフィングに使用できます。

偽装

偽装とは、ボットが自分が他のユーザーであると考えさせる攻撃者のアクションを指します。 たとえば、Web チャットでは、攻撃者は Web チャット インスタンスの ユーザー ID を変更 することで、他のユーザーを偽装できます。

偽装の軽減策

  • ユーザー ID を 取得不可にします

  • ボットを Direct Line に接続します

  • Direct Line チャネルの 拡張認証 オプションを有効にして、Azure AI Bot Service がユーザー ID の変更をさらに検出して拒否できるようにします。 つまり、Direct Line からボットへのメッセージのユーザー ID (Activity.From.Id) は、Web チャット コントロールの初期化に使用したユーザー ID と常に同じになります。

    Direct Line は、Direct Line シークレットに基づいて トークン を作成し、トークンに User.Id を埋め込みます。 ボットに送信されたメッセージに、アクティビティのUser.IdとしてFrom.Idが含まれていることが保証されます。 クライアントが別の From.Idを持つメッセージを Direct Line に送信すると、メッセージをボットに転送する前に 、トークンに埋め込まれた ID に変更されます。 そのため、チャネル シークレットがその ID で初期化された後は、別のユーザー ID を使用することはできません。

    この機能では、次に示すように、ユーザー ID が dl_ で始まる必要があります。

    ヒント

    リージョン ボットの場合は、選択したリージョンに応じて dlUrl 設定します。
    ヨーロッパを選択した場合は、"https://europe.directline.botframework.com/v3/directline/tokens/generate"" を設定します。
    インドを選択した場合は、"https://india.directline.botframework.com/v3/directline/tokens/generate"" を設定します。
    リージョン ボットの詳細については、「 Azure AI Bot Service の地域化」を参照してください。

    public class HomeController : Controller
    {
        private const string secret = "<TODO: DirectLine secret>";
        private const string dlUrl = "https://directline.botframework.com/v3/directline/tokens/generate";
    
        public async Task<ActionResult> Index()
        {
            HttpClient client = new HttpClient();
            var userId = $"dl_{Guid.NewGuid()}";
    
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, dlUrl);
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secret);
            request.Content = new StringContent(
                JsonConvert.SerializeObject(
                    new { User = new { Id = userId } }),
                    Encoding.UTF8,
                    "application/json");
    
            var response = await client.SendAsync(request);
    
            string token = String.Empty;
            if (response.IsSuccessStatusCode)
            {
                var body = await response.Content.ReadAsStringAsync();
                token = JsonConvert.DeserializeObject<DirectLineToken>(body).token;
            }
    
            var config = new ChatConfig()
            {
                Token = token,
                UserId = userId
            };
    
            return View(config);
        }
    }    
    
    

    次に示すように、Direct Line シークレットに基づいて生成されたトークンが Web チャット コントロールで使用されます。

    @model Bot_Auth_DL_Secure_Site_MVC.Models.ChatConfig
    @{
        ViewData["Title"] = "Home Page";
    }
    <div id="webchat" role="main" />
    <head>
        <script src="https://cdn.botframework.com/botframework-webchat/latest/webchat.js"></script>
    </head>
    <body>
        <script>
          window.WebChat.renderWebChat({
              directLine: window.WebChat.createDirectLine({ token: '@Model.Token' }),
                userID: '@Model.UserId'
          }, document.getElementById('webchat'));
        </script>
    </body>
    
    

ID スプーフィング

ID スプーフィングとは、正当なユーザーの ID を想定し、その ID を使用して悪意のある目標を達成する攻撃者のアクションを指します。

ボットがチャネル ユーザー A に ID プロバイダーへのサインインを求める場合、サインイン プロセスでは、ユーザー A がプロバイダーにサインインする唯一のユーザーであることを保証する必要があります。 別のユーザーがプロバイダーのサインインも許可されている場合は、ボットを介してユーザー A リソースにアクセスできます。

ユーザー ID スプーフィングの軽減策

Web チャット コントロールには、適切なユーザーがサインインしていることを保証する 2 つのメカニズムがあります。

  1. マジック コード。 サインイン プロセスの最後に、ランダムに生成された 6 桁のコード (マジック コード) がユーザーに表示されます。 ユーザーは、サインイン プロセスを完了するために、会話にこのコードを入力する必要があります。 これにより、ユーザー エクスペリエンスが低下する傾向があります。 さらに、フィッシング攻撃の影響を受けやすくなります。悪意のあるユーザーが別のユーザーをだましてサインインし、マジック コードを取得する可能性があります。

  2. Direct Line 拡張認証。 Direct Line 拡張認証を使用して、サインイン プロセスが Web チャット クライアント と同じブラウザー セッション でのみ完了できることを保証します。

    この保護を有効にするには、ボットの Web チャット クライアントをホストできる信頼されたドメインの一覧を含む Direct Line トークンを使用して Web チャットを開始します。 拡張認証オプションを使用すると、Direct Line 構成ページで信頼されたドメイン (信頼された配信元) の一覧を静的に指定できます。 「拡張認証の構成」セクションを参照してください。