Procedure consigliate per la sicurezza in database indipendentiSecurity Best Practices with Contained Databases

In questo argomento si applica a: SìSQL ServerSìDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

I database indipendenti sono soggetti ad alcune minacce univoche che devono essere comprese e contrastate dagli amministratori di Motore di database di SQL ServerSQL Server Database Engine .Contained databases have some unique threats that should be understood and mitigated by Motore di database di SQL ServerSQL Server Database Engine administrators. La maggior parte delle minacce è correlata al processo di autenticazione USER WITH PASSWORD , che sposta il limite di autenticazione dal livello Motore di databaseDatabase Engine al livello di database.Most of the threats are related to the USER WITH PASSWORD authentication process, which moves the authentication boundary from the Motore di databaseDatabase Engine level to the database level.

Gli utenti di un database indipendente che hanno l'autorizzazione ALTER ANY USER , ad esempio i membri dei ruoli predefiniti del database db_owner e db_securityadmin , possono concedere l'accesso al database senza che l'amministratore di SQL ServerSQL Server ne sia a conoscenza o abbia concesso l'autorizzazione.Users in a contained database that have the ALTER ANY USER permission, such as members of the db_owner and db_securityadmin fixed database roles, can grant access to the database without the knowledge or permission or the SQL ServerSQL Server administrator. Quando si concede agli utenti l'accesso a un database indipendente, si aumenta la potenziale superficie di attacco all'intera istanza di SQL ServerSQL Server .Granting users access to a contained database increases the potential attack surface area against the whole SQL ServerSQL Server instance. È necessario che gli amministratori comprendano le implicazioni di questa delega del controllo di accesso e concedano con cautela l'autorizzazione ALTER ANY USER agli utenti del database indipendente.Administrators should understand this delegation of access control, and be very careful about granting users in the contained database the ALTER ANY USER permission. Tutti i proprietari del database hanno l'autorizzazione ALTER ANY USER .All database owners have the ALTER ANY USER permission. SQL ServerSQL Server gli amministratori devono sottoporre a un controllo periodico gli utenti di un database indipendente. administrators should periodically audit the users in a contained database.

Accesso ad altri database con l'account GuestAccessing Other Databases Using the guest Account

Proprietari e utenti di database con l'autorizzazione ALTER ANY USER possono creare utenti del database indipendente.Database owners and database users with the ALTER ANY USER permission can create contained database users. Dopo la connessione a un database indipendente in un'istanza di SQL ServerSQL Server, un utente di questo database può accedere ad altri database del Motore di databaseDatabase Engine, se in questi database è abilitato l'account Guest .After connecting to a contained database on an instance of SQL ServerSQL Server, a contained database user can access other databases on the Motore di databaseDatabase Engine, if the other databases have enabled the guest account.

Creazione di un utente duplicato in un altro databaseCreating a Duplicate User in Another Database

In alcune applicazioni potrebbe essere richiesto che un utente possa accedere a più database.Some applications might require that a user to have access to more than one database. Questo requisito può essere soddisfatto creando utenti identici del database indipendente in ogni database.This can be done by creating identical contained database users in each database. Quando si crea il secondo utente con la password, utilizzare l'opzione SID.Use the SID option when creating the second user with password. Nell'esempio seguente vengono creati due utenti identici in due database.The following example creates two identical users in two databases.

USE DB1;  
GO  
CREATE USER Carlo WITH PASSWORD = '<strong password>';   
-- Return the SID of the user  
SELECT SID FROM sys.database_principals WHERE name = 'Carlo';  

-- Change to the second database  
USE DB2;  
GO  
CREATE USER Carlo WITH PASSWORD = '<same password>', SID = <SID from DB1>;  
GO  

Per eseguire una query tra database, è necessario impostare l'opzione TRUSTWORTHY sul database chiamante.To execute a cross-database query, you must set the TRUSTWORTHY option on the calling database. Se, ad esempio, l'utente (Carlo) definito in precedenza si trova in DB1, per eseguire SELECT * FROM db2.dbo.Table1; l'impostazione TRUSTWORTHY deve essere attiva per il database DB1.For example if the user (Carlo) defined above is in DB1, to execute SELECT * FROM db2.dbo.Table1; then the TRUSTWORTHY setting must be on for database DB1. Eseguire il codice seguente per attivare l'impostazione TRUSTWORTHY .Execute the following code to set the TRUSTWORTHY setting on.

ALTER DATABASE DB1 SET TRUSTWORTHY ON;  

Creazione di un utente che duplica un account di accessoCreating a User that Duplicates a Login

