직접 회선 강화 인증

적용 대상: SDK v4

이 문서에서는 사용자가 봇에 연결할 때 발생할 수 있는 보안 위험(예: 웹 채팅 컨트롤 사용)에 대해 설명합니다. 또한 직접 회선 강화 인증 설정 및 보안 사용자 ID 처리를 사용하는 완화 솔루션을 보여 줍니다.

두 가지 사용자 ID가 있습니다.

  • 채널 사용자의 ID입니다. 공격자는 가장사용할 수 있습니다.
  • 봇이 사용자를 인증하는 데 사용하는 ID 공급자의 사용자 ID입니다. 공격자는 ID 스푸핑에 사용할 수 있습니다.

가장

가장은 봇이 다른 사람이라고 생각하게 만드는 공격자의 동작을 나타냅니다. 예를 들어 웹 채팅 공격자는 웹 채팅 인스턴스의 사용자 ID를 변경하여 다른 사람을 가장할 수 있습니다.

가장 완화

  • 사용자 ID 를 풀 수 있도록 합니다.

  • 봇을 Direct Line에 커넥트.

  • 직접 회선 채널의 향상된 인증 옵션을 사용하도록 설정하여 Azure AI Bot Service가 사용자 ID 변경을 추가로 감지하고 거부할 수 있도록 합니다. 즉, 직접 회선에서 봇으로의 메시지의 사용자 ID(Activity.From.Id)는 항상 웹 채팅 컨트롤을 초기화하는 데 사용한 것과 동일합니다.

    참고 항목

    직접 회선은 직접 회선 비밀을 기반으로 토큰 을 만들고 토큰에 User.Id 포함합니다. 봇에 전송된 메시지는 해당 메시지를 활동의 From.Id메시지로 갖 User.Id 도록 보장합니다. 클라이언트가 다른 From.Id메시지를 직접 회선에 보내는 경우 메시지를 봇에 전달하기 전에 토큰에 포함된 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);
        }
    }    
    
    

    그러면 직접 회선 비밀에 따라 생성된 토큰이 아래와 같이 웹 채팅 컨트롤에서 사용됩니다.

    @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 스푸핑 완화

웹 채팅 컨트롤에는 적절한 사용자가 로그인되도록 보장하는 두 가지 메커니즘이 있습니다.

  1. 매직 코드. 로그인 프로세스가 끝나면 사용자에게 임의로 생성된 6자리 코드(매직 코드)가 표시됩니다. 사용자가 로그인 프로세스를 완료하려면 대화에 이 코드를 입력해야 합니다. 이로 인해 사용자 환경이 저하되는 경향이 있습니다. 또한 피싱 공격에 취약합니다. 악의적인 사용자가 다른 사용자를 속여 로그인하고 매직 코드를 가져올 수 있습니다.

  2. 직접 회선 강화 인증. 직접 회선 강화 인증을 사용하여 로그인 프로세스가 웹 채팅 클라이언트와 동일한 브라우저 세션에서만 완료될 수 있도록 보장합니다.

    이 보호를 사용하도록 설정하려면 봇의 웹 채팅 클라이언트를 호스트할 수 있는 신뢰할 수 있는 do기본 목록이 포함된 직접 회선 토큰으로 웹 채팅 시작합니다. 향상된 인증 옵션을 사용하면 Direct Line 구성 페이지에서 신뢰할 수 있는 작업기본s(신뢰할 수 있는 원본) 목록을 정적으로 지정할 수 있습니다. 향상된 인증 구성 섹션을 참조하세요.