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.
Veritabanı denetimleri, kuruluşunuzun uyumluluk gereksinimlerinin önemli bir bileşenidir. Hedeflenen etkinlikleri izleyerek güvenlik temelinize ulaşabilirsiniz. PostgreSQL için Azure Veritabanı esnek sunucusunda, PostgreSQL için Azure Veritabanı'nda denetim günlüğü bölümünde açıklandığı gibi pgaudit PG uzantısını kullanarak denetimleri ayarlayabilirsiniz.
Bir zorluk, Microsoft Entra ID gruplarını kullanırken ve tek tek grup üyelerinin eylemlerini denetlemek istediğinizde Microsoft Entra ID kimlik doğrulamasının yanı sıra denetim özelliğini kullanmaktır. Bu sınamanın nedeni, grup üyelerinin kişisel erişim belirteçlerini kullanarak oturum açmaları ancak kullanıcı adı olarak grup adını kullanmalarıdır.
Kusto Sorgu Dili (KQL), Azure Hizmet Günlüklerini sorgulamaya olanak tanıyan güçlü bir işlem hattı temelli, salt okunur sorgu dilidir. KQL, yüksek hacimli verileri hızla analiz etmek için Azure günlüklerini sorgulamayı destekler. Bu makale için KQL kullanarak Azure Postgres Günlüklerini sorgulayın ve denetim günlüklerinden Microsoft Entra Id kullanıcı bilgilerini ayıklayın.
Önkoşullar
- Denetim günlüğünü etkinleştirme - PostgreSQL için Azure Veritabanı'nda denetim günlüğü
- Azure Postgres günlüklerinin Azure Log Analytics gönderilmesini etkinleştirme - Günlükleri yapılandırma ve günlüklere erişme
-
log_line_prefixparametresini ayarlayın: Parametreler bölmesinde,log_line_prefixdeğerini, istenen sonuçları elde etmek içinuser=%u,db=%d,session=%c,sess_time=%skaçışlarını aynı sırada içerecek şekilde ayarlayın.- Önce:
log_line_prefix=%t-%c- - Sonra:
log_line_prefix=%t-%c-user=%u,db=%d,session=%c,sess_time=%s
- Önce:
Kusto sorgusu
Aşağıdaki Kusto sorgusu iki kez sorgular AzureDiagnostics .
İlk alt sorgu, Microsoft Entra ID connection authorized dizisini içeren tüm satırları bulur ve bu günlük satırlarından PrincipalName ile SessionId öğelerini ayıklar.
İkinci alt sorgu tüm denetim günlüklerini bulur.
Son olarak, bu iki alt sorgu SessionId üzerinde birleştirilir.
let lookbackTime = ago(3d);
let opindex = 3;
let startIndex = toscalar(range thirdIndex from opindex to opindex step 1
| project thirdIndex);
AzureDiagnostics
| where ResourceProvider == 'MICROSOFT.DBFORPOSTGRESQL'
| where TimeGenerated >= lookbackTime
| where Message contains 'Microsoft Entra ID connection authorized'
| extend SessionId = tostring(split(tostring(split(Message, 'session=')[-1]), ',sess_time')[-2])
| extend UPN = iff(Message contains 'UPN',tostring(split(tostring(split(Message, 'UPN=')[-1]), 'oid=')[-2]), '')
| extend appId = iff(Message contains 'appid', tostring(split(tostring(split(Message, 'appid=')[-1]), 'oid=')[-2]), '')
| extend PrincipalName = strcat(UPN, appId)
| project SessionId, PrincipalName
| join kind=leftouter
(
AzureDiagnostics
| where ResourceProvider == 'MICROSOFT.DBFORPOSTGRESQL'
| where TimeGenerated >= lookbackTime
| where Message contains 'AUDIT: SESSION'
| extend RoleName = tostring(split(tostring(split(Message, 'user=')[-1]), ',db')[-2])
| where RoleName !in ('azuresu', '[unknown]', 'postgres', '')
| extend SessionId = tostring(split(tostring(split(Message, 'session=')[-1]), ',sess_time')[-2])
| extend SubMessage = tostring(split(Message, 'SESSION,')[-1])
| extend splitArray = split(SubMessage, ',')
| extend SqlQueryP1 = tostring(split(tostring(split(Message, ',,,')[-1]), ',<')[-2])
| extend SqlQueryP2 = replace_string(tostring(split(SqlQueryP1, ',\"')[-1]), '"', '')
| extend SqlQueryP3 = tostring(split(Message, ',,,')[1])
| extend OperationType = tostring(splitArray[startIndex])
| extend SqlQuery = trim('"', case(OperationType == 'EXECUTE', SqlQueryP2, SqlQueryP1 == '', SqlQueryP3, SqlQueryP1))
)
on $left.SessionId == $right.SessionId
| project TimeGenerated, PrincipalName, RoleName, OperationType, SqlQuery
Örnek sonuçlar
Sonuçta elde edilen tablo şöyle görünür:
| TimeGenerated | AsılAd | Rol Adı | Operasyon Tipi | Sqlquery |
|---|---|---|---|---|
| 2025-12-12T16:25:05.104Z | user@example.com | ÖrnekGrupAdı | SELECT | pg_seclabels' den * seçin; |
| 2025-12-12T16:25:04.000Z | user@example.com | user@example.com | SELECT | pg_seclabels' den * seçin; |
Kullanıcı grup rolü olarak oturum açarsa ve PrincipalNameRoleName sütunları örneğin ilk satırında olduğu gibi farklı değerler gösterir.
PrincipalName değeri, oturum açan kullanıcıyı tanımlar. değeri, RoleName kullanıcının oturum açtıktan sonra eriştiği PostgreSQL'deki rolü tanımlar.
PrincipalName , kullanıcı sorumlusunun veya hizmet sorumlusunun oturum açıp açmadığına bağlı olarak Kullanıcı Asıl Adı (UPN) veya AppId'dir .