Beveiligingsfilters voor het bijsnijden van resultaten in Azure AI Search

Azure AI Search biedt geen machtigingen op documentniveau en kan de zoekresultaten niet variëren van binnen dezelfde index op gebruikersmachtigingen. Als tijdelijke oplossing kunt u een filter maken waarmee zoekresultaten worden geknipt op basis van een tekenreeks die een groep of gebruikersidentiteit bevat.

In dit artikel wordt een patroon beschreven voor beveiligingsfilters met de volgende stappen:

  • Brondocumenten samenstellen met de vereiste inhoud
  • Een veld maken voor de principal-id's
  • Push de documenten naar de zoekindex voor indexering
  • Een query uitvoeren op de index met de search.in filterfunctie

Over het beveiligingsfilterpatroon

Hoewel Azure AI Search niet kan worden geïntegreerd met beveiligingssubsystemen voor toegang tot inhoud binnen een index, hebben veel klanten die beveiligingsvereisten op documentniveau hebben gevonden dat filters aan hun behoeften kunnen voldoen.

In Azure AI Search is een beveiligingsfilter een normaal OData-filter dat een zoekresultaat bevat of uitsluit op basis van een overeenkomende waarde, behalve dat in een beveiligingsfilter de criteria bestaan uit een tekenreeks die bestaat uit een beveiligingsprincipaal. Er is geen verificatie of autorisatie via de beveiligingsprincipaal. De principal is slechts een tekenreeks die in een filterexpressie wordt gebruikt om een document op te nemen of uit te sluiten van de zoekresultaten.

Er zijn verschillende manieren om beveiligingsfilters te bereiken. Een manier is door een gecompliceerde ontkoppeling van gelijkheidsexpressies, bijvoorbeeld, Id eq 'id1' or Id eq 'id2'enzovoort. Deze benadering is foutgevoelig, moeilijk te onderhouden en in gevallen waarin de lijst honderden of duizenden waarden bevat, vertraagt de reactietijd van query's met veel seconden.

Een betere oplossing is het gebruik van de search.in functie voor beveiligingsfilters, zoals beschreven in dit artikel. Als u in plaats van een gelijkheidsexpressie gebruikt search.in(Id, 'id1, id2, ...') , kunt u een reactietijd van een subseconde verwachten.

Vereisten

  • Het veld met groeps- of gebruikersidentiteit moet een tekenreeks met het filterbare kenmerk zijn. Het moet een verzameling zijn. Null-waarden mogen niet worden toegestaan.

  • Andere velden in hetzelfde document moeten de inhoud bieden die toegankelijk is voor die groep of gebruiker. In de volgende JSON-documenten bevatten de velden 'security_id' identiteiten die worden gebruikt in een beveiligingsfilter en worden de naam, het salaris en de burgerlijke status opgenomen als de identiteit van de beller overeenkomt met de 'security_id' van het document.

    {  
        "Employee-1": {  
            "id": "100-1000-10-1-10000-1",
            "name": "Abram",   
            "salary": 75000,   
            "married": true,
            "security_id": "10011"
        },
        "Employee-2": {  
            "id": "200-2000-20-2-20000-2",
            "name": "Adams",   
            "salary": 75000,   
            "married": true,
            "security_id": "20022"
        } 
    }  
    

    Notitie

    Het proces voor het ophalen van de principal-id's en het injecteren van deze tekenreeksen in brondocumenten die kunnen worden geïndexeerd door Azure AI Search, wordt niet behandeld in dit artikel. Raadpleeg de documentatie van uw id-serviceprovider voor hulp bij het verkrijgen van id's.

Beveiligingsveld maken

In de zoekindex hebt u in de veldverzameling één veld nodig dat de groeps- of gebruikersidentiteit bevat, vergelijkbaar met het fictieve veld 'security_id' in het vorige voorbeeld.

  1. Voeg een beveiligingsveld toe als een Collection(Edm.String). Zorg ervoor dat er een filterable kenmerk is ingesteld true zodat zoekresultaten worden gefilterd op basis van de toegang die de gebruiker heeft. Als u bijvoorbeeld het veld ["group_id1, group_id2"] instelt voor het group_ids document met file_name 'secured_file_b', hebben alleen gebruikers die deel uitmaken van groep-id's 'group_id1' of 'group_id2' leestoegang tot het bestand.

    Stel het kenmerk van retrievable het veld in op false zodat het niet wordt geretourneerd als onderdeel van de zoekaanvraag.

  2. Voor indexen is een documentsleutel vereist. Het veld file_id voldoet aan die vereiste. Indexen moeten ook doorzoekbare inhoud bevatten. De velden 'file_name' en 'file_description' vertegenwoordigen dat in dit voorbeeld.

    POST https://[search service].search.windows.net/indexes/securedfiles/docs/index?api-version=2023-11-01
    {
         "name": "securedfiles",  
         "fields": [
             {"name": "file_id", "type": "Edm.String", "key": true, "searchable": false },
             {"name": "file_name", "type": "Edm.String", "searchable": true },
             {"name": "file_description", "type": "Edm.String", "searchable": true },
             {"name": "group_ids", "type": "Collection(Edm.String)", "filterable": true, "retrievable": false }
         ]
     }
    

Gegevens naar uw index pushen met behulp van de REST API

Verzend een HTTP POST-aanvraag naar de documentenverzameling van het URL-eindpunt van uw index (zie Documenten - Index). De hoofdtekst van de HTTP-aanvraag is een JSON-rendering van de documenten die moeten worden geïndexeerd:

POST https://[search service].search.windows.net/indexes/securedfiles/docs/index?api-version=2023-11-01

Geef in de hoofdtekst van de aanvraag de inhoud van uw documenten op:

{
    "value": [
        {
            "@search.action": "upload",
            "file_id": "1",
            "file_name": "secured_file_a",
            "file_description": "File access is restricted to the Human Resources.",
            "group_ids": ["group_id1"]
        },
        {
            "@search.action": "upload",
            "file_id": "2",
            "file_name": "secured_file_b",
            "file_description": "File access is restricted to Human Resources and Recruiting.",
            "group_ids": ["group_id1", "group_id2"]
        },
        {
            "@search.action": "upload",
            "file_id": "3",
            "file_name": "secured_file_c",
            "file_description": "File access is restricted to Operations and Logistics.",
            "group_ids": ["group_id5", "group_id6"]
        }
    ]
}

Als u een bestaand document wilt bijwerken met de lijst met groepen, kunt u de merge of mergeOrUpload actie gebruiken:

{
    "value": [
        {
            "@search.action": "mergeOrUpload",
            "file_id": "3",
            "group_ids": ["group_id7", "group_id8", "group_id9"]
        }
    ]
}

Het beveiligingsfilter in de query toepassen

Als u documenten wilt knippen op group_ids basis van toegang, moet u een zoekquery uitgeven met een group_ids/any(g:search.in(g, 'group_id1, group_id2,...')) filter, waarbij 'group_id1, group_id2,...' zijn de groepen waartoe de verlener van zoekaanvragen behoort.

Dit filter komt overeen met alle documenten waarvoor het group_ids veld een van de opgegeven id's bevat. Voor volledige informatie over het zoeken naar documenten met behulp van Azure AI Search, kunt u Zoekdocumenten lezen.

In dit voorbeeld ziet u hoe u een query instelt met behulp van een POST-aanvraag.

Geef de HTTP POST-aanvraag uit:

POST https://[service name].search.windows.net/indexes/securedfiles/docs/search?api-version=2020-06-30
Content-Type: application/json  
api-key: [admin or query key]

Geef het filter op in de aanvraagbody:

{
   "filter":"group_ids/any(g:search.in(g, 'group_id1, group_id2'))"  
}

U moet de documenten terughalen met group_ids 'group_id1' of 'group_id2'. Met andere woorden, u krijgt de documenten waartoe de verlener van de aanvraag leestoegang heeft.

{
 [
   {
    "@search.score":1.0,
     "file_id":"1",
     "file_name":"secured_file_a",
   },
   {
     "@search.score":1.0,
     "file_id":"2",
     "file_name":"secured_file_b"
   }
 ]
}

Volgende stappen

In dit artikel wordt een patroon beschreven voor het filteren van resultaten op basis van gebruikersidentiteit en de search.in() functie. U kunt deze functie gebruiken om principal-id's door te geven voor de aanvragende gebruiker om overeen te komen met principal-id's die aan elk doeldocument zijn gekoppeld. Wanneer een zoekaanvraag wordt verwerkt, filtert de search.in functie zoekresultaten waarvoor geen van de principals van de gebruiker leestoegang heeft. De principal-id's kunnen zaken vertegenwoordigen zoals beveiligingsgroepen, rollen of zelfs de eigen identiteit van de gebruiker.

Zie de volgende koppelingen voor een alternatief patroon op basis van Microsoft Entra ID of om andere beveiligingsfuncties opnieuw te bekijken.