Üçüncü taraf altyapısını OneLake güvenliğiyle tümleştirme (önizleme)

Bu makalede, üçüncü taraf motor geliştiricilerinin OneLake güvenliğiyle entegre olarak, OneLake’ten veri sorgularken satır düzeyi güvenlik (RLS) ve sütun düzeyi güvenlik (CLS) uygulama yöntemleri açıklanmaktadır. Tümleştirme, altyapınızın verileri doğrudan OneLake'ten okuduğu ve kendi işlem katmanında güvenlik ilkelerini zorunlu kıldığı yetkili altyapı modelini kullanır.

Uyarı

Bu özellik önizleme sürümünün bir parçasıdır ve yalnızca değerlendirme ve geliştirme amacıyla sağlanır. Geri bildirim temelinde değişebilir ve üretim kullanımı için önerilmez.

Genel bakış

OneLake güvenliği, OneLake'de tablo düzeyi, satır düzeyi ve sütun düzeyi güvenlik de dahil olmak üzere ayrıntılı erişim denetim politikalarını bir kez tanımlar. Spark ve SQL analytics uç noktası gibi Microsoft Fabric altyapıları bu ilkeleri sorgu zamanında zorunlu kılar. Ancak OneLake güvenliği, verilere nasıl erişildiğinden bağımsız olarak ayrıntılı erişim denetimi ilkelerinin uygulanmasını garanti eder. Sonuç olarak, verilerin sızdırılmasının engellenmemesi için OneLake'ten dosya okumak için yetkisiz dış istekler engellenir.

Yetkili motor modeli bu sorunu çözer. Verilere tam okuma erişimi olan ve güvenlik meta verilerini de okuyabilen ayrılmış bir kimlik (hizmet sorumlusu veya yönetilen kimlik) kaydedersiniz. Motorunuz bu kimliği kullanarak:

  1. OneLake'den ham veri dosyalarını okuyun.
  2. Belirli bir kullanıcı için etkili güvenlik ilkelerini almak amacıyla Yetkilendirilmiş erişim alın API'sini çağırın.
  3. Döndürülen satır ve sütun filtrelerini kendi sorgu yürütme katmanına uygulayın.
  4. Son kullanıcıya yalnızca izin verilen verileri döndürür.

Bu yaklaşım, motorunuza sorgu planlama ve önbelleğe alma üzerinde tam kontrol sağlarken, güvenlik uygulamalarını Fabric motorlarıyla tutarlı bir şekilde korurken yetkilendirme kontrolünü kullanıcının eline bırakır.

Önkoşullar

Tümleştirmeye başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:

  • Motorunuzun OneLake'e erişmek için kullandığı bir Microsoft Entra hizmet sorumlusu veya yönetilen kimlik. Yalnızca Microsoft Entra kimlikleri desteklenir.
  • Hedef çalışma alanında altyapı kimliği için Çalışma Alanı Üyesi (veya üzeri) rolü. Bu, kimliğe OneLake'ten veri dosyalarını ve güvenlik meta verilerini okumak için gerekli ayrıcalıkları verir.
  • OneLake güvenliği etkinleştirilmiş bir Doku öğesi (lakehouse, yansıtılmış veritabanı veya yansıtılmış katalog).
  • RLS veya CLS ilkelerini zorlamak istediğiniz öğede yapılandırılan OneLake güvenlik rolleri.
  • Altyapı kimliği, okuduğu tablolara sınırsız Okuma erişimine sahip olmalıdır. RLS veya CLS ilkeleri altyapı kimliğinin kendisine uygulanırsa, API çağrıları hata döndürür.

Architecture

Aşağıdaki diyagramda yetkili motor tümleştirmesi için üst düzey yetkilendirme süreci gösterilmektedir.

