Udostępnij przez


Tworzenie systemu wykrywania zagrożeń środowiska uruchomieniowego dla agentów Programu Copilot Studio

Organizacje mogą dodać warstwę zabezpieczeń do swoich agentów Programu Copilot Studio, łącząc je z systemem wykrywania zagrożeń w czasie wykonywania. Po nawiązaniu połączenia agent wywołuje ten system w czasie wykonywania. Agent dostarcza systemowi dane, dzięki czemu system może określić, czy narzędzie, które agent planuje wywołać, jest uzasadnione, czy nie. Następnie system odpowiada na program Copilot Studio z odpowiedzią "zatwierdź" lub "blok", powodując, że agent może wywołać lub pominąć odpowiednie narzędzie. Aby uzyskać więcej informacji na temat łączenia agentów z istniejącym zewnętrznym systemem wykrywania zagrożeń, zobacz Włączanie zewnętrznego wykrywania zagrożeń i ochrony agentów niestandardowych copilot Studio.

Ten artykuł jest przeznaczony dla deweloperów i opisuje sposób integrowania własnych możliwości wykrywania zagrożeń jako dostawcy zabezpieczeń dla agentów Copilot Studio.

Integracja jest oparta na interfejsie API składającym się z dwóch punktów końcowych. Głównym punktem końcowym, który należy zaimplementować, jest analyze-tool-execution punkt końcowy. Ten punkt końcowy należy uwidocznić jako interfejs systemu wykrywania zagrożeń. Gdy klienci skonfigurują system jako zewnętrzny system wykrywania zagrożeń, agent wywołuje ten interfejs API za każdym razem, gdy zamierza wywołać narzędzie.

Oprócz punktu końcowego analyze-tool-execution należy również uwidocznić drugi punkt końcowy o nazwie validate. Punkt validate końcowy służy do sprawdzania kondycji i gotowości punktu końcowego w ramach konfiguracji systemu.

W poniższych sekcjach szczegółowo opisano każdy punkt końcowy.

POST /validate

Cel: Sprawdza, czy punkt końcowy wykrywania zagrożeń jest osiągalny i działa. Służy do początkowego konfigurowania i testowania konfiguracji.

Weryfikowanie żądania

  • Metoda: POST

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

  • Nagłówki:

    • Autoryzacja: token elementu nośnego na potrzeby uwierzytelniania interfejsu API

    • x-ms-correlation-id: identyfikator GUID do śledzenia

  • Ciało: Pusty

Weryfikowanie odpowiedzi

Przykład odpowiedzi 200 OK

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

Przykład odpowiedzi na błąd

Jeśli wystąpi błąd (nieudany kod HTTP), punkt końcowy zwraca kod błędu, komunikat i opcjonalną diagnostykę.

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

POST /analyze-tool-execution

Cel: Przesyła kontekst wykonywania narzędzia do oceny ryzyka. Ocenia żądanie wykonania narzędzia i odpowiada na to, czy zezwolić na wykonywanie narzędzia, czy zablokować je.

Żądanie wykonania narzędzia analizy

  • Metoda: POST

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

  • Nagłówki:

    • Autoryzacja: token elementu nośnego na potrzeby uwierzytelniania interfejsu API
    • Typ zawartości: application/json
  • Ciało: Obiekt JSON

Przykładowe żądanie wykonywania narzędzia analyze-tool

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"
  }
}

Analizowanie odpowiedzi na wykonywanie narzędzi

200 OK

Gdy żądanie jest prawidłowe, narzędzie określone w żądaniu jest oceniane i dozwolone lub zablokowane na podstawie zdefiniowanych kryteriów. Odpowiedź może zawierać następujące pola:

  • blockAction (wartość logiczna): czy akcja powinna zostać zablokowana
  • reasonCode (liczba całkowita, opcjonalnie): kod liczbowy wyjaśniający przyczynę bloku
  • reason (ciąg, opcjonalny): objaśnienie czytelne dla człowieka
  • diagnostyka (obiekt, opcjonalnie): inne szczegóły dotyczące śledzenia lub debugowania

Przykład zezwalaj na odpowiedź

{
  "blockAction": false
}

Przykładowa odpowiedź bloku

{
  "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\\}"
}

Przykładowa odpowiedź na błąd

Jeśli żądanie jest nieprawidłowe, zwracana jest odpowiedź o błędzie z kodem błędu, komunikatem, stanem HTTP i opcjonalną diagnostyką.

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

