Megosztás:


A biztonsági gyorsítótár fogalmai

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Ez a cikk azt ismerteti, hogy az SQL Server hogyan használja a biztonsági gyorsítótárat annak ellenőrzésére, hogy a rendszerbiztonsági tagoknak milyen engedélyekkel kell hozzáférnie a biztonságos objektumokhoz.

Cél

Az adatbázismotor hierarchikus entitásgyűjteményt, más néven biztonságos objektumokat szervez, amelyek engedélyekkel védhetők. A legfontosabb biztonságos objektumok a kiszolgálók és az adatbázisok, de az engedélyeket finomabb szinten is meg lehet adni. Az SQL Server a megfelelő engedélyek biztosításával szabályozza az alanyok műveleteit a védett objektumokon.

Az alábbi ábra azt mutatja be, hogy egy felhasználó, Alice, rendelkezik egy bejelentkezéssel a kiszolgáló szintjén, és három különböző felhasználó van leképezve ugyanarra a bejelentkezésre az egyes adatbázisokban.

A diagram azt mutatja, hogy Alice egy bejelentkezéssel rendelkezhet a kiszolgáló szintjén, és három különböző felhasználó feleltethető meg ugyanarra a bejelentkezésre a különböző adatbázisokban.

A hitelesítési folyamat optimalizálásához az SQL Server egy biztonsági gyorsítótárat használ.

Nincs gyorsítótár-munkafolyamat

Ha a biztonsági gyorsítótár érvénytelen, az SQL Server egy gyorsítótár nélküli munkafolyamatot követ az engedélyek érvényesítéséhez. Ez a szakasz a gyorsítótár nélküli munkafolyamatot ismerteti.

A szemléltetéshez fontolja meg a következő lekérdezést:

SELECT t1.Column1,
       t2.Column1
FROM Schema1.Table1 AS t1
     INNER JOIN Schema2.Table2 AS t2
         ON t1.Column1 = t2.Column2;

Ha a biztonsági gyorsítótár érvénytelen, a szolgáltatás a lekérdezés feloldása előtt végrehajtja az alábbi munkafolyamatban leírt lépéseket.

A diagram a gyorsítótár nélküli munkafolyamatot jelöli.

Sql Server esetén a biztonsági gyorsítótár nélküli feladatok a következők:

  1. Csatlakozzon a példányhoz.
  2. Bejelentkezési ellenőrzés végrehajtása.
  3. Hozza létre a biztonsági környezet jogkivonatát és a bejelentkezési jogkivonatot. Ezeknek a tokeneknek a részleteit a következő szakaszban ismertetjük.
  4. Csatlakozzon az adatbázishoz.
  5. Hozzon létre egy adatbázis-felhasználói jogkivonatot az adatbázisban.
  6. Ellenőrizze az adatbázis-szerepkörök tagságát. Például db_datareader, db_datawriter vagy db_owner.
  7. Ellenőrizze a felhasználói engedélyeket az összes oszlopon, például a felhasználó engedélyeit a t1.Column1 és t2.Column1 oszlopokon.
  8. Ellenőrzi a felhasználói engedélyeket az összes táblán, például table1 és table2, valamint a sémaengedélyeket a Schema1 és Schema2-n.
  9. Ellenőrzi az adatbázis engedélyeit.

Az SQL Server megismétli a folyamatot minden olyan szerepkör esetében, amelyhez a felhasználó tartozik. Az összes engedély megszerzése után a kiszolgáló ellenőrzi, hogy a felhasználó rendelkezik-e a láncban minden szükséges engedéllyel, és hogy egyetlen megtagadás sincs a láncban. Az engedélyellenőrzés befejezése után megkezdődik a lekérdezés végrehajtása.

További információkért tekintse át az engedély-ellenőrzési algoritmus összegzését.

Az érvényesítés egyszerűsítése érdekében az SQL Server biztonsági gyorsítótárat használ.

Biztonsági gyorsítótár definíciója

A biztonsági gyorsítótár egy felhasználó vagy egy bejelentkezés engedélyeit tárolja egy adatbázis vagy kiszolgáló különböző biztonságos objektumaihoz. Az egyik előnye, hogy felgyorsítja a lekérdezések végrehajtását. Mielőtt az SQL Server végrehajt egy lekérdezést, ellenőrzi, hogy a felhasználó rendelkezik-e a szükséges engedélyekkel a különböző adatbázisokhoz, például sémaszintű engedélyekhez, táblaszintű engedélyekhez és oszlopengedélyekhez.

Biztonsági gyorsítótár-objektumok

Az előző szakaszban ismertetett munkafolyamat felgyorsítása érdekében az SQL Server számos különböző objektumot gyorsítótáraz a biztonsági gyorsítótárakban. A gyorsítótárazott objektumok némelyike a következők:

