Hai diverse domande qui, quindi le eliminerò individualmente:
"Ho letto che è una buona pratica non permettere agli utenti di usare direttamente il login sa, usando invece l'autenticazione di Windows"
Stai mescolando due cose qui: il concetto di SA e il concetto di autenticazione SQL e autenticazione di Windows.
L'autenticazione SQL è un elenco di nomi utente e password archiviati in ogni singolo SQL Server. Il fatto che sia archiviato in SQL è il primo problema. Se è necessario modificare una password di accesso, è necessario modificarla su tutti i server (o mantenere password diverse su server diversi). Con l'autenticazione di Windows, puoi disabilitare centralmente gli accessi, modificare le password, impostare criteri, ecc.
Se si sceglie di utilizzare l'autenticazione SQL, SA è solo un login di autenticazione SQL. È il nome utente predefinito dell'amministratore, proprio come l'amministratore ha l'autenticazione di Windows. Ha superpoteri locali in quell'unica istanza, ma non superpoteri globali in tutte le istanze.
"... e concedere a tali account (o gruppi di account) i privilegi di amministratore di sistema."
Qualunque sia il metodo di autenticazione che scegli, idealmente vuoi seguire il principio del privilegio minimo: garantire alle persone i diritti minimi necessari per svolgere il loro lavoro, e non di più.
Non pensarli come semplici accessi: sono persone che possono farti licenziare. Se rilasciano il database o disabilitano accidentalmente i processi di backup, non verranno licenziati, perché per impostazione predefinita SQL non tiene traccia di chi ha fatto cosa. Sei tu quello che verrà licenziato perché accadrà e non sarai in grado di dire quale persona l'ha fatto.
"In che modo le migliori pratiche aumentano la sicurezza delle mie istanze di SQL Server?"
Vuoi fare due cose:
- Impedire alle persone di rompere il server
- Quando si rompono il server, essere in grado di identificare esattamente chi lo ha fatto
Il primo è realizzato con il principio del privilegio minimo: dare alle persone solo le autorizzazioni di cui hanno bisogno, e niente di più.
Il secondo si ottiene dando a ciascuno il proprio login, non consentendo accessi condivisi (come consentire a tutti di usare lo stesso nome utente / password) e, idealmente, controllando gli accessi. Probabilmente non farai subito l'ultima parte, perché è un po 'dolorosa, ma mettiamo i pezzi al posto giusto in modo da poter aggiungere il controllo in seguito dopo che qualcuno ha lasciato un database e il tuo capo vuole sapere perché.
So cosa stai pensando: "Ma stiamo programmando le app e l'app ha bisogno di un login". Sì, concedi all'applicazione il proprio accesso e gli sviluppatori devono conoscere quella password, ma tale accesso dovrebbe essere così privato delle autorizzazioni che nessuno nella loro mente corretta vorrebbe usarlo. Ad esempio, potrebbe essere necessario essere nei ruoli db_datareader e db_datawriter da soli, nient'altro. In questo modo è possibile inserire, aggiornare, eliminare e selezionare dati, ma non necessariamente modificare schemi, aggiungere indici, modificare procedure memorizzate, ecc.
"Questo vale solo per le istanze di produzione o anche per le nostre istanze di sviluppo interno?"
Penso che si applichi altrettanto alle istanze di sviluppo perché di solito sono preoccupato per le persone che rompono le cose. Le persone adorano semplicemente rompere i server in fase di sviluppo. E, naturalmente, quando è il momento di raggruppare l'elenco delle modifiche da migrare alla produzione, ho bisogno di sapere se un determinato indice è davvero vitale per l'app o se qualche osso ha appena eseguito Database Tuning Advisor e gli ha detto di applicare tutte le modifiche . Le autorizzazioni appropriate aiutano a ridurre quel dolore.