sql >> Databáze >  >> RDS >> Sqlserver

Vysvětlení funkce zabezpečení serveru SQL HAS_Permis_BY_Name a její případy použití

Existuje několik případů, kdy chceme zkontrolovat oprávnění na zabezpečený objekt pro principála. Než budeme pokračovat, podívejme se, co jsou hlavní objekty, zabezpečení a oprávnění.

Podle dokumentace společnosti Microsoft

  1. Zabezpečitelné položky v kontextu SQL Server jsou specifické zdroje, ke kterým autorizační systém SQL Server Database Engine řídí přístup. Jsou rozděleny do tří kategorií:Server, Databáze a Schéma. Obecně platí, že každý SQL Server nebo databázové objekty mohou být zabezpečeny.
  2. Oprávnění jsou ovládací prvky, pomocí kterých přidělujeme nebo zakazujeme určitou úroveň přístupu k zabezpečeným prvkům.
  3. Ředitel je entita, která dostává povolení k securable. Nejběžnějšími principy jsou přihlášení a uživatelé databáze.

SQL Server má vestavěnou funkci zabezpečení HAS_Permis_BY_Name to nám pomůže zjistit, zda má identifikovaný principál pro daný zabezpečený prvek konkrétní oprávnění či nikoli. Tato systémová funkce vrátí 1, pokud je danému objektu přiřazeno platné oprávnění k danému zabezpečenému prvku, a vrátí 0, pokud platné oprávnění přiřazeno není. Pokud platné oprávnění nebo zabezpečená třída není platná, získáte hodnotu NULL.

Systémová funkce HAS_Permis_BY_Name je také velmi užitečná při kontrole oprávnění pro vaše přihlášení. V tomto článku vám krok za krokem ukážu proces kontroly konkrétních oprávnění k securable pro mého principála a další principy.

Syntaxe T-SQL této systémové funkce je následující:

--T-SQL syntax
HAS_PERMS_BY_NAME (securable, securable_class, permission)
   

Ke spuštění této bezpečnostní funkce systému SQL Server budou zapotřebí tři povinné parametry.

  • Zadejte název zabezpečeného o kterých chcete oprávnění zkontrolovat. Pokud je zabezpečeným prvkem samotný server, měli byste použít hodnotu NULL.
  • Druhý parametr je securable_class což je název třídy. Pokud si tím nejste jisti, můžete použít jinou systémovou funkci sys.fn_builtin_permissions k získání úplného seznamu zabezpečených tříd a jejich dostupných oprávnění.
  • Třetím parametrem je oprávnění kde musíte zadat skutečné oprávnění, o kterém chcete zkontrolovat zadaný zabezpečený prvek.

Nyní mi dovolte, abych vám ukázal všechny dostupné zabezpečené třídy spuštěním systémové funkce sys.fn_builtin_permissions. Použil jsem DISTINCT k zobrazení řádků na zabezpečenou třídu.

--Display all securable_class
SELECT distinct class_desc FROM sys.fn_builtin_permissions(default)

Zde můžete získat seznam zabezpečených tříd.

Pokud chcete zkontrolovat všechna možná oprávnění pro jakoukoli zabezpečenou třídu, můžete také použít tuto systémovou funkci. Spusťte níže uvedený příkaz T-SQL:

--Display each permission for all securable class
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default);

Seznam můžeme vidět na obrázku níže. class_desc je zabezpečená třída a název_oprávnění je druh povolení. Pokud si nejste jisti třídou securable a oprávněními, která mají být kontrolována pro jakýkoli zabezpečený prvek, můžete použít tuto systémovou funkci.

Případy použití HAS_Permis_BY_Name

Ukážu vám 5 případů použití kontroly různých oprávnění pro mé vlastní přihlášení k instanci SQL Server a pro další přihlášení s názvem manvendra .

  1. Zkontrolujte oprávnění na úrovni serveru nebo instance
  2. Zkontrolujte oprávnění na úrovni databáze
  3. Zkontrolujte oprávnění na úrovni objektu
  4. Zkontrolujte oprávnění k přihlášení
  5. Zkontrolujte další oprávnění, jako je fulltextový katalog, schéma atd.

Začněme prvním případem použití ke kontrole oprávnění na úrovni instance.

PŘÍPAD POUŽITÍ 1:Zkontrolujte SQL Server nebo oprávnění na úrovni instance

Tento případ použití ukáže, jak zkontrolovat různá oprávnění pro server principál\login. Výše uvedený příkaz T-SQL můžete spustit pomocí systémové funkce sys.fn_builtin_permissions. Klauzuli WHERE v této funkci můžete použít k vypsání pouze oprávnění na úrovni serveru. Zde vám ukážu oprávnění pro mé vlastní připojené přihlášení.

  • Zobrazit stav serveru
  • Vytvoření role serveru
  • Připojit libovolnou databázi