Jelző Leírás
SecContextToken A kiszolgáló-szintű biztonsági környezet egy főre ebben a struktúrában van tárolva. A felhasználói tokenek hash tábláját tartalmazza, és kiindulópontként vagy alapként szolgál az összes többi gyorsítótárhoz. A bejelentkezési jogkivonatra, a felhasználói jogkivonatra, a naplózási gyorsítótárra és a TokenPerm gyorsítótárra mutató hivatkozásokat tartalmaz. Emellett a kiszolgáló szintjén történő bejelentkezés alapjogkivonataként is működik.
LoginToken Hasonló a biztonsági környezet jogkivonatához. A kiszolgálószintű tagok adatait tartalmazza. A bejelentkezési jogkivonat különböző elemeket tartalmaz, például a SID-et, a bejelentkezési azonosítót, a bejelentkezési típust, a bejelentkezési nevet, az isDisabled állapotot és a kiszolgáló által rögzített szerepkör-tagságot. Emellett a kiszolgáló szintjén speciális szerepköröket is magában foglal, például a sysadmint és a biztonsági rendszergazdat.
UserToken Ez a struktúra adatbázisszintű tagokhoz kapcsolódik. Olyan részleteket tartalmaz, mint a felhasználónév, az adatbázisszerepkörök, a SID, az alapértelmezett nyelv, az alapértelmezett séma, az azonosító, a szerepkörök és a név. Adatbázisonként egy felhasználói token van a bejelentkezéshez.
TokenPerm Rögzíti az összes engedélyt egy biztonságos objektumhoz, amely egy UserTokenhez vagy SecContextTokenhez tartozik.
TokenAudit A kulcs egy biztonságos objektum osztálya és azonosítója. A bejegyzés olyan listák sorozata, amelyek egy objektum minden egyes naplózható műveletéhez tartalmaznak naplózási azonosítókat. A kiszolgálónaplózás az engedélyellenőrzéseken alapul, és részletezi az adott felhasználó által egy adott objektumon végzett összes naplózható műveletet.
TokenAccessResult Ez a gyorsítótár az egyes lekérdezések lekérdezési engedély-ellenőrzési eredményeit tárolja, lekérdezéstervenként egy bejegyzéssel. Ez a legfontosabb és leggyakrabban használt gyorsítótár, mivel ez az első dolog, amelyet a lekérdezés végrehajtása során ellenőriztek. Annak érdekében, hogy az alkalmi lekérdezések ne árasztják el a gyorsítótárat, csak akkor tárolja a lekérdezés engedély-ellenőrzési eredményeit, ha a lekérdezést háromszor hajtják végre.
ObjectPerm Ez az adatbázis egy objektumának összes engedélyét rögzíti az adatbázis összes felhasználója számára. A TokenPerm és az ObjectPerm közötti különbség az, hogy a TokenPerm egy adott felhasználóhoz tartozik, míg az ObjectPerm az adatbázis összes felhasználója számára lehet.

Biztonsági gyorsítótár-tárolók

A tokenek különböző gyorsítótár-tárolókban vannak tárolva.

Store Leírás
TokenAndPermUserStore Egy nagy áruház, amely az alábbi objektumok mindegyikét tartalmazza:

- SecContextToken
- LoginToken
- UserToken
- TokenPerm
- TokenAudit
SecCtxtACRUserStore Hozzáférés-ellenőrzési eredmény (ACR) tároló. Minden bejelentkezésnek van egy külön biztonsági kontextus felhasználói tárolója.
ACRUserStore Hozzáférés-ellenőrzés eredménytárolója
<unique id> -
<db id>
- <user id>

Minden felhasználó egyéni ACR-felhasználói tárolóval rendelkezik. Például két bejelentkezés két különböző adatbázisba öt felhasználóval összesen két SecCtxtACRUserStore és 10 különböző ACRUserStore.
ObjectPerm Adatbázis-tokenenként ObjPerm egyet. Az adatbázisban található összes különböző biztonságos eszköz.

Ismert problémák

Ez a szakasz a biztonsági gyorsítótárral kapcsolatos problémákat ismerteti.

Biztonsági gyorsítótár érvénytelenítések

Különböző forgatókönyvek aktiválhatják a biztonsági gyorsítótár érvénytelenítéseit az adatbázis vagy a kiszolgáló szintjén. Érvénytelenítés esetén a rendszer az összes aktuális gyorsítótár-bejegyzést érvényteleníti. A jövőbeli lekérdezések és engedélyellenőrzések a teljes "Nincs gyorsítótár" munkafolyamatot követik, amíg a gyorsítótárak újra nem lesznek feltöltve. Az érvénytelenítés jelentősen befolyásolhatja a kiszolgáló teljesítményét, különösen nagy terhelés esetén, mivel minden aktív kapcsolatnak újra kell építenie a gyorsítótárazott bejegyzéseket. Az ismételt gyorsítótár-érvénytelenítések ronthatják ezt a hatást. Az adatbázisban lévő master érvénytelenítések kiszolgálószintű érvénytelenítésekként vannak kezelve, ami hatással van a példány összes adatbázisának gyorsítótárára.

