Esercizio - Controllare chi può accedere al database

Completato

Anche se è possibile connettersi al database attraverso la rete, ciò non significa che sia effettivamente possibile accedere ai dati. In base a un approccio a più livelli, si vuole fare in modo che solo gli utenti che necessitano dell'accesso ai dati possano effettivamente accedervi. A tale scopo, vengono usate l'autenticazione e l'autorizzazione.

Authentication

L'autenticazione è il processo di verifica di un'identità. L'identità può essere un utente, un servizio in esecuzione in un sistema o un sistema stesso, ad esempio una macchina virtuale. Il processo di autenticazione consente di verificare che una persona o un sistema corrisponda all'identità dichiarata. Il database SQL supporta due tipi di autenticazione: Autenticazione SQL e autenticazione di Microsoft Entra.

Autenticazione SQL

Il metodo di autenticazione SQL usa un nome utente e una password. Gli account utente possono essere creati nel database principale e vi possono ricevere le autorizzazioni in tutti i database nel server. È anche possibile creare gli utenti nel database stesso, denominati utenti indipendenti, concedendo loro l'accesso solo a tale database. Durante la creazione del server logico per il database, è stato specificato un accesso amministratore del server con un nome utente e una password. Usando queste credenziali è possibile eseguire l'autenticazione in qualsiasi database nel server come proprietario del database o dbo.

Autenticazione Microsoft Entra

Questo metodo di autenticazione usa le identità gestite da Microsoft Entra ID ed è supportato per i domini gestiti e integrati. Usare l'autenticazione di Microsoft Entra (sicurezza integrata), ove possibile. Con l'autenticazione di Microsoft Entra è possibile gestire le identità degli utenti del database e altri servizi Microsoft. La gestione centrale degli ID consente di gestire gli utenti del database da un unico punto e semplifica la gestione delle autorizzazioni. Se si desidera utilizzare l'autenticazione Microsoft Entra, è necessario creare un altro amministratore del server denominato amministratore di Microsoft Entra, autorizzato ad amministrare utenti e gruppi di Microsoft Entra. Questo amministratore può eseguire anche tutte le operazioni eseguite da un normale amministratore del server.

Autorizzazione

Il termine "autorizzazione" indica le operazioni che possono essere eseguite da un'identità all'interno di un database SQL di Azure. L'autorizzazione è controllata dalle autorizzazioni concesse direttamente all'account utente e alle appartenenze ai ruoli del database. Un ruolo del database viene utilizzato per raggruppare le autorizzazioni insieme, a scopo di semplificare l'amministrazione. Aggiungere un utente a un ruolo per concedervi le autorizzazioni di cui dispone il ruolo. Le autorizzazioni possono includere la possibilità di accedere al database, di leggere una tabella e di aggiungere e rimuovere colonne da un database. È consigliabile concedere agli utenti i privilegi minimi necessari. La procedura per concedere l'autorizzazione agli utenti di SQL e Microsoft Entra è la stessa.

Nell'esempio, l'account amministratore del server con cui si esegue la connessione è membro del ruolo db_owner, che è autorizzato a eseguire qualsiasi operazione all'interno del database.

Autenticazione e autorizzazione nella pratica

Come procedura consigliata, l'applicazione deve usare un account dedicato per l'autenticazione. In questo modo è possibile limitare le autorizzazioni concesse all'applicazione e ridurre i rischi di attività dannose nel caso in cui il codice dell'applicazione sia vulnerabile a un attacco SQL injection. L'approccio consigliato consiste nel creare un utente di database indipendente, consentendo così l'autenticazione dell'app direttamente nel database. Per altre informazioni, vedere Utenti di database indipendente: rendere portabile un database.

Usare l'autenticazione di Microsoft Entra per gestire centralmente le identità degli utenti del database e come alternativa all'autenticazione di SQL Server.

Si esaminerà come configurare un utente e concedere all'utente l'accesso a un database. Sebbene in questo caso venga usata l'autenticazione SQL per l'utente, la procedura per l'autenticazione di Microsoft Entra sarebbe essenzialmente la stessa.