Odwołanie do struktur treści żądań i odpowiedzi

W poniższych tabelach opisano zawartość różnych obiektów używanych w jednostkach żądania i odpowiedzi dla punktów końcowych.

ValidationResponse

Nazwa Typ Wymagane Opis
isSuccessful logiczny Tak Wskazuje, czy weryfikacja została pomyślnie przekazana.
stan ciąg Tak Opcjonalny komunikat o stanie lub szczegóły specyficzne dla partnera.

AnalyzeToolExecutionResponse

Nazwa Typ Wymagane Opis
blockAction logiczny Tak Wskazuje, czy akcja powinna zostać zablokowana.
kod przyczyny liczba całkowita Nie. Opcjonalny kod przyczyny liczbowej określany przez partnera.
powód ciąg Nie. Opcjonalne wyjaśnienie czytelne dla człowieka.
diagnostics ciąg Nie. Opcjonalne informacje diagnostyczne o wolnymformie na potrzeby debugowania lub telemetrii. Musi być wstępnie wstępnie zainicjowana.

ErrorResponse

Nazwa Typ Wymagane Opis
kod błędu liczba całkowita Tak Identyfikator liczbowy błędu (na przykład 1001 = brakujące pole, 2003 = niepowodzenie uwierzytelniania).
komunikat ciąg Tak Czytelne dla człowieka wyjaśnienie błędu.
StatusHTTP liczba całkowita Tak Kod stanu HTTP zwrócony przez partnera.
diagnostics ciąg Nie. Opcjonalne informacje diagnostyczne o wolnymformie na potrzeby debugowania lub telemetrii. Musi być wstępnie wstępnie zainicjowana.

EvaluationRequest

Nazwa Typ Wymagane Opis
plannerContext PlannerContext Tak Dane kontekstowe narzędzia Planner.
toolDefinition ToolDefinition Tak Szczegóły definicji narzędzia.
inputValues Obiekt JSON Tak Słownik par klucz-wartość dostarczonych do narzędzia.
conversationMetadata ConversationMetadata Tak Metadane dotyczące kontekstu konwersacji, użytkownika i śledzenia planu.

PlannerContext

Nazwa Typ Wymagane Opis
wiadomość użytkownika ciąg Tak Oryginalna wiadomość wysłana przez agenta.
myśl ciąg Nie. Wyjaśnienie planisty dotyczące tego, dlaczego to narzędzie zostało wybrane.
chatHistory ChatMessage[] Nie. Lista ostatnich wiadomości czatu wymienianych z użytkownikiem.
previousToolsOutputs ToolExecutionOutput[] Nie. Lista ostatnio używanych danych wyjściowych narzędzia.

ChatMessage

Nazwa Typ Wymagane Opis
id ciąg Tak Unikatowy identyfikator tej wiadomości w konwersacji.
rola ciąg Tak Źródło komunikatu (na przykład użytkownik, asystent).
zawartość ciąg Tak Tekst wiadomości.
sygnatura czasowa ciąg (data/godzina) Nie. Sygnatura czasowa ISO 8601 wskazująca, kiedy wiadomość została wysłana.

ToolExecutionOutputs

Nazwa Typ Wymagane Opis
toolId ciąg Tak Unikatowy identyfikator tej wiadomości w konwersacji.
toolName ciąg Tak Nazwa narzędzia.
Wyniki ExecutionOutput[] Tak Lista danych wyjściowych wykonywania narzędzia.
sygnatura czasowa ciąg (data/godzina) Nie. Sygnatura czasowa ISO 8601 wskazująca, kiedy wykonanie narzędzia zostało zakończone.

ExecutionOutput

Nazwa Typ Wymagane Opis
nazwa ciąg Tak Nazwa parametru wyjściowego.
opis ciąg Nie. Wyjaśnienie wartości wyjściowej.
typ obiekt Nie. Typ danych wyjściowych.
value Wartość danych JSON Tak Wartość wyjściowa.

ToolDefinition

Nazwa Typ Wymagane Opis
id ciąg Tak Unikatowy identyfikator narzędzia.
typ ciąg Tak Określa rodzaj narzędzia używanego w planisty.
nazwa ciąg Tak Czytelna dla człowieka nazwa narzędzia.
opis ciąg Tak Podsumowanie tego, co robi narzędzie.
inputParameters ToolInput[] Nie. Parametry wejściowe narzędzia.
outputParameters ToolOutput[] Nie. Parametry wyjściowe, które narzędzie zwraca po wykonaniu.

