Azure AI Search'te sonuçları kırpmaya yönelik güvenlik filtreleri

Azure AI Search belge düzeyinde izinler sağlamaz ve arama sonuçlarını kullanıcı izinlerine göre aynı dizinden değiştiremez. Geçici bir çözüm olarak, grup veya kullanıcı kimliği içeren bir dizeye göre arama sonuçlarını kırpan bir filtre oluşturabilirsiniz.

Bu makalede, aşağıdaki adımları içeren bir güvenlik filtreleme düzeni açıklanmaktadır:

  • Kaynak belgeleri gerekli içerikle bir araya getirme
  • Asıl tanımlayıcılar için alan oluşturma
  • Belgeleri dizin oluşturma için arama dizinine gönderme
  • Filtre işleviyle search.in dizini sorgulama

Güvenlik filtresi düzeni hakkında

Azure AI Search, dizin içindeki içeriğe erişim için güvenlik alt sistemleriyle tümleştirilmez ancak belge düzeyinde güvenlik gereksinimleri olan birçok müşteri filtrelerin ihtiyaçlarını karşılayabildiğini tespit etti.

Azure AI Search'te güvenlik filtresi, eşleşen bir değere göre bir arama sonucu içeren veya dışlayan normal bir OData filtresidir; bunun dışında, ölçütler bir güvenlik sorumlusundan oluşan bir dizedir. Güvenlik sorumlusu aracılığıyla kimlik doğrulaması veya yetkilendirme yoktur. Sorumlu, bir belgeyi arama sonuçlarına dahil etmek veya arama sonuçlarından dışlamak için filtre ifadesinde kullanılan bir dizedir.

Güvenlik filtrelemesi yapmanın çeşitli yolları vardır. Bunun bir yolu, eşitlik ifadelerinin karmaşık bir şekilde ayrıştırılmasıdır: örneğin, Id eq 'id1' or Id eq 'id2'vb. Bu yaklaşım hataya açıktır, bakımı zordur ve listenin yüzlerce veya binlerce değer içerdiği durumlarda sorgu yanıt süresini birkaç saniye yavaşlatır.

Daha iyi bir çözüm, bu makalede açıklandığı gibi güvenlik filtreleri için işlevini kullanmaktır search.in . Eşitlik ifadesi yerine kullanırsanız search.in(Id, 'id1, id2, ...') , altsaniye yanıt süreleri bekleyebilirsiniz.

Önkoşullar

  • Grup veya kullanıcı kimliği içeren alan, filtrelenebilir özniteliğine sahip bir dize olmalıdır. Bu bir koleksiyon olmalıdır. Null değerlere izin vermemelidir.

  • Aynı belgedeki diğer alanlar, bu grup veya kullanıcı tarafından erişilebilen içeriği sağlamalıdır. Aşağıdaki JSON belgelerinde "security_id" alanları bir güvenlik filtresinde kullanılan kimlikleri içerir ve arayanın kimliği belgenin "security_id" ile eşleşiyorsa ad, maaş ve evlilik durumu eklenir.

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

    Not

    Asıl tanımlayıcıları alma ve bu dizeleri Azure AI Search tarafından dizine alınabilecek kaynak belgelere ekleme işlemi bu makalede ele alınmamıştır. Tanımlayıcıları alma konusunda yardım için kimlik hizmeti sağlayıcınızın belgelerine bakın.

Güvenlik alanı oluşturma

Arama dizininde, alan koleksiyonunda, önceki örnekteki kurgusal "security_id" alanına benzer şekilde grup veya kullanıcı kimliğini içeren bir alana ihtiyacınız vardır.

  1. Güvenlik alanını olarak Collection(Edm.String)ekleyin. Arama sonuçlarının filterable kullanıcının erişimine göre filtrelenebilmesi için true özniteliğinin olarak ayarlandığından emin olun. Örneğin, "secured_file_b" içeren file_name belgenin alanını ["group_id1, group_id2"] olarak ayarlarsanızgroup_ids, yalnızca "group_id1" veya "group_id2" grup kimliklerine ait kullanıcıların dosyaya okuma erişimi olur.

    Arama isteğinin bir parçası olarak döndürülmeyecek şekilde alanın retrievable özniteliğini false olarak ayarlayın.

  2. Dizinler bir belge anahtarı gerektirir. "file_id" alanı bu gereksinimi karşılar. Dizinler de aranabilir içerik içermelidir. "file_name" ve "file_description" alanları bu örnekte bunu temsil eder.

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

REST API kullanarak dizininize veri gönderme

Dizininizin URL uç noktasının docs koleksiyonuna bir HTTP POST isteği gönderin (bkz . Belgeler - Dizin). HTTP isteğinin gövdesi, dizine eklenecek belgelerin JSON işlemesidir:

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

İstek gövdesinde, belgelerinizin içeriğini belirtin:

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

Mevcut bir belgeyi grup listesiyle güncelleştirmeniz gerekiyorsa veya mergeOrUpload eylemini merge kullanabilirsiniz:

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

Sorguya güvenlik filtresi uygulama

Belgeleri erişime göre group_ids kırpmak için filtre içeren bir group_ids/any(g:search.in(g, 'group_id1, group_id2,...')) arama sorgusu vermelisiniz; burada "group_id1, group_id2,..." arama isteği verenin ait olduğu gruplardır.

Bu filtre, alanın verilen tanımlayıcılardan birini içerdiği tüm belgelerle group_ids eşleşir. Azure AI Search kullanarak belge aramayla ilgili tüm ayrıntılar için Belgeleri Ara'yı okuyabilirsiniz.

Bu örnek, POST isteği kullanarak sorguyu ayarlamayı gösterir.

HTTP POST isteğini gönderin:

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]

İstek gövdesinde filtreyi belirtin:

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

"group_id1" veya "group_id2" içeren belgeleri geri group_ids almanız gerekir. Başka bir deyişle, istek verenin okuma erişimine sahip olduğu belgeleri alırsınız.

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

Sonraki adımlar

Bu makalede, kullanıcı kimliğine ve işleve göre sonuçları filtrelemek için bir desen açıklanmaktadır search.in() . İstekte bulunan kullanıcının her hedef belgeyle ilişkili asıl tanımlayıcılarla eşleşmesi için asıl tanımlayıcıları geçirmek için bu işlevi kullanabilirsiniz. Bir arama isteği işlendiğinde işlev, search.in kullanıcı sorumlularından hiçbirinin okuma erişimi olmayan arama sonuçlarını filtreler. Asıl tanımlayıcılar güvenlik grupları, roller ve hatta kullanıcının kendi kimliği gibi öğeleri temsil edebilir.

Microsoft Entra Id'ye dayalı alternatif bir düzen için veya diğer güvenlik özelliklerini yeniden ziyaret etmek için aşağıdaki bağlantılara bakın.