다음을 통해 공유


Copilot Studio 에이전트에 대한 런타임 위협 탐지 시스템 빌드

조직은 Copilot Studio 에이전트를 런타임 위협 탐지 시스템에 연결하여 보안 계층을 추가할 수 있습니다. 연결되면 에이전트는 런타임에 이 시스템을 호출합니다. 에이전트는 시스템에서 에이전트가 호출하려는 도구가 합법적인지 여부를 확인할 수 있도록 시스템에 데이터를 제공합니다. 그런 다음 시스템은 "승인" 또는 "차단"의 응답으로 Copilot Studio에 회신하여 에이전트가 그에 따라 도구를 호출하거나 건너뜁니다. 에이전트를 기존 외부 위협 탐지 시스템에 연결하는 방법에 대한 자세한 내용은 Copilot Studio 사용자 지정 에이전트에 대한 외부 위협 탐지 및 보호 사용을 참조하세요.

이 문서는 개발자를 대상으로 하며, Copilot Studio 에이전트를 위한 보안 공급자로 사용자 고유의 위협 탐지 기능을 통합하는 방법을 설명합니다.

통합은 두 개의 엔드포인트로 구성된 API를 기반으로 합니다. 구현해야 하는 주요 엔드포인트는 엔드포인트입니다 analyze-tool-execution . 이 엔드포인트를 위협 탐지 시스템에 대한 인터페이스로 노출해야 합니다. 고객이 시스템을 외부 위협 탐지 시스템으로 구성하면 에이전트는 도구를 호출할 때마다 이 API를 호출합니다.

엔드포인트 외에도 analyze-tool-executionvalidate번째 엔드포인트를 노출해야 합니다. validate 엔드포인트는 시스템 설정의 일부로 엔드포인트의 상태 및 준비 상태를 확인하는 데 사용됩니다.

다음 섹션에서는 각 엔드포인트에 대해 자세히 설명합니다.

POST /validate

목적: 위협 탐지 엔드포인트에 연결할 수 있고 작동하는지 확인합니다. 초기 설정 및 구성 테스트에 사용됩니다.

요청 유효성 검사

  • 메서드: 올리기

  • URL:https://{threat detection endpoint}/validate?api-version=2025-05-01

  • 헤더:

    • 권한 부여: API 인증을 위한 전달자 토큰

    • x-ms-correlation-id: 추적을 위한 GUID

  • 몸: 비우다

응답 유효성 검사

200 OK 응답 예제

{
  "isSuccessful": true,
  "status": "OK"
}

오류 응답 예제

오류가 발생하면(실패한 HTTP 코드) 엔드포인트는 오류 코드, 메시지 및 선택적 진단을 반환합니다.

{
  "errorCode": 5031,
  "message": "Validation failed. Webhook service is temporarily unavailable.",
  "httpStatus": 503,
  "diagnostics": "{\\reason\\:\\Upstream dependency timeout\\}"
}

POST /analyze-tool-execution

목적: 위험 평가를 위해 도구 실행 컨텍스트를 제출합니다. 도구 실행 요청을 평가하고 도구 실행을 허용하거나 차단할지 여부를 응답합니다.

분석 도구 실행 요청

  • 메서드: 올리기

  • URL:https://{threat detection endpoint}/analyze-tool-execution?api-version=2025-05-01

  • 헤더:

    • 권한 부여: API 인증을 위한 전달자 토큰
    • Content-Type: application/json
  • 몸: JSON 개체

분석 도구 실행 요청 예제

POST https://security.contoso.com/api/agentSecurity/analyze-tool-execution?api-version=2025-05-01
Authorization: Bearer XXX……
x-ms-correlation-id: fbac57f1-3b19-4a2b-b69f-a1f2f2c5cc3c
Content-Type: application/json

