Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
- OneLake'den ham veri dosyalarını okuyun.
- Belirli bir kullanıcı için etkili güvenlik ilkelerini almak amacıyla Yetkilendirilmiş erişim alın API'sini çağırın.
- Döndürülen satır ve sütun filtrelerini kendi sorgu yürütme katmanına uygulayın.
- 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)│
└──────────────┘ └──────────────────┘ └───────────┘
- Son kullanıcı üçüncü taraf altyapısına bir sorgu gönderir.
- Motor kimliği, OneLake'e kimlik doğrulaması yapar ve OneLake API'lerini kullanarak ham veri dosyalarını (Delta parquet) okur.
- OneLake istenen verileri döndürür.
- 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. - 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.
- 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.
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.
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.
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
principalAccessdöndürülen güvenlik filtrelerini uygulayın. Zorlamanın atlanması bir güvenlik ihlalidir. - RLS önermelerini dikkatle doğrulayın. T-SQL
WHEREyan 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
-
principalAccessAPI önizleme aşamasındadır ve geri bildirimlere göre değişebilir. -
ReadBugün yalnızca erişim türü vePermitetkisi 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.