Az SQL Server 2025 egy olyan funkciót vezet be, amely csak egy adott bejelentkezés gyorsítótárait érvényteleníti. Ez azt jelenti, hogy amikor a biztonsági gyorsítótár bejegyzései érvénytelenítve vannak, csak az érintett bejelentkezéshez tartozó bejegyzések érintettek. Ha például új engedélyt ad az L1 bejelentkezéshez, az L2 bejelentkezési jogkivonatok változatlanok maradnak.

Ez a funkció első lépésként a CREATE, ALTER és DROP bejelentkezési forgatókönyvekre, valamint az egyes bejelentkezések engedélymódosítására vonatkozik. A csoportos bejelentkezések továbbra is kiszolgálószintű érvénytelenítést tapasztalnak.

Az alábbi táblázat felsorolja az összes olyan biztonsági adatdefiníciós nyelvi (DDL-) műveletet, amely érvényteleníti a biztonsági gyorsítótárat.

Tevékenység Tárgy Hatókör
CREATE/ALTER/DROP APPLICATION ROLE
SYMMETRIC KEY
ASYMMETRIC KEY
AUTHORIZATION
CERTIFICATE
ROLE
SCHEMA
USER
Megadott adatbázis
DROP Bármely objektum, amely megjelenik sys.all_objects vagy az adatbázis vagy a séma hatókörű biztonságos listában felsorolt bármely biztonságos objektum. Megadott adatbázis
GRANT/DENY/REVOKE Adatbázis vagy séma által tartalmazott biztonságossá tételrevonatkozó bármely engedély. Megadott adatbázis
CREATE/ALTER/DROP LOGIN
(SERVICE) MASTER KEY
SQL Server-példány
ALTER DATABASE Megadott adatbázis

Lekérdezési teljesítmény a TokenAndPermUserStore méretének növekedésével

A teljesítményproblémákat, például a magas processzorhasználatot és a megnövekedett memóriahasználatot a TokenAndPermUserStore gyorsítótár túlzott bejegyzései okozhatják. Alapértelmezés szerint az SQL Server csak akkor törli a gyorsítótár bejegyzéseit, ha belső memóriaterhelést észlel. A sok RAM-mal rendelkező kiszolgálókon azonban előfordulhat, hogy a belső memóriaterhelés nem gyakran fordul elő. A gyorsítótár növekedésével nő a meglévő bejegyzések újbóli kereséséhez szükséges idő. Ezt a gyorsítótárat egy spinlock felügyeli, így egyszerre csak egy szál hajthatja végre a keresést. Ennek következtében ez a viselkedés a lekérdezési teljesítmény csökkenéséhez és magasabb processzorhasználathoz vezethet.

Megoldás

Az SQL Server két nyomkövetési jelzőt (TF) biztosít, amelyek a TokenAndPermUserStore gyorsítótár kvótájának beállításához használhatók. Alapértelmezés szerint nincs kvóta, ami azt jelenti, hogy a gyorsítótár korlátlan számú bejegyzést tartalmazhat.

  • TF 4618: A TokenAndPermUserStore bejegyzéseinek számát 1024-re korlátozza.
  • TF 4618 és TF 4610: A TokenAndPermUserStore bejegyzéseinek számát 8192-re korlátozza. Ha a TF 4618 alacsony bejegyzésszámkorlátja más teljesítményproblémákat okoz, javasolt, hogy használja együtt a nyomkövetési zászlókat 4610 és 4618. További információ: Nyomkövetési jelzők beállítása a DBCC TRACEON használatával.

További információ: A teljesítményproblémákat a TokenAndPermUserStore gyorsítótár túlzott bejegyzései okozhatják – SQL Server

Ajánlott eljárások

Ez a szakasz a biztonsági munkafolyamat optimalizálásához ajánlott eljárásokat sorolja fel.

Felhasználókezelés nem munkaidőben

Tekintettel a biztonsági gyorsítótárak (adatbázis-/kiszolgálószint) magas szintű érvénytelenítési jellegére, biztonsági DLL-eket kell végrehajtani a nem üzemidős időszakokban, amikor a kiszolgáló terhelése alacsony. Ha a biztonsági gyorsítótár érvénytelenítése nagy számítási feladatok során történik, a biztonsági gyorsítótárak újrafeltöltése jelentős teljesítménybeli hatással lehet a teljes kiszolgálóra.

Egyetlen tranzakció használata engedélymódosításokhoz

Ha ugyanazon a tranzakción belül több biztonsági adatdefiníciós nyelvet (DDL) hajt végre, azzal jelentősen növelheti annak az esélyét, hogy holtpontokba ütközzenek más aktív kapcsolatokkal. Ennek a kockázatnak a mérséklése érdekében ajánlott elkerülni, hogy egyetlen tranzakcióban több biztonsági DDL-t hajtsunk végre. Ehelyett hajtsa végre a biztonsággal kapcsolatos DDL-műveleteket külön tranzakciókban a zárolási versengés minimalizálása érdekében.