Megosztás:


Ellenőrzési naplózás az Azure Database for PostgreSQL-ben a Microsoft Entra azonosítóihoz

Az adatbázis-naplózás a szervezet megfelelőségi követelményeinek fontos összetevője. A célzott tevékenységek monitorozásával elérheti a biztonsági alapkonfigurációt. A rugalmas Azure Database for PostgreSQL-kiszolgálón a pgaudit PG-bővítmény használatával állíthat be naplózásokat az Azure Database for PostgreSQL naplózásában leírtak szerint.

Az egyik kihívás a Microsoft Entra ID-hitelesítés mellett a naplózási funkció használata, amikor Microsoft Entra-azonosítócsoportokat használ, és szeretné naplózni az egyes csoporttagok műveleteit. Ez a feladat azért van, mert a csoporttagok személyes hozzáférési jogkivonataik használatával jelentkeznek be, de felhasználónévként a csoportnevet használják.

A Kusto Query Language (KQL) egy hatékony folyamatalapú, írásvédett lekérdezési nyelv, amely lehetővé teszi az Azure-szolgáltatásnaplók lekérdezését. A KQL támogatja az Azure-naplók lekérdezését a nagy mennyiségű adat gyors elemzéséhez. Ebben a cikkben a KQL használatával kérdezheti le az Azure Postgres-naplókat, és kinyerheti a Microsoft Entra ID felhasználói adatait az auditnaplókból.

Előfeltételek

  1. Naplózás engedélyezése – Naplózás az Azure Database for PostgreSQL-ben
  2. Az Azure Postgres-naplók Azure Log Analyticsbe való küldésének engedélyezése – A Log Analytics konfigurálása
  3. Állítsa be a log_line_prefix kiszolgálóparamétert: A Kiszolgálóparaméterek panelen állítsa be, log_line_prefix hogy a feloldójelek user=%u,db=%d,session=%c,sess_time=%s ugyanabban a sorrendben szerepeljenek a kívánt eredmények lekéréséhez.
    • Előtt: log_line_prefix = %t-%c-
    • Ezt követően: log_line_prefix = %t-%c-user=%u,db=%d,session=%c,sess_time=%s

Kusto-lekérdezés

A következő Kusto-lekérdezés kétszer kérdez le AzureDiagnostics .
Az első al-lekérdezés megkeresi az összes sort, amelyik tartalmazza a Microsoft Entra ID connection authorized sztringet, és kinyeri a PrincipalName valamint a SessionId ezektől a naplósoroktól.
A második részkérés megkeresi az összes auditnaplót.
Végül ez a két albekérdezés összekapcsolódik a SessionId-en.

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

Példák az eredményekre

Az eredményként kapott táblázat a következőképpen néz ki:

GenerálásiIdőpont Főnév RoleName Művelettípus SqlQuery
2025-12-12T16:25:05.104Z user@example.com ExampleGroupName SELECT válassza a * lehetőséget a pg_seclabels;
2025-12-12T16:25:04.000Z user@example.com user@example.com SELECT válassza a * lehetőséget a pg_seclabels;

Ha a felhasználó csoportszerepkörként jelentkezik be, az PrincipalName oszlopok különböző RoleName értékeket mutatnak, például a példa első sorában.
Az PrincipalName érték azonosítja a bejelentkezett felhasználót. Az RoleName érték azonosítja azt a szerepkört a PostgreSQL-ben, amelyet a felhasználó a bejelentkezés után ér el.

PrincipalName az egyszerű felhasználónév (UPN) vagy az AppId attól függően, hogy a felhasználónév vagy szolgáltatásnév bejelentkezik-e.