{
  "plannerContext": {
    "userMessage": "Send an email to the customer",
    "thought": "User wants to notify customer",
    "chatHistory": [
      {
        "id": "m1",
        "role": "user",
        "content": "Send an email to the customer",
        "timestamp": "2025-05-25T08:00:00Z"
      },
      {
        "id": "m2",
        "role": "assistant",
        "content": "Which customer should I email?",
        "timestamp": "2025-05-25T08:00:01Z"
      },
      {
        "id": "m3",
        "role": "user",
        "content": "The customer is John Doe",
        "timestamp": "2025-05-25T08:00:02Z"
      }
    ],
    "previousToolOutputs": [
      {
        "toolId": "tool-123",
        "toolName": "Get customer email by name",
        "outputs": {
          "name": "email",
          "description": "Customer's email address",
          "type": {
            "$kind": "String"
          },
          "value": "customer@foobar.com"
        },
        "timestamp": "2025-05-25T08:00:02Z"
      }
    ]
  },
  "toolDefinition": {
    "id": "tool-123",
    "type": "PrebuiltToolDefinition",
    "name": "Send email",
    "description": "Sends an email to specified recipients.",
    "inputParameters": [
      {
        "name": "to",
        "description": "Receiver of the email",
        "type": {
          "$kind": "String"
        }
      },
      {
        "name": "bcc",
        "description": "BCC of the email",
        "type": {
          "$kind": "String"
        }
      }
    ],
    "outputParameters": [
      {
        "name": "result",
        "description": "Result",
        "type": {
          "$kind": "String"
        }
      }
    ]
  },
  "inputValues": {
    "to": "customer@foobar.com",
    "bcc": "hacker@evil.com"
  },
  "conversationMetadata": {
    "agent": {
      "id": "agent-guid",
      "tenantId": "tenant-guid",
      "environmentId": "env-guid",
      "isPublished": true
    },
    "user": {
      "id": "user-guid",
      "tenantId": "tenant-guid"
    },
    "trigger": {
      "id": "trigger-guid",
      "schemaName": "trigger-schema"
    },
    "conversationId": "conv-id",
    "planId": "plan-guid",
    "planStepId": "step-1"
  }
}

분석 도구 실행 응답

200 확인

요청이 유효하면 정의된 조건에 따라 요청에 지정된 도구 사용이 평가되고 허용 되거나 차단됩니다. 응답에는 다음 필드가 포함될 수 있습니다.

  • blockAction (부울): 작업을 차단해야 하는지 여부
  • reasonCode (정수, 선택 사항): 블록의 이유를 설명하는 숫자 코드
  • reason (문자열, 선택 사항): 사람이 읽을 수 있는 설명
  • 진단 (개체, 선택 사항): 추적 또는 디버깅에 대한 기타 세부 정보

응답 허용 예제

{
  "blockAction": false
}

블록 응답 예제

{
  "blockAction": true,
  "reasonCode": 112,
  "reason": "The action was blocked because there is a noncompliant email address in the BCC field.",
  "diagnostics": "{\\flaggedField\\:\\bcc\\,\\flaggedValue\\:\\hacker@evil.com\\}"
}

오류 응답 예제

요청이 유효하지 않으면 오류 코드, 메시지, HTTP 상태 및 선택적 진단과 함께 오류 응답이 반환됩니다.

{
  "errorCode": 4001,
  "message": "Missing required field: toolDefinition",
  "httpStatus": 400,
  "diagnostics": "{\\missingField\\:\\toolDefinition\\,\\traceId\\:\\abc-123\\}"
}

요청 및 응답 본문 구조 참조

다음 표에서는 엔드포인트에 대한 요청 및 응답 본문 내에서 사용되는 다양한 개체의 내용을 설명합니다.

ValidationResponse

이름 유형 필수 설명
isSuccessful 불리언 (Boolean) Yes 유효성 검사가 통과되었는지 여부를 나타냅니다.
status 문자열 Yes 선택적 상태 메시지 또는 파트너별 세부 정보입니다.

AnalyzeToolExecutionResponse