┌──────────────┐       ┌──────────────────┐       ┌───────────┐
│  End user    │──1──▶│  3rd-party engine │──2──▶│  OneLake  │
│  (query)     │       │(service principal)│◀──3──│  (data +  │
│              │◀──6──│                   │──4──▶│  security)│
└──────────────┘       └──────────────────┘       └───────────┘
  1. Son kullanıcı üçüncü taraf altyapısına bir sorgu gönderir.
  2. Motor kimliği, OneLake'e kimlik doğrulaması yapar ve OneLake API'lerini kullanarak ham veri dosyalarını (Delta parquet) okur.
  3. OneLake istenen verileri döndürür.
  4. Motor, kullanıcının etkin erişimini elde etmek için son kullanıcının Microsoft Entra nesne kimliğini aktararak API principalAccess'yi çağırır.
  5. Altyapı, döndürülen erişim filtrelerini (tablo erişimi, RLS önkoşulları, CLS sütun listeleri) kendi işlem katmanındaki verilere uygular.
  6. Altyapı, son kullanıcıya yalnızca filtrelenmiş, izin verilen sonuçları döndürür.

1. Adım: Altyapı kimliğini ayarlama

Motorunuzun OneLake tarafından tanınıp güvenilen bir Microsoft Entra kimliğine ihtiyacı var. Bu kimlik, altyapınız adına veri dosyalarını ve güvenlik meta verilerini okur.

  1. Altyapınız için Microsoft Entra ID'de bir hizmet sorumlusu veya yönetilen kimlik oluşturun ya da tanımlayın. Daha fazla bilgi için bkz Microsoft Entra ID'de uygulama ve hizmet asıl nesneleri.

  2. Kimliği çalışma alanı Üye rolüne ekleyin. Doku portalında çalışma alanı ayarlarına gidin ve hizmet sorumlusunu Üye rolüne ekleyin. Bu, kimliğe izin verir:

    • OneLake'teki tüm veri dosyalarına o çalışma alanında bulunan öğeler için okuma erişimi.
    • Yetkili altyapı API'leri aracılığıyla OneLake güvenlik rolü meta verilerini okumaya erişim.

    Çalışma alanı rolleri hakkında daha fazla bilgi için bkz. Çalışma alanlarındaki roller.

  3. Kimliğinizin sınırsız erişime sahip olduğundan emin olun. Motor kimliği, sorguladığı her tabloya tam Okuma erişimine sahip olmalıdır. Herhangi bir OneLake güvenlik rolü altyapı kimliğine RLS veya CLS kısıtlamaları uygularsa veri okumaları ve API çağrıları başarısız olur. En iyi uygulama, motor kimliğini RLS veya CLS kısıtlamaları içeren OneLake güvenlik rollerine eklememektir.

Önemli

Motorun erişimini, onu çalışma alanı rolünden çıkararak istediğiniz zaman iptal edebilirsiniz. Erişimi iptal etme işlemi yaklaşık 2 dakika içinde geçerli olur.

2. Adım: OneLake'ten veri okuma

Altyapı kimliği yapılandırıldığında, altyapınız standart Azure Data Lake Storage (ADLS) 2. Nesil API'lerini kullanarak veri dosyalarını doğrudan OneLake'den okuyabilir.

OneLake verilerine şu konumdan erişilebilir:

https://onelake.dfs.fabric.microsoft.com/{workspaceId}/{itemId}/Tables/{schema}/{tableName}/

Motorunuz, Microsoft Entra OAuth 2.0 istemci kimlik bilgileri süreç akışı aracılığıyla alınan Bearer belirteci kullanarak kimlik doğrulaması yapar. Belirteci istediğinizde OneLake kaynak kapsamını https://storage.azure.com/.default kullanın.

Örnek: Verilerin kimliğini doğrulama ve okuma (Python)

from azure.identity import ClientSecretCredential
from azure.storage.filedatalake import DataLakeServiceClient

tenant_id = "<your-tenant-id>"
client_id = "<your-service-principal-client-id>"
client_secret = "<your-service-principal-secret>"

credential = ClientSecretCredential(tenant_id, client_id, client_secret)

service_client = DataLakeServiceClient(
    account_url="https://onelake.dfs.fabric.microsoft.com",
    credential=credential
)

# Access a specific item in a workspace
file_system_client = service_client.get_file_system_client("<workspace-id>")
directory_client = file_system_client.get_directory_client("<item-id>/Tables/dbo/Customers")

