Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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
- Naplózás engedélyezése – Naplózás az Azure Database for PostgreSQL-ben
- Az Azure Postgres-naplók Azure Log Analyticsbe való küldésének engedélyezése – A Log Analytics konfigurálása
- Állítsa be a
log_line_prefixkiszolgálóparamétert: A Kiszolgálóparaméterek panelen állítsa be,log_line_prefixhogy a feloldójelekuser=%u,db=%d,session=%c,sess_time=%sugyanabban 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
- Előtt:
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.