이름 유형 필수 설명
blockAction 불리언 (Boolean) Yes 작업을 차단해야 하는지 여부를 나타냅니다.
사유 코드 integer 아니오 파트너에 의해 결정되는 선택적 숫자 이유 코드입니다.
이유 문자열 아니오 선택적 사람이 읽을 수 있는 설명입니다.
diagnostics 문자열 아니오 디버깅 또는 원격 분석을 위한 선택적 자유형 진단 정보입니다. 미리 초기화해야 합니다.

ErrorResponse

이름 유형 필수 설명
오류 코드 integer Yes 오류에 대한 숫자 식별자입니다(예: 1001 = 누락된 필드, 2003 = 인증 실패).
message 문자열 Yes 오류에 대한 사람이 읽을 수 있는 설명입니다.
http 상태 코드 integer Yes 파트너가 반환한 HTTP 상태 코드입니다.
diagnostics 문자열 아니오 디버깅 또는 원격 분석을 위한 선택적 자유형 진단 정보입니다. 미리 초기화해야 합니다.

EvaluationRequest

이름 유형 필수 설명
plannerContext PlannerContext Yes Planner 컨텍스트 데이터입니다.
toolDefinition ToolDefinition Yes 도구 정의 세부 정보입니다.
inputValues JSON 개체 Yes 도구에 제공된 키-값 쌍의 사전입니다.
conversationMetadata ConversationMetadata Yes 대화 컨텍스트, 사용자 및 계획 추적에 대한 메타데이터입니다.

PlannerContext

이름 유형 필수 설명
사용자 메시지 문자열 Yes 에이전트에서 보낸 원본 메시지입니다.
생각 문자열 아니오 이 도구를 선택한 이유에 대한 Planner 설명입니다.
chatHistory ChatMessage[] 아니오 사용자와 교환된 최근 채팅 메시지 목록입니다.
previousToolsOutputs ToolExecutionOutput[] 아니오 최근 도구 출력 목록입니다.

ChatMessage

이름 유형 필수 설명
아이디 문자열 Yes 대화에서 이 메시지의 고유 식별자입니다.
역할 문자열 Yes 메시지의 원본(예: 사용자, 도우미)입니다.
내용 문자열 Yes 메시지 텍스트입니다.
시간표시 string(date-time) 아니오 메시지를 보낸 시간을 나타내는 ISO 8601 타임스탬프를 표시합니다.

ToolExecutionOutputs

이름 유형 필수 설명
toolId 문자열 Yes 대화에서 이 메시지의 고유 식별자입니다.
toolName 문자열 Yes 도구의 이름입니다.
출력 ExecutionOutput[] Yes 도구 실행 출력 목록입니다.
시간표시 string(date-time) 아니오 도구 실행이 완료된 시기를 나타내는 ISO 8601 타임스탬프를 나타냅니다.

ExecutionOutput

이름 유형 필수 설명
이름 문자열 Yes 출력 매개 변수의 이름입니다.
description 문자열 아니오 출력 값에 대한 설명입니다.
type 객체 아니오 출력의 데이터 형식입니다.
value JSON 데이터 값 Yes 출력 값입니다.

ToolDefinition

이름 유형 필수 설명
아이디 문자열 Yes 도구의 고유 식별자입니다.
type 문자열 Yes Planner에 사용되는 도구의 종류를 지정합니다.
이름 문자열 Yes 사람이 읽을 수 있는 도구 이름입니다.
description 문자열 Yes 도구가 수행하는 작업의 요약입니다.
inputParameters ToolInput[] 아니오 도구의 입력 매개 변수입니다.
outputParameters ToolOutput[] 아니오 실행 후 도구가 반환하는 출력 매개 변수입니다.

ToolInput

이름 유형 필수 설명
이름 문자열 Yes 입력 매개 변수의 이름입니다.
description 문자열 아니오 이 입력 매개 변수의 예상 값에 대한 설명입니다.
type JSON 개체 아니오 입력 매개 변수의 데이터 형식입니다.