# List and read Delta parquet files
for path in directory_client.get_paths():
    if path.name.endswith(".parquet"):
        file_client = file_system_client.get_file_client(path.name)
        downloaded = file_client.download_file()
        data = downloaded.readall()
        # Process the parquet data with your engine

OneLake API'leri hakkında daha fazla bilgi için bkz. API'lerle OneLake erişimi.

3. Adım: Kullanıcının etkin erişimini getirme

Ham verileri okuduktan sonra, sorgulayan kullanıcının görmesine izin verilen verileri altyapınızın belirlemesi gerekir. Bir öğe için kullanıcıya etkin yetkili erişim sağlamak amacıyla "Sorumlu için yetkili erişimi al" API'sini çağırın.

API uç noktası

GET https://onelake.dfs.fabric.microsoft.com/v1.0/workspaces/{workspaceId}/artifacts/{artifactId}/securityPolicy/principalAccess

İstek içeriği

{
  "aadObjectId": "<end-user-entra-object-id>",
  "inputPath": "Tables",
  "maxResults": 500 //optional, default is 500
}
Parametre Türü Zorunlu Açıklama
aadObjectId string Evet Erişimini denetlemek istediğiniz son kullanıcının Microsoft Entra nesne kimliği.
inputPath string Evet Tables veya Files. Kullanıcının öğenin belirtilen bölümü için erişimini döndürür. Çoğu sorgu motoru için inputPath Tables olacaktır.
continuationToken string Hayır Sonuç kümesi maxResults aşıldığında devam eden sonuçları getirmek için kullanılır.
maxResults tamsayı Hayır Sayfa başına en fazla öğe sayısı. Varsayılan değer 500'dür.

Örnek yanıt (yalnızca RLS)

{
  "identityETag": "3fc4dc476ded773e4cf43936190bf20fa9480a077b25edc0b4bbe247112542f6",
  "metadataETag": "\"eyJhciI6IlwiMHg4R...\"",
  "value": [
    {
      "path": "Tables/dbo/Customers",
      "access": ["Read"],
      "rows": "SELECT * FROM [dbo].[Customers] WHERE [customerId] = '123'",
      "effect": "Permit"
    },
    {
      "path": "Tables/dbo/Employees",
      "access": ["Read"],
      "rows": "SELECT * FROM [dbo].[Employees] WHERE [address] = '123'",
      "effect": "Permit"
    },
    {
      "path": "Tables/dbo/EmployeeTerritories",
      "access": ["Read"],
      "effect": "Permit"
    }
  ]
}

Örnek yanıt (RLS ve CLS)

Bir tabloda sütun düzeyi güvenlik yapılandırıldığında, yanıt yalnızca kullanıcının erişmesine izin verilen sütunları listeleyen bir columns dizi içerir. Bu dizide bulunmayan sütunlar kullanıcıdan gizlenir.

{
  "identityETag": "79372bc169b00882d9abec3d404032131e96bc406e15c6766514723021e153eb",
  "metadataETag": "\"eyJhciI6IlwiMHg4R...\"",
  "value": [
    {
      "path": "Tables/dbo/Customers",
      "access": ["Read"],
      "columns": [
        {
          "name": "address",
          "columnEffect": "Permit",
          "columnAction": ["Read"]
        },
        {
          "name": "city",
          "columnEffect": "Permit",
          "columnAction": ["Read"]
        },
        {
          "name": "contactTitle",
          "columnEffect": "Permit",
          "columnAction": ["Read"]
        },
        {
          "name": "country",
          "columnEffect": "Permit",
          "columnAction": ["Read"]
        },
        {
          "name": "fax",
          "columnEffect": "Permit",
          "columnAction": ["Read"]
        },
        {
          "name": "phone",
          "columnEffect": "Permit",
          "columnAction": ["Read"]
        },
        {
          "name": "postalCode",
          "columnEffect": "Permit",
          "columnAction": ["Read"]
        },
        {
          "name": "region",
          "columnEffect": "Permit",
          "columnAction": ["Read"]
        }
      ],
      "rows": "SELECT * FROM [dbo].[Customers] WHERE [customerID] = 'ALFKI'",
      "effect": "Permit"
    },
    {
      "path": "Tables/dbo/Employees",
      "access": ["Read"],
      "rows": "SELECT * FROM [dbo].[Employees] WHERE [address] = '123'",
      "effect": "Permit"
    }
  ]
}