Se si crea un utente di database indipendente con password usando lo stesso nome di un account di accesso di SQL ServerSQL Server e se l'account di accesso di SQL ServerSQL Server si connette specificando il database indipendente come catalogo iniziale, non sarà possibile stabilire la connessione con l'account di accesso di SQL ServerSQL Server .If a contained database user with password is created, using the same name as a SQL ServerSQL Server login, and if the SQL ServerSQL Server login connects specifying the contained database as the initial catalog, then the SQL ServerSQL Server login will be unable to connect. La connessione sarà valutata come l'entità utente di database indipendente con password nel database indipendente anziché come utente basato sull'accesso di SQL ServerSQL Server .The connection will be evaluated as the contained database user with password principal on the contained database instead of as a user based on the SQL ServerSQL Server login. Questo approccio potrebbe causare un attacco Denial of Service intenzionale o accidentale per l'accesso di SQL ServerSQL Server .This could cause an intentional or accidental denial of service for the SQL ServerSQL Server login.

  • Come procedura consigliata, è opportuno che i membri del ruolo predefinito del server sysadmin considerino la possibilità di connettersi sempre senza usare l'opzione relativa al catalogo iniziale.As a best practice, members of the sysadmin fixed server role should consider always connecting without using the initial catalog option. In questo modo l'account di accesso viene connesso al database master, evitando qualsiasi tentativo da parte del proprietario di un database di utilizzare l'accesso in modo improprio.This connects the login to the master database and avoids any attempts by a database owner to misuse the login attempt. L'amministratore potrà quindi passare al database indipendente con l'istruzione USE<database>.Then the administrator can change to the contained database by using the USE<database> statement. È anche possibile impostare il database indipendente come database predefinito dell'account di accesso, in modo da consentire il completamento dell'accesso al database mastere il successivo trasferimento dell'account di accesso al database indipendente.You can also set the default database of the login to the contained database, which completes the login to master, and then transfers the login to the contained database.

  • Come procedura consigliata, evitare di creare utenti del database indipendente con password con lo stesso nome degli accessi di SQL ServerSQL Server .As a best practice, do not create contained database users with passwords who have the same name as SQL ServerSQL Server logins.

  • Se l'account di accesso duplicato è disponibile, connettersi al database master senza specificare un catalogo iniziale, quindi eseguire il comando USE per passare al database indipendente.If the duplicate login exists, connect to the master database without specifying an initial catalog, and then execute the USE command to change to the contained database.

  • Quando sono presenti database indipendenti, gli utenti di database non indipendenti devono connettersi al Motore di databaseDatabase Engine senza utilizzare un catalogo iniziale oppure specificando il nome di un database non indipendente come catalogo iniziale.When contained databases are present, users of databases that are not contained databases should connect to the Motore di databaseDatabase Engine without using an initial catalog or by specifying the database name of a non-contained database as the initial catalog. In questo modo si eviterà di stabilire la connessione al database indipendente, che è meno soggetto al controllo diretto degli amministratori di Motore di databaseDatabase Engine .This avoids connecting to the contained database which is under less direct control by the Motore di databaseDatabase Engine administrators.

Aumento del livello di accesso mediante la modifica dello stato di indipendenza di un databaseIncreasing Access by Changing the Containment Status of a Database

Gli account di accesso che dispongono dell'autorizzazione ALTER ANY DATABASE , ad esempio i membri del ruolo predefinito del server dbcreator , e gli utenti di un database non indipendente che dispongono dell'autorizzazione CONTROL DATABASE , ad esempio i membri del ruolo predefinito del database db_owner , possono modificare l'impostazione di indipendenza di un database.Logins that have the ALTER ANY DATABASE permission, such as members of the dbcreator fixed server role, and users in a non-contained database that have the CONTROL DATABASE permission, such as members of the db_owner fixed database role, can change the containment setting of a database. Se tale impostazione viene modificata da NONE a PARTIAL o a FULL, l'accesso utente può essere concesso creando utenti del database indipendente con password.If the containment setting of a database is changed from NONE to either PARTIAL or FULL, then user access can be granted by creating contained database users with passwords. In questo modo potrebbe essere consentito l'accesso senza che gli amministratori di SQL ServerSQL Server ne siano a conoscenza o abbiano concesso l'autorizzazione.This could provide access without the knowledge or consent of the SQL ServerSQL Server administrators. Per evitare che un database sia indipendente, impostare l'opzione contained database authentication del Motore di databaseDatabase Engine su 0.To prevent any databases from being contained, set the Motore di databaseDatabase Enginecontained database authentication option to 0. Per impedire connessioni da parte degli utenti del database indipendente con password a determinati database indipendenti, utilizzare trigger di accesso per annullare i tentativi di accesso da parte di tali utenti.To prevent connections by contained database users with passwords on selected contained databases, use login triggers to cancel login attempts by contained database users with passwords.