ToolOutput

이름 유형 필수 설명
이름 문자열 Yes 출력 매개 변수의 이름입니다.
description 문자열 아니오 출력 값에 대한 설명입니다.
type JSON 개체 아니오 출력 값의 유형입니다.

ConversationMetadata

이름 유형 필수 설명
agent AgentContext Yes 에이전트 컨텍스트 정보입니다.
사용자 UserContext 아니오 에이전트와 상호 작용하는 사용자에 대한 정보입니다.
trigger TriggerContext 아니오 Planner 실행을 트리거한 내용에 대한 정보입니다.
conversationId 문자열 Yes 진행 중인 대화의 ID입니다.
planId 문자열 아니오 사용자 요청을 수행하는 데 사용되는 계획의 ID입니다.
planStepId 문자열 아니오 이 도구 실행에 해당하는 계획 내에서 단계별로 실행합니다.
parentAgentComponentId 문자열 아니오 부모 에이전트 구성 요소의 ID입니다.

AgentContext

이름 유형 필수 설명
아이디 문자열 Yes 에이전트의 ID입니다.
tenantId 문자열 Yes 에이전트가 있는 테넌트입니다.
environmentId 문자열 Yes 에이전트가 게시되는 환경입니다.
version 문자열 아니오 에이전트 버전(false인 경우 isPublished 선택 사항).
isPublished 불리언 (Boolean) Yes 이 실행 컨텍스트가 게시된 버전인지 여부입니다.

UserContext

이름 유형 필수 설명
아이디 문자열 아니오 사용자의 Microsoft Entra 개체 ID입니다.
tenantId 문자열 아니오 사용자의 테넌트 ID입니다.

TriggerContext

이름 유형 필수 설명
아이디 문자열 아니오 Planner를 트리거한 트리거의 ID입니다.
schemaName 문자열 아니오 Planner를 트리거한 트리거 스키마의 이름입니다.

Authentication

개발하는 통합은 Microsoft Entra ID 인증을 사용해야 합니다. 개발자가 빌드하는 앱 통합에 대한 지침을 따릅니다.

수행할 단계는 다음과 같습니다.

  • 테넌트에서 리소스에 대한 앱 등록을 만듭니다.
  • 웹 API에 대한 범위를 노출합니다. 노출된 범위는 고객이 호출하는 리소스의 기본 URL이어야 합니다. 예를 들어 API URL이면 노출된 범위는 https://security.contoso.com/api/threatdetection여야 https://security.contoso.com합니다.
  • 서비스를 구현하는 방법에 따라 권한 부여 논리를 구현하고 들어오는 토큰의 유효성을 검사해야 합니다. 고객이 앱에 권한을 부여하는 방법을 문서화해야 합니다. 예를 들어 앱 ID의 허용 목록 또는 RBAC(역할 기반 액세스 제어)를 사용하는 여러 가지 방법이 있습니다.

응답 시간 요구 사항

에이전트는 1,000ms 미만의 위협 탐지 시스템의 응답을 기대합니다. 엔드포인트가 이 시간 프레임 내에서 호출에 회신하는지 확인해야 합니다. 시스템이 시간에 응답하지 않으면 에이전트는 응답이 도구를 호출하는 "허용"인 것처럼 동작합니다.

API 버전 관리

요청에서 API 버전은 쿼리 매개 변수(예: api-version=2025-05-01)를 통해 api-version 지정됩니다. 구현은 다른 예기치 않은 필드에 관대해야 하며 나중에 새 값이 추가될 경우 실패하지 않아야 합니다. 현재 모든 버전이 호환되지 않는 것으로 간주되기 때문에 파트너는 API 버전을 확인해서는 안 됩니다. 파트너는 API 버전을 추적해야 하지만 새 버전이 표시되면 요청에 실패하지 않아야 합니다.