Yanıtı anlama

Yanıt, her biri PrincipalAccessEntry kullanıcının erişimi olan bir tabloyu temsil eden bir nesne dizisi içerir. Yanıtta bulunmayan tablolara kullanıcı erişemez.

Alan Türü Açıklama
path string Kullanıcının erişebileceği tablonun yolu, örneğin Tables/dbo/Customers.
access string[] Verilen erişim türleri dizisi. Şu anda yalnızca Read desteklenmektedir.
columns object[] Kullanıcının erişmesine izin verilen sütun nesneleri dizisi. Her nesne name (sütun adı), columnEffect (Permit) ve columnAction (["Read"]) içerir. Bu alan yoksa, CLS uygulanmaz ve tüm sütunlara izin verilir. Varsa , yalnızca listelenen sütunlar döndürülmelidir.
rows string Satır düzeyi güvenlik filtresini temsil eden bir T-SQL SELECT deyimi. Yalnızca bu koşulla eşleşen satırlar kullanıcıya döndürülmelidir. Bu alan yoksa, hiçbir RLS uygulanmaz ve tüm satırlara izin verilir.
effect string Efekt türü. Şu anda Permit durumunda.

Önemli

rows alanı, motorunuzun ayrıştırması ve filtre önkoşulu olarak uygulaması gereken bir T-SQL ifadesi içerir. İfade bir SELECT * FROM [schema].[table] WHERE ... biçim kullanır. Motorunuz WHERE yan tümcesini ayıklamalı ve döndürülen verilere uygulamalıdır.

Önbelleğe alma için ETag'ler

Yanıt, verimli önbelleğe almayı sağlayan iki ETag değeri içerir:

  • identityETag: Kullanıcının kimliğinin ve grup üyeliklerinin geçerli durumunu temsil eder. Kullanıcının erişim sonucunu önbelleğe alın ve bu ETag değişene kadar yeniden kullanın.
  • metadataETag: Öğenin güvenlik yapılandırmasının geçerli durumunu temsil eder. Rol meta verilerini önbelleğe alın ve bu ETag değişene kadar yeniden kullanın.

Değişmeyen verilerin yeniden getirilmemesi için istek üst bilgisi ile If-None-Match bu ETag'leri kullanın. Bu, çok kullanıcılı önbelleklerin performansını artırır.

Örnek: Etkin erişime ulaşma (Python)

import requests

# Get a token for the OneLake DFS endpoint
token = credential.get_token("https://storage.azure.com/.default").token

workspace_id = "<workspace-id>"
artifact_id = "<artifact-id>"
user_object_id = "<end-user-entra-object-id>"

url = (
    f"https://onelake.dfs.fabric.microsoft.com/v1.0/"
    f"workspaces/{workspace_id}/artifacts/{artifact_id}/"
    f"securityPolicy/principalAccess"
)

headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json"
}

body = {
    "aadObjectId": user_object_id,
    "inputPath": "Tables"
}

response = requests.get(url, headers=headers, json=body)
access_data = response.json()

# The response contains the user's effective access
for entry in access_data["value"]:
    print(f"Table: {entry['path']}, Access: {entry['access']}")
    if "columns" in entry:
        col_names = [col["name"] for col in entry["columns"]]
        print(f"  CLS permitted columns: {col_names}")
    if "rows" in entry:
        print(f"  RLS filter: {entry['rows']}")

4. Adım: Güvenlik filtreleri uygulama

Kullanıcının etkin erişimini getirdikten sonra motorunuzun sonuçları döndürmeden önce verilere güvenlik ilkelerini uygulaması gerekir. Bu adım kritiktir; motorunuz ilkeleri doğru şekilde uygulamaktan sorumludur.

Tablo düzeyinde filtreleme

Yalnızca yanıtta principalAccess görünen tablolardan veri döndürür. Tablo listelenmiyorsa, kullanıcının tabloya erişimi yoktur ve hiçbir veri döndürülmemelidir.