Pokud hledáte jakékoli oprávnění na úrovni serveru, měli byste vždy předat hodnotu NULL jako zabezpečený argument. V tomto příkladu bude NULL zabezpečená jako úroveň serveru a výše uvedené názvy oprávnění budou mít argument oprávnění. Spusťte níže uvedený příkaz T-SQL a zkontrolujte oprávnění na úrovni serveru.

--Display server level permission for your own login using which you have established the database connection
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') AS [VIEW SERVER STATE],
	HAS_PERMS_BY_NAME(null, null, 'CREATE SERVER ROLE') AS [CREATE SERVER ROLE],
	HAS_PERMS_BY_NAME(null, null, 'CONNECT ANY DATABASE') AS [CONNECT ANY DATABASE]

Výstup je zobrazen na obrázku níže. T-SQL vrátilo 1 pro všechna oprávnění pro moje přihlášení. Znamená to, že mám oprávnění pro všechny tři operace. Mohu zobrazit stav serveru, mohu vytvořit roli serveru a také se mohu připojit k jakékoli databázi na tomto serveru nebo instanci.

Dovolte mi, abych vám ukázal, zda přihlašovací jméno s názvem „manvendra“ má oprávnění pro výše uvedené 3 operace. Pro kontrolu úrovně přístupu použijeme T-SQL příkaz EXECUTE AS LOGIN. Ujistěte se, že máte oprávnění IMPERSONATE pro přihlášení, u kterého kontrolujete oprávnění. Po příkazu EXECUTE AS LOGIN spusťte stejný příkaz T-SQL jako výše.

--Display server level permission for another login ‘manvendra’
EXECUTE AS LOGIN = ‘manvendra’
GO
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE') AS [VIEW SERVER STATE],
	HAS_PERMS_BY_NAME(null, null, 'CREATE SERVER ROLE') AS [CREATE SERVER ROLE],
	HAS_PERMS_BY_NAME(null, null, 'CONNECT ANY DATABASE') AS [CONNECT ANY DATABASE]

Zde vidíme, že přihlášení ‚manvendra‘ nemá přístup k žádné z těchto 3 aktivit na úrovni serveru, protože jejich výstup vrátil 0.

PŘÍPAD POUŽITÍ 2:Kontrola oprávnění na úrovni databáze

Ve výše uvedené části jsem vysvětlil, jak zkontrolovat různá oprávnění pro libovolný objekt na úrovni serveru nebo instance. Nyní vám ukážu, jak zkontrolovat různá oprávnění pro libovolný objekt na úrovni databáze. Viz níže uvedené prohlášení:

--Display each permission for securable class ‘DATABASE’
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc = ‘DATABASE’

Na níže uvedeném snímku obrazovky můžete vidět, že na úrovni databáze je k dispozici 82 oprávnění.

Zvolil jsem níže uvedená oprávnění, abych zkontroloval, zda moje přihlašovací jméno nebo další přihlašovací jméno ‚manvendra‘ má oprávnění k provádění těchto činností.

  • JAKÉKOLI
  • VYTVOŘIT tabulku
  • VYTVOŘIT POSTUP
  • VLOŽIT
  • VYBRAT

Zde securable bude název databáze, u které chcete zkontrolovat oprávnění, třída securable bude ‚Database‘ a oprávnění budou výše uvedená jména oprávnění. Spusťte níže uvedený příkaz T-SQL a zkontrolujte různá oprávnění.

--Display few specific permissions for your own connected login on a DATABASE
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'SELECT') AS [SELECT Access]

Výstup vrátil 1 pro každé oprávnění. Znamená to, že mám oprávnění provádět všechny výše uvedené činnosti v aktuálním kontextu databáze.

Spusťte níže uvedený příkaz T-SQL a zkontrolujte stejná oprávnění pro přihlášení ‚manvendra‘ v aktuálně vybraném kontextu databáze.

--Display few specific permissions for login ‘manvendra’ on current database
EXECUTE AS LOGIN ='manvendra'
GO
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'SELECT') AS [SELECT Access]

Výstup ukazuje, že přihlášení ‚manvendra‘ má velmi omezená oprávnění k této databázi. Toto přihlášení se může připojit pouze k databázi a ostatní oprávnění nejsou povolena.

Zde jsem změnil kontext databáze a jako zabezpečený argument jsem zvolil databázi „AdventureWorksDW2019-TSQL“ a provedl níže uvedený příkaz pro přihlášení „manvendra“.

--Display few specific permissions for login ‘manvendra’ on database ‘AdventureWorksDW2019-TSQL’
EXECUTE AS LOGIN ='manvendra'
GO
SELECT HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'ANY') AS [DB Access],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'CREATE TABLE') AS [CREATE TABLE],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'CREATE PROCEDURE') AS [CREATE PROCEDURE],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'INSERT') AS [INSERT Access],
HAS_PERMS_BY_NAME('AdventureWorksDW2019-TSQL', 'DATABASE', 'SELECT') AS [SELECT Access]

Stejné přihlašovací jméno ‚manvendra‘ má oprávnění k operacím INSERT a SELECT v této databázi ‚AdventureWorks2019-TSQL‘

Podobně můžeme spustit výše uvedený příkaz T-SQL a zkontrolovat oprávnění pro různé databáze pro naše přihlášení. Výstup ukazuje, že mám přístup ke všem oprávněním.

Můžete pokračovat a zkontrolovat další oprávnění na úrovni databáze pro libovolný objekt pomocí výše uvedené funkce zabezpečení systému SQL Server.

PŘÍPAD POUŽITÍ 3:Kontrola oprávnění OBJECT-LEVEL

Tento případ použití ukazuje použití oprávnění na úrovni objektu v rámci databáze. Opět můžete spustit níže uvedený příkaz T-SQL a vypsat všechna dostupná oprávnění pro zabezpečenou třídu „OBJECT“. K zobrazení seznamu oprávnění na úrovni objektů jsem použil klauzuli WHERE v systémové funkci sys.fn_builtin_permissions.

--Check all object level permissions
SELECT class_desc,permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc ='OBJECT'

Zde je seznam oprávnění pro zabezpečenou třídu Object.

Nyní zkontroluji níže uvedená oprávnění ke konkrétnímu objektu pro jakýkoli přihlašovací účet a zjistím, zda má tento účet přístup k provádění níže uvedených operací.

  • VLOŽIT
  • VYBRAT
  • SMAZAT
  • ZOBRAZIT DEFINICE

Použil jsem databázový objekt „dbo.dimAccount“ jako zabezpečený, OBJECT jako zabezpečenou třídu a výše uvedená oprávnění jako argument oprávnění. Spuštěním níže uvedených příkazů zobrazíte podrobnosti oprávnění.

--Check some specific object level permissions for your own login
SELECT HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'INSERT') AS [Insert Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'SELECT') AS [Select Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'DELETE') AS [DELETE Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'VIEW DEFINITION') AS [VIEW DEFINITION Access]

Protože jsem správce systému v této instanci, můj účet vrací 1 pro všechna oprávnění, která kontroluji na jakékoli úrovni. Znamená to, že mám plná oprávnění, což lze ověřit také spuštěním níže uvedených příkazů.

Spusťte níže uvedený příkaz a zkontrolujte oprávnění pro přihlášení ‚manvendra‘.

--Check some specific object level permissions for another login ‘manvendra’
EXECUTE AS USER ='manvendra'
GO
USE [AdventureWorksDW2019-TSQL]
GO
SELECT HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'INSERT') AS [Insert Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'SELECT') AS [Select Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'DELETE') AS [DELETE Permission],
HAS_PERMS_BY_NAME('[dbo].[DimAccount]', 'OBJECT', 'VIEW DEFINITION') AS [VIEW DEFINITION Access]

Vidíme, že přihlašovací jméno ‚manvendra‘ má přístup k oprávněním INSERT, SELECT a DELETE, ale tento účet nemá oprávnění ZOBRAZIT DEFINICE tohoto objektu v databázi ‚AdventureWorksDW2019-TSQL‘.

Dovolte mi použít operaci DENY access to DELETE pro tento účet ‚manvendra‘ na objekt ‚DimAccount‘ v databázi AdventureWorksDW2019-TSQL. Můžete to vidět na obrázku níže.

Vidíme, že výstup ukazuje, že login ‚manvendra‘ má přístup pouze k příkazům INSERT a SELECT a nemá oprávnění k příkazu DELETE.

Pomocí výše uvedené systémové funkce zkontrolujte různé úrovně přístupu pro jakékoli přihlášení k libovolnému databázovému objektu.

PŘÍPAD POUŽITÍ 4:Zkontrolujte oprávnění k přihlášení

Tento případ použití vám pomůže pochopit, jak kontrolovat různá oprávnění pro přihlášení. Všechny tyto druhy podrobností můžete získat pomocí této systémové bezpečnostní funkce SQL Serveru HAS_PERMS_BY_NAME.

Můžeme vypsat všechna oprávnění dostupná pro konkrétní přihlášení spuštěním níže uvedeného příkazu T-SQL.

--List all available permission for securable class ‘LOGIN’
SELECT class_desc, permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc ='LOGIN'

Níže je uveden seznam názvů oprávnění pro zabezpečenou třídu „LOGIN“.

Zkontroluji, zda mám oprávnění ALTER nebo VIEW DEFINITION při přihlášení sa spuštěním níže uvedených příkazů T-SQL. V této systémové funkci jsem použil login sa jako zabezpečený argument, LOGIN jako zabezpečený argument třídy a ALTER &VIEW DEFINITION jako argument oprávnění.

--Check ALTER & VIEW DEFINITION permission on securable sa
SELECT HAS_PERMS_BY_NAME('sa', 'LOGIN', 'ALTER'),
HAS_PERMS_BY_NAME('sa', 'LOGIN', 'VIEW DEFINITION')

Jako správce systému budu mít tyto úrovně přístupu a výstup je také ověřen vrácením jejich hodnoty jako 1.

Pojďme zkontrolovat, zda má přihlašovací jméno ‚manvendra‘ oprávnění ALTER nebo VIEW definici přihlášení sa.

--Check ALTER & VIEW DEFINITION permission on securable sa for principal ‘manvendra’
EXECUTE AS USER ='manvendra'
GO

SELECT HAS_PERMS_BY_NAME('sa', 'LOGIN', 'ALTER'),
HAS_PERMS_BY_NAME('sa', 'LOGIN', 'VIEW DEFINITION')

Výstup se vrátil jako nula (0), což znamená, že přihlášení 'manvendra' nemá oprávnění ALTER nebo ZOBRAZIT DEFINICE přihlášení sa.

Pomocí této systémové funkce můžete zkontrolovat a pochopit úrovně přístupu pro různá přihlášení.

PŘÍPAD POUŽITÍ 5:Zkontrolujte další oprávnění

Zde se budu věnovat některým dalším zabezpečeným třídám, jako je SCHÉMA a FULLTEXTOVÝ KATALOG, KONCOVÝ BOD, AVAILABILITY GROUP atd.

Nejprve vyjmenujme všechna oprávnění dostupná pro zabezpečenou třídu SCHEMA a FULLTEXT CATALOG spuštěním následujícího příkazu:

--List all available permission for securable class ‘SCHEMA’ & ‘FTCatalog’. FTCatalog is full text catalog.
SELECT class_desc, permission_name FROM sys.fn_builtin_permissions(default)
WHERE class_desc='SCHEMA' OR
class_desc= 'FULLTEXT CATALOG'

Dalším krokem je určit, které oprávnění hledáme pro kontrolu našeho hlavního. Chystám se zkontrolovat oprávnění DELETE a ALTER pro zabezpečenou třídu SCHEMA a oprávnění ALTER a VIEW DEFINITION pro zabezpečenou třídu FULLTEXT CATALOG.

Musíme předat jejich příslušné securables, jako jsem předal dbo pro zabezpečenou třídu SCHEMA a FTCatalog pro zabezpečenou třídu FULLTEXT CATALOG v níže uvedeném prohlášení.

Spusťte níže uvedený příkaz T-SQL a získejte oprávnění pro své přihlášení.

--List below permissions for securable class ‘SCHEMA’ & ‘FTCatalog’. 
SELECT HAS_PERMS_BY_NAME('dbo', 'SCHEMA', 'DELETE') AS [Schema Deletion Access],
HAS_PERMS_BY_NAME('dbo', 'SCHEMA', 'ALTER') AS [Schema Alter Access],
HAS_PERMS_BY_NAME('[FTCatalog]', 'FULLTEXT CATALOG', 'ALTER') AS [FTC Alter Access],
HAS_PERMS_BY_NAME('[FTCatalog]', 'FULLTEXT CATALOG', 'VIEW DEFINITION') AS [VIEW DEFINITION]

Níže uvedený výstup ukazuje, že přihlášení „manvendra“ má přístup pouze ke smazání SCHEMA a zbytek přístupů byl odepřen nebo odvolán.

Závěr

V tomto článku jsem vysvětlil postup krok za krokem ke kontrole různých oprávnění pro více zabezpečených tříd pro libovolný objekt. Tuto funkci zabezpečení systému SQL Server můžete také použít ke splnění vašich požadavků na kontrolu oprávnění. Sdílejte prosím tento článek a uveďte svůj názor v sekci komentářů, abychom se mohli zlepšit.


  1. Jak znovu vytvořit nekonzistentní MySQL Slave?

  2. Spuštění balíčku SSIS pomocí dtexec

  3. Připojení Oracle 21c k SQL Serveru

  4. Jak se připojit k instanci SQL Server pomocí ověřování Windows nebo ověřování SQL Server - SQL Server / Výukový program T-SQL, část 3