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 チャット コントロ-ルを初期化したときに使用したものと必ず同じになります。

    Note

    Direct Line は Direct Line シークレットに基づいてトークン を作成し、トークンに User.Id を埋め込みます。 ボットに送信されたメッセージがアクティビティ From.Id としてその User.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 構成ページで信頼されたドメイン (信頼された origin) の一覧を静的に指定できます。 「拡張認証の構成」セクションを参照してください。