Sicurezza a livello di colonna

La sicurezza a livello di colonna consente ai clienti di controllare l'accesso alle colonne della tabella in base al contesto di esecuzione o dell'appartenenza ai gruppi dell'utente.

La sicurezza a livello di colonna semplifica la progettazione e la codifica della sicurezza nell'applicazione, consentendo di limitare l'accesso alle colonne per proteggere i dati sensibili. Assicurando, ad esempio, che utenti specifici possano accedere solo determinate colonne di una tabella relative al loro reparto. La logica di restrizione dell'accesso si trova sul livello del database e non su un altro livello applicazione lontano dai dati. Il database applica le restrizioni di accesso a ogni tentativo di accesso ai dati da qualsiasi livello. Questa restrizione rende la sicurezza più affidabile e solida, grazie alla riduzione della superficie di attacco del sistema di sicurezza generale. La sicurezza a livello di colonna elimina anche l'esigenza di introduzione di visualizzazioni per filtrare le colonne per imporre limitazioni di accesso agli utenti.

È possibile implementare la sicurezza a livello di colonna con la sintassi T-SQL GRANT per le autorizzazioni per gli oggetti. Con questo meccanismo sono supportati sia l'autenticazione SQL che Microsoft Entra ID (in precedenza Azure Active Directory).

Si consideri anche la possibilità di applicare la sicurezza a livello di riga nelle tabelle, in base a un filtro di clausola WHERE.

Diagram shows a schematic table with the first column headed by a closed padlock and its cells an orange color while the other columns are white cells.

Sintassi

La sintassi dell'istruzione GRANT per le autorizzazioni per gli oggetti consente di concedere autorizzazioni agli elenchi di colonne delimitati da virgole in una tabella.

GRANT <permission> [ ,...n ] ON
    [ OBJECT :: ][ schema_name ]. object_name [ ( column [ ,...n ] ) ]
    TO <database_principal> [ ,...n ]
    [ WITH GRANT OPTION ]
    [ AS <database_principal> ]
<permission> ::=
    SELECT
  | UPDATE
<database_principal> ::=
      Database_user
    | Database_role
    | Database_user_mapped_to_Windows_User
    | Database_user_mapped_to_Windows_Group

Esempi

L'esempio seguente illustra come escludere TestUserdall'accesso alla colonna SSN della tabella Membership:

Creare la tabella Membership con la colonna SSN usata per archiviare i numeri di previdenza sociale:

CREATE TABLE Membership
  (MemberID int IDENTITY,
   FirstName varchar(100) NULL,
   SSN char(9) NOT NULL,
   LastName varchar(100) NOT NULL,
   Phone varchar(12) NULL,
   Email varchar(100) NULL);

Consentire a TestUser di accedere a tutte le colonne a eccezione della colonna SSN, che contiene dati sensibili:

GRANT SELECT ON Membership(MemberID, FirstName, LastName, Phone, Email) TO TestUser;

Le query eseguite come TestUser hanno esito negativo se includono la colonna SSN:

SELECT * FROM Membership;

Con l'errore risultante:

Msg 230, Level 14, State 1, Line 12
The SELECT permission was denied on the column 'SSN' of the object 'Membership', database 'CLS_TestDW', schema 'dbo'.

Utilizzare casi

Di seguito sono riportati alcuni esempi di come viene utilizzata la sicurezza a livello di colonna:

  • Una società di servizi finanziari consente solo agli account manager di accedere ai numeri di previdenza sociale (SSN), ai numeri di telefono e ad altri dati personali.
  • Un fornitore di assistenza sanitaria consente solo a medici e infermieri di avere accesso a cartelle cliniche sensibili mentre impedisce ai membri del reparto contabilità di visualizzare questi dati.

Passaggi successivi