Collegamento di un database indipendenteAttaching a Contained Database

Mediante il collegamento di un database indipendente, un amministratore potrebbe concedere a utenti indesiderati l'accesso all'istanza di Motore di databaseDatabase Engine.By attaching a contained database, an administrator could give unwanted users access to the instance of the Motore di databaseDatabase Engine. Un amministratore che voglia evitare questo rischio può portare il database online in modalità RESTRICTED_USER , in modo da impedire l'autenticazione per gli utenti del database indipendente con password.An administrator concerned about this risk can bring the database online in RESTRICTED_USER mode, which prevents authentication for contained database users with passwords. Solo le entità autorizzate tramite account di accesso potranno accedere a Motore di databaseDatabase Engine.Only principals authorized through logins will be able to access the Motore di databaseDatabase Engine.

Gli utenti vengono creati utilizzando i requisiti per le password validi al momento della creazione e le password non vengono verificate di nuovo quando si collega il database.Users are created using the password requirements in effect at the time that they are created and passwords are not rechecked when a database is attached. Collegando un database indipendente che supporta password vulnerabili a un sistema con criteri password più severi, un amministratore potrebbe consentire l'utilizzo di password che non soddisfano i criteri password correnti nel Motore di databaseDatabase Enginecollegato.By attaching a contained database which allowed weak passwords to a system with a stricter password policy, an administrator could permit passwords that do not meet the current password policy on the attaching Motore di databaseDatabase Engine. Gli amministratori possono evitare di mantenere le password vulnerabili richiedendo la reimpostazione di tutte le password per il database collegato.Administrators can avoid retaining the weak passwords by requiring that all passwords be reset for the attached database.

Criteri passwordPassword Policies

Le password in un database possono essere obbligatoriamente di tipo complesso, ma non possono essere protette da criteri password attendibili.Passwords in a database can be required to be strong passwords, but cannot be protected by robust password policies. Utilizzare, quando possibile, l'autenticazione di Windows per sfruttare i criteri password più estesi disponibili in Windows.Use Windows Authentication whenever possible to take advantage of the more extensive password policies available from Windows.

Autenticazione KerberosKerberos Authentication

Gli utenti del database indipendente con password non possono utilizzare l'autenticazione Kerberos.Contained database users with passwords cannot use Kerberos Authentication. Quando possibile, utilizzare l'autenticazione di Windows per sfruttare le funzionalità di Windows, ad esempio Kerberos.When possible, use Windows Authentication to take advantage of Windows features such as Kerberos.

Attacco con dizionario offlineOffline Dictionary Attack

Gli hash delle password per gli utenti del database indipendente con password vengono archiviati nel database indipendente.The password hashes for contained database users with passwords are stored in the contained database. Chiunque disponga dell'accesso ai file di database potrebbe effettuare un attacco con dizionario nei confronti degli utenti del database indipendente con password in un sistema non controllato.Anyone with access to the database files could perform a dictionary attack against the contained database users with passwords on an unaudited system. Per contrastare questa minaccia, limitare l'accesso ai file di database o consentire connessioni ai database indipendenti solo utilizzando l'autenticazione di Windows.To mitigate this threat, restrict access to the database files, or only permit connections to contained databases by using Windows Authentication.

Escape di un database indipendenteEscaping a Contained Database

Se un database è parzialmente indipendente, gli amministratori di SQL ServerSQL Server dovranno controllare periodicamente le funzionalità di utenti e moduli nei database indipendenti.If a database is partially contained, SQL ServerSQL Server administrators should periodically audit the capabilities of the users and modules in contained databases.

Denial of Service tramite AUTO_CLOSEDenial of Service Through AUTO_CLOSE

Evitare di configurare la chiusura automatica di database indipendenti.Do not configure contained databases to auto close. Se viene chiuso, l'apertura del database per autenticare un utente utilizza risorse aggiuntive e potrebbe contribuire a un attacco Denial of Service.If closed, opening the database to authenticate a user consumes additional resources and could contribute to a denial of service attack.

Vedere ancheSee Also

Database indipendenti Contained Databases
Migrazione in un database parzialmente indipendenteMigrate to a Partially Contained Database