# Build a set of accessible tables for the user
accessible_tables = {entry["path"] for entry in access_data["value"]}

# Before returning query results, verify the table is accessible
def is_table_accessible(table_path: str) -> bool:
    return table_path in accessible_tables

Satır düzeyi güvenlik filtrelemesi

Erişim girdisinde bir rows alan varsa, altyapınızın T-SQL koşulunu ayrıştırması ve tablonun verilerine filtre olarak uygulaması gerekir. rows değeri, kullanıcının görebileceği satırları tanımlayan koşula sahip bir SELECT ifadedirWHERE.

Önemli

Motorunuz SQL ifadelerini ayrıştıramıyorsa, null olmayan bir rows özelliğine sahip tablolara yönelik sorgular bir hatayla sonuçlanmalı ve herhangi bir veri döndürmemelidir. Bu, kullanıcılara yalnızca görmelerine izin verilenlere erişim verilmesini sağlar.

Örneğin, aşağıdaki RLS filtresi:

SELECT * FROM [dbo].[Customers] WHERE [customerId] = '123' UNION SELECT * FROM [dbo].[Customers] WHERE [customerID] = 'ALFKI'

Altyapınız, önkoşulları ayıklamalı ve verileri filtrelemek için bunları uygulamalıdır:

import sqlparse

def extract_rls_predicates(rls_expression: str) -> list:
    """
    Parse the RLS T-SQL expression and extract WHERE clause predicates.
    The expression may contain UNION of multiple SELECT statements.
    """
    predicates = []
    statements = rls_expression.split(" UNION ")
    for stmt in statements:
        parsed = sqlparse.parse(stmt)[0]
        where_seen = False
        where_clause = []
        for token in parsed.tokens:
            if where_seen:
                where_clause.append(str(token).strip())
            if token.ttype is sqlparse.tokens.Keyword and token.value.upper() == "WHERE":
                where_seen = True
        if where_clause:
            predicates.append(" ".join(where_clause))
    return predicates


def apply_rls_filter(dataframe, access_entry: dict):
    """Apply RLS filtering to a dataframe based on the access entry."""
    if "rows" not in access_entry:
        return dataframe  # No RLS, return all rows

    predicates = extract_rls_predicates(access_entry["rows"])
    # Combine predicates with OR (UNION semantic)
    combined_filter = " OR ".join(f"({p})" for p in predicates)
    return dataframe.filter(combined_filter)

Önemli

rows Alan bir erişim girdisinde olmadığında, bu tabloya hiçbir RLS uygulanmaz ve tüm satırlar döndürülmelidir. Alan mevcut olduğunda motorunuzun verileri filtrelemesi gerekir. RLS içeren bir tablo için filtrelenmemiş verileri döndürmek bir güvenlik ihlalidir.

Sütun düzeyinde güvenlik filtrelemesi

Bir tabloda CLS yapılandırıldığında, yanıt kullanıcının principalAccess erişmesine izin verilen sütunları açıkça listeleyen bir columns dizi içerir. Her sütun nesnesi şu içeriği içerir:

Mülkiyet Türü Açıklama
name string Sütun adı (büyük/küçük harfe duyarlı).
columnEffect string Sütuna uygulanan efekt. Şu anda Permit durumunda.
columnAction string[] Sütun üzerinde izin verilen işlemler. Şu anda yalnızca Read desteklenmektedir.

columns Alan bir erişim girdisinde yoksa, CLS uygulanmaz ve tablodaki tüm sütunlara izin verilir. Eğer columns alanı varsa, motorunuz yalnızca listelenen sütunları döndürmelidir.

def get_permitted_columns(access_entry: dict) -> list | None:
    """
    Return the list of permitted column names for a table.
    Returns None if no CLS applies (all columns are permitted).
    """
    if "columns" not in access_entry:
        return None  # No CLS, all columns are permitted

    return [
        col["name"]
        for col in access_entry["columns"]
        if col.get("columnEffect") == "Permit"
        and "Read" in col.get("columnAction", [])
    ]


def apply_cls_filter(dataframe, access_entry: dict):
    """Apply CLS filtering to a dataframe based on the access entry."""
    permitted_columns = get_permitted_columns(access_entry)
    if permitted_columns is None:
        return dataframe  # No CLS, return all columns

    # Only keep columns that are in the permitted list
    return dataframe.select(permitted_columns)

Önemli

columns Alan bir erişim girdisinde olmadığında, CLS uygulanmaz ve tüm sütunlar döndürülmelidir. Alan mevcut olduğunda, motorunuzun yalnızca listelenen sütunları döndürmesi gerekir. Gizli sütunları döndürmek bir güvenlik ihlalidir.

Erişimi olmayan tabloları işleme

Kullanıcı yanıtta principalAccess görünmeyen bir tabloyu sorgularsa altyapınızın erişimi reddetmesi gerekir. Filtrelenmemiş verileri döndürmeye geri dönmeyin.

def query_table(table_path: str, user_access: dict):
    """Query a table with OneLake security enforcement."""
    # Find the user's access entry for this table
    entry = next(
        (e for e in user_access["value"] if e["path"] == table_path),
        None
    )

    if entry is None:
        raise PermissionError(
            f"Access denied: user doesn't have permission to access {table_path}"
        )

    # Read the data from OneLake
    data = read_table_from_onelake(table_path)

    # Apply column-level security
    data = apply_cls_filter(data, entry)

    # Apply row-level security
    data = apply_rls_filter(data, entry)

    return data

5. Adım: Önbelleğe alma ve değişiklik algılamayı işleme

Üretim sınıfı tümleştirmeler, özellikle de çok kullanıcılı veri önbelleklerine sahip altyapılar için, güvenlik ilkeleri ve kullanıcı grubu üyeliklerindeki değişiklikleri işlemeniz gerekir.

Önbellek güvenliği meta verileri

Önbelleğe identityETag alınan güvenlik bilgilerinin ne zaman eski olduğunu belirlemek için yanıttan metadataETag ve principalAccess değerlerini kullanın:

  • identityETag: Kullanıcının grup üyelikleri veya kimlik özellikleri güncelleştirildiğinde yapılan değişiklikler. Kullanıcının (userId, identityETag) üzerinde anahtarlanmış etkin erişimini önbelleğe alın.
  • metadataETag: Öğedeki OneLake güvenlik rolleri veya ilkeleri güncelleştirildiğinde yapılan değişiklikler. üzerinde (artifactId, metadataETag) anahtarlanan önbellek rolü tanımlamaları.

Değişiklikler için yoklama

Değişiklikleri algılamak principalAccess için API'yi düzenli aralıklarla yoklayın. Hiçbir şeyin değişmediğinden emin olmak için api sorgu yürütmeden önce yoklanmalı ve sonuçları doğrudan önbellekten sunmamalıdır. Bant genişliğini en aza indirmek için If-None-Match üst bilgisini daha önce alınan ETag ile birlikte kullanın.

headers = {
    "Authorization": f"Bearer {token}",
    "Content-Type": "application/json",
    "If-None-Match": f'"{cached_etag}"'
}

response = requests.get(url, headers=headers, json=body)

if response.status_code == 304:
    # Security hasn't changed, use cached data
    pass
elif response.status_code == 200:
    # Security has changed, update cache
    new_access_data = response.json()
    update_cache(user_id, new_access_data)

Gecikme süresiyle ilgili dikkat edilmesi gerekenler

  • OneLake güvenlik rolü tanımlarında yapılan değişikliklerin yayılması yaklaşık 5 dakika sürer.
  • Microsoft Entra Id'deki kullanıcı grubu üyeliklerindeki değişikliklerin OneLake'e yansıtilmesi yaklaşık 1 saat sürer.
  • Bazı Fabric motorlarının kendi önbelleğe alma katmanı vardır, bu nedenle ek süre gerektirebilir.

Yoklama aralığınızı tasarlayıp TTL'yi uygun şekilde önbelleğe alın. Önerilen bir yaklaşım, güvenlik meta verileri değişiklikleri için 5 dakikada bir yoklama yapmak ve her sorguda veya daha kısa bir aralıkta kullanıcıya özgü erişimi yenilemektir.

6. Adım: Sayfalandırmayı işleme

API, principalAccess birçok tabloya sahip öğeler için sayfalandırmayı destekler. Yanıt maxResults'dan daha fazla öğe içerdiğinde, yanıt continuationToken içerir.

all_entries = []
continuation_token = None

while True:
    body = {
        "aadObjectId": user_object_id,
        "inputPath": "Tables",
        "maxResults": 500
    }
    if continuation_token:
        body["continuationToken"] = continuation_token

    response = requests.get(url, headers=headers, json=body)
    data = response.json()
    all_entries.extend(data["value"])

    # Check for continuation token in response
    continuation_token = data.get("continuationToken")
    if not continuation_token:
        break

Hata yönetimi

Tümleştirmenizde aşağıdaki hata senaryolarını ele alın:

HTTP durumu Hata kodu Açıklama Önerilen eylem
200 - Başarı. Yanıtı işleme.
404 Öğe Bulunamadı Çalışma alanı veya öğe mevcut değil ya da motor kimliğinin erişim izni yok. Çalışma alanı kimliğini ve yapıt kimliğini doğrulayın. Motor kimliğinin çalışma alanı üye erişimine sahip olduğunu onaylayın.
412 Ön Koşul Başarısız 'de If-Match sağlanan ETag, geçerli ETag kaynağıyla eşleşmiyor. En son ETag'i almak için üst bilgi olmadan If-Match kaynağı yeniden getirin.
429 - Hız sınırı aşıldı. Yeniden denemeden önce üst bilgide Retry-After belirtilen süreyi bekleyin.

En iyi güvenlik uygulamaları

Güvenli bir tümleştirme sağlamak için şu en iyi yöntemleri izleyin:

  • Motorun kimlik bilgilerini koruyun. Hizmet sorumlusunun OneLake'teki verilere yükseltilmiş erişimi vardır. Azure Key Vault gibi hizmetleri kullanarak kimlik bilgilerini güvenli bir şekilde depolayın.
  • Ham verileri son kullanıcılara göstermeyin. Herhangi bir veri döndürmeden önce her zaman API tarafından principalAccess döndürülen güvenlik filtrelerini uygulayın. Zorlamanın atlanması bir güvenlik ihlalidir.
  • RLS önermelerini dikkatle doğrulayın. T-SQL WHERE yan tümcesi koşullarını doğru bir şekilde ayrıştırın ve uygulayın. Yanlış ayrıştırma veri sızıntısına neden olabilir. Ayrıştırma hataları veya söz dizimi eşlemesi oluşursa, kullanıcıya kısmi veya güvenli olmayan sonuçlar göstermek yerine RLS ayrıştırma hatasıyla sorguyu başarısız yapın.
  • Eksik tabloları erişim reddi olarak işleyin. API yanıtında tablo yoksa kullanıcının erişimi yoktur. Filtrelenmemiş verilere asla geri dönme, OneLake güvenliği her zaman varsayılan olarak reddetme kullanır.
  • Erişim denetimi. Uyumluluk ve sorun giderme için hangi kullanıcıların hangi tablolara erişip hangi güvenlik ilkelerinin uygulandığını günlüğe kaydetme.
  • Güvenlik değişiklikleriyle ilgili anket. Değişiklikleri algılamak ve önbelleğe alınan ilkeleri hemen yenilemek için ETag'leri kullanın.

Sınırlamalar

  • principalAccess API önizleme aşamasındadır ve geri bildirimlere göre değişebilir.
  • Read Bugün yalnızca erişim türü ve Permit etkisi desteklenir.
  • Motor kimliği sınırsız kök seviyesinde erişime sahip olmalıdır. RLS veya CLS altyapı kimliği için geçerliyse API çağrıları başarısız olur.
  • RLS koşullarında T-SQL söz dizimi kullanılır. Motorunuz, önermeleri doğru bir şekilde ayrıştırmak ve uygulamakla sorumludur.
  • Güvenlik ilkesi değişikliklerinin yayılması yaklaşık 5 dakika sürer. Kullanıcı grubu üyeliği değişiklikleri yaklaşık 1 saat sürer.