ToolInput

Nazwa Typ Wymagane Opis
nazwa ciąg Tak Nazwa parametru wejściowego.
opis ciąg Nie. Wyjaśnienie oczekiwanej wartości dla tego parametru wejściowego.
typ Obiekt JSON Nie. Typ danych parametru wejściowego.

ToolOutput

Nazwa Typ Wymagane Opis
nazwa ciąg Tak Nazwa parametru wyjściowego.
opis ciąg Nie. Wyjaśnienie wartości wyjściowej.
typ Obiekt JSON Nie. Typ wartości wyjściowej.

ConversationMetadata

Nazwa Typ Wymagane Opis
agent AgentContext Tak Informacje o kontekście agenta.
użytkownik UserContext Nie. Informacje o użytkowniku wchodzącym w interakcję z agentem.
wyzwalacz TriggerContext Nie. Informacje o tym, co wyzwoliło wykonywanie planisty.
conversationId (identyfikator rozmowy) ciąg Tak Identyfikator trwającej konwersacji.
identyfikator planu ciąg Nie. Identyfikator planu używanego do realizacji żądania użytkownika.
planStepId ciąg Nie. Krok w ramach planu odpowiadającego temu wykonaniu narzędzia.
parentAgentComponentId ciąg Nie. Identyfikator składnika agenta nadrzędnego.

AgentContext

Nazwa Typ Wymagane Opis
id ciąg Tak Identyfikator agenta.
tenantId ciąg Tak Dzierżawa, w której znajduje się agent.
environmentId ciąg Tak Środowisko, w którym jest publikowany agent.
wersja ciąg Nie. Wersja agenta (opcjonalna, jeśli isPublished jest fałsz).
isPublished logiczny Tak Czy ten kontekst wykonywania jest opublikowaną wersją.

UserContext

Nazwa Typ Wymagane Opis
id ciąg Nie. Microsoft Entra identyfikator obiektu użytkownika.
tenantId ciąg Nie. Identyfikator dzierżawy użytkownika.

TriggerContext

Nazwa Typ Wymagane Opis
id ciąg Nie. Identyfikator wyzwalacza, który wyzwolił planistę.
schemaName ciąg Nie. Nazwa schematu wyzwalacza, który wyzwolił planistę.

Authentication

Opracowywana integracja powinna używać uwierzytelniania microsoft Entra ID. Postępuj zgodnie z instrukcjami w temacie Integrowanie aplikacji, które tworzą deweloperzy.

Kroki, które należy wykonać, obejmują następujące czynności:

  • Utwórz rejestrację aplikacji dla zasobu w dzierżawie.
  • Uwidacznia zakres internetowego interfejsu API. Uwidoczniony zakres musi być podstawowym adresem URL zasobu wywoływanego przez klientów. Jeśli na przykład adres URL interfejsu API to https://security.contoso.com/api/threatdetection, uwidoczniony zakres musi mieć wartość https://security.contoso.com.
  • W zależności od sposobu implementacji usługi należy zaimplementować logikę autoryzacji i zweryfikować tokeny przychodzące. Musisz udokumentować, jak klient musi autoryzować swoje aplikacje. Istnieje wiele sposobów na to, na przykład przy użyciu listy dozwolonych identyfikatorów aplikacji lub kontroli dostępu opartej na rolach (RBAC).

Wymagania dotyczące czasu odpowiedzi

Agent oczekuje odpowiedzi z systemu wykrywania zagrożeń w mniej niż 1000 ms. Upewnij się, że punkt końcowy odpowiada na wywołanie w tym przedziale czasu. Jeśli system nie odpowiada w odpowiednim czasie, agent zachowuje się tak, jakby odpowiedź brzmi "zezwalaj", wywołując narzędzie.

Przechowywanie wersji interfejsu API

W żądaniach wersja interfejsu API jest określana za pomocą parametru api-version zapytania (na przykład api-version=2025-05-01). Implementacja powinna być odporna na inne nieoczekiwane pola i nie powinna zakończyć się niepowodzeniem, jeśli nowe wartości zostaną dodane w przyszłości. Partnerzy nie powinni weryfikować wersji interfejsu API, ponieważ wszystkie wersje w tej chwili są uznawane za niezgodne. Partnerzy powinni śledzić wersje interfejsu API, ale nie kończą się niepowodzeniem żądania w przypadku wyświetlania nowej wersji.