Creare un utente del database

Creare un nuovo utente che è possibile usare per l'assegnazione dell'accesso.

  1. In Cloud Shell, nella macchina virtuale appServer, eseguire nuovamente la connessione al database come ADMINUSER.

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U '[username]' -P '[password]' -N -l 30
    
  2. Eseguire il comando seguente per creare un nuovo utente. Questo utente è un utente indipendente che ha consentito solo l'accesso al database marketplace. Se si vuole, è possibile modificare la password. Assicurarsi di prendere nota della password poiché sarà necessaria in un passaggio successivo.

    CREATE USER ApplicationUser WITH PASSWORD = 'YourStrongPassword1';
    GO
    

Con queste credenziali, l'utente può eseguire l'autenticazione nel database ma non sarà autorizzato ad accedere ai dati. Concedere l'accesso all'utente.

Concedere autorizzazioni a un utente

Configurare l'utente come membro dei ruoli db_datareader e db_datawriter che concedono all'utente rispettivamente l'accesso in lettura e scrittura al database. Si vuole anche impedire all'utente di accedere a una tabella con indirizzi.

  1. Mentre si è connessi a sqlcmd in appServer, eseguire il codice T-SQL seguente per assegnare i ruoli db_datareader e db_datawriter all'utente creato.

    ALTER ROLE db_datareader ADD MEMBER ApplicationUser;
    ALTER ROLE db_datawriter ADD MEMBER ApplicationUser;
    GO
    
  2. L'ambito dell'accesso può essere limitato ulteriormente. È possibile negare all'utente l'accesso ad altri elementi all'interno del database usando l'operatore DENY. Eseguire il codice T-SQL seguente per negare all'utente ApplicationUser la possibilità di selezionare dati dalla tabella SalesLT.Address.

    DENY SELECT ON SalesLT.Address TO ApplicationUser;
    GO
    

Accedere ora come tale utente e osservare il funzionamento di questa configurazione.

  1. Dal prompt T-SQL immettere exit per uscire dalla sessione.

  2. Eseguire ora l'accesso al database, ma con l'utente creato.

    sqlcmd -S tcp:[server-name].database.windows.net,1433 -d marketplaceDb -U 'ApplicationUser' -P '[password]' -N -l 30
    
  3. Eseguire la query seguente. Questa query esegue il pull dei dati da una tabella a cui l'utente ha accesso.

    SELECT FirstName, LastName, EmailAddress, Phone FROM SalesLT.Customer;
    GO
    

    Viene visualizzato un elenco dei clienti.

    FirstName      LastName       EmailAddress                    Phone
    -------------- -------------- ------------------------------- ------------
    Orlando        Gee            orlando0@adventure-works.com    245-555-0173
    Keith          Harris         keith0@adventure-works.com      170-555-0127
    Donna          Carreras       donna0@adventure-works.com      279-555-0130
    Janet          Gates          janet1@adventure-works.com      710-555-0173
    ...
    
  4. Si osservi cosa accade quando si tenta di eseguire una query su una tabella a cui non si ha accesso.

    SELECT * FROM SalesLT.Address;
    GO
    

    Viene visualizzato un messaggio che comunica che non si ha accesso alla tabella.

    Msg 229, Level 14, State 5, Server server-22942, Line 1
    The SELECT permission was denied on the object 'Address', database 'marketplace', schema 'SalesLT'.
    

Come è possibile osservare, sebbene sia stato assegnato l'accesso in lettura/scrittura al database, è possibile proteggere ulteriormente l'accesso ai dati negando in modo esplicito l'accesso alle tabelle. Se sono presenti più utenti che condividono un accesso simile, è possibile creare ruoli personalizzati con le autorizzazioni appropriate e semplificare l'amministrazione.

È importante proteggere correttamente il database e concedere l'accesso solo quando necessario. Il database SQL di Azure offre il controllo completo dell'autenticazione e dell'autorizzazione delle identità per l'accesso ai dati del database.