Filtry zabezpečení pro oříznutí výsledků ve službě Azure AI Search

Azure AI Search neposkytuje oprávnění na úrovni dokumentu a nemůže měnit výsledky hledání v rámci stejného indexu podle uživatelských oprávnění. Jako alternativní řešení můžete vytvořit filtr, který oříznou výsledky hledání na základě řetězce obsahujícího skupinu nebo identitu uživatele.

Tento článek popisuje vzor pro filtrování zabezpečení, který zahrnuje následující kroky:

  • Sestavení zdrojových dokumentů s požadovaným obsahem
  • Vytvoření pole pro hlavní identifikátory
  • Nasdílení dokumentů do indexu vyhledávání pro indexování
  • Dotazování indexu search.in pomocí funkce filtru

O vzoru filtru zabezpečení

Azure AI Search se sice neintegruje se subsystémy zabezpečení pro přístup k obsahu v rámci indexu, ale mnoho zákazníků, kteří mají požadavky na zabezpečení na úrovni dokumentů, zjistili, že filtry můžou vyhovovat jejich potřebám.

Ve službě Azure AI Search je filtr zabezpečení pravidelným filtrem OData, který obsahuje nebo vyloučí výsledek hledání na základě odpovídající hodnoty, s výjimkou toho, že v filtru zabezpečení je kritériem řetězec skládající se z objektu zabezpečení. Prostřednictvím objektu zabezpečení není k dispozici žádné ověřování ani autorizace. Objekt zabezpečení je pouze řetězec, který se používá ve výrazu filtru k zahrnutí nebo vyloučení dokumentu z výsledků hledání.

Existuje několik způsobů, jak dosáhnout filtrování zabezpečení. Jedním ze způsobů je složitá disjunkce výrazů rovnosti: Id eq 'id1' or Id eq 'id2'například a tak dále. Tento přístup je náchylný k chybám, obtížně se udržuje a v případech, kdy seznam obsahuje stovky nebo tisíce hodnot, zpomalí dobu odezvy dotazu o mnoho sekund.

Lepším řešením je použít search.in funkci pro filtry zabezpečení, jak je popsáno v tomto článku. Pokud použijete search.in(Id, 'id1, id2, ...') místo výrazu rovnosti, můžete očekávat subsekundové doby odezvy.

Požadavky

  • Pole obsahující skupinu nebo identitu uživatele musí být řetězec s filtrovatelným atributem. Měla by to být kolekce. Nemělo by povolovat hodnoty null.

  • Další pole ve stejném dokumentu by měla obsahovat obsah, který je přístupný pro danou skupinu nebo uživatele. V následujících dokumentech JSON pole "security_id" obsahují identity použité ve filtru zabezpečení a jméno, plat a rodinný stav, pokud identita volajícího odpovídá "security_id" dokumentu.

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

    Poznámka:

    Proces načtení identifikátorů objektu zabezpečení a vložení těchto řetězců do zdrojových dokumentů, které je možné indexovat službou Azure AI Search, se v tomto článku nezabývá. Nápovědu k získání identifikátorů najdete v dokumentaci vašeho zprostředkovatele služeb identit.

Vytvoření pole zabezpečení

V indexu vyhledávání v kolekci polí potřebujete jedno pole, které obsahuje identitu skupiny nebo uživatele, podobně jako fiktivní pole "security_id" v předchozím příkladu.

  1. Přidejte pole zabezpečení jako Collection(Edm.String). Ujistěte se, že má filterable nastavený true atribut tak, aby se výsledky hledání filtrovaly na základě přístupu, který uživatel má. Pokud například nastavíte group_ids pole ["group_id1, group_id2"] pro dokument s file_name "secured_file_b", mají k souboru přístup pro čtení jenom uživatelé, kteří patří do ID skupin "group_id1" nebo "group_id2".

    Nastavte atribut pole retrievable tak false , aby se nevrátil jako součást požadavku hledání.

  2. Indexy vyžadují klíč dokumentu. Pole "file_id" splňuje tento požadavek. Indexy by také měly obsahovat prohledávatelný obsah. Pole "file_name" a "file_description" představují v tomto příkladu.

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

Nasdílení dat do indexu pomocí rozhraní REST API

Odešlete požadavek HTTP POST do kolekce dokumentů koncového bodu adresy URL indexu (viz Dokumenty – Index). Text požadavku HTTP je vykreslení dokumentů, které se mají indexovat:

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

V textu požadavku zadejte obsah dokumentů:

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

Pokud potřebujete aktualizovat existující dokument se seznamem skupin, můžete použít merge tuto akci mergeOrUpload :

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

Použití filtru zabezpečení v dotazu

Pokud chcete oříznout dokumenty na group_ids základě přístupu, měli byste vydat vyhledávací dotaz s filtrem group_ids/any(g:search.in(g, 'group_id1, group_id2,...')) , kde "group_id1, group_id2,..." jsou skupiny, do kterých patří vystavitel žádosti o vyhledávání.

Tento filtr odpovídá všem dokumentům, pro které group_ids pole obsahuje jeden z daných identifikátorů. Úplné podrobnosti o prohledávání dokumentů pomocí služby Azure AI Search najdete v tématu Dokumenty služby Search.

Tato ukázka ukazuje, jak nastavit dotaz pomocí požadavku POST.

Zadejte požadavek HTTP POST:

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]

Zadejte filtr v textu požadavku:

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

Dokumenty byste měli získat zpátky tam, kde group_ids jsou buď "group_id1", nebo "group_id2". Jinými slovy, získáte dokumenty, ke kterým má vystavitel požadavku přístup pro čtení.

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

Další kroky

Tento článek popisuje vzor filtrování výsledků na základě identity uživatele a search.in() funkce. Tuto funkci můžete použít k předání identifikátorů objektu zabezpečení pro žadatele, aby se shodovaly s hlavními identifikátory přidruženými k jednotlivým cílovým dokumentům. Když se zpracuje požadavek vyhledávání, funkce vyfiltruje výsledky hledání, search.in pro které žádný z objektů zabezpečení uživatele nemá přístup ke čtení. Identifikátory objektu zabezpečení můžou představovat například skupiny zabezpečení, role nebo dokonce vlastní identitu uživatele.

Alternativní vzor založený na ID Microsoft Entra nebo se můžete vrátit k dalším funkcím zabezpečení, najdete na následujících odkazech.