Tienes varias preguntas diferentes aquí, así que las eliminaré individualmente:
"He leído que es una buena práctica no permitir que los usuarios usen el inicio de sesión sa directamente, en lugar de eso, usan la autenticación de Windows"
Aquí está mezclando dos cosas: el concepto de SA y el concepto de autenticación de SQL y autenticación de Windows.
La autenticación de SQL es una lista de nombres de usuario y contraseñas que se almacenan en todos y cada uno de los SQL Server. El hecho de que esté almacenado en SQL es el primer problema. Si necesita cambiar la contraseña de un inicio de sesión, debe cambiarla en cada servidor (o mantener diferentes contraseñas en diferentes servidores). Con la autenticación de Windows, puede deshabilitar centralmente los inicios de sesión, cambiar las contraseñas, establecer políticas, etc.
Si elige utilizar la autenticación de SQL, SA es solo un inicio de sesión de autenticación de SQL. Es el nombre de usuario predeterminado del administrador, al igual que el Administrador está en la autenticación de Windows. Tiene superpoderes locales en esa instancia, pero no superpoderes globales en todas las instancias.
"... y permitir esos privilegios de administrador de sistemas de cuentas (o grupos de cuentas)".
Independientemente del método de autenticación que elija, lo ideal es seguir el principio del privilegio mínimo: otorgar a las personas los derechos mínimos que necesitan para realizar su trabajo, y nada más.
No pienses en ellos como solo inicios de sesión: son personas que pueden despedirte. Si abandonan la base de datos o deshabilitan sus trabajos de copia de seguridad accidentalmente, no serán despedidos, porque de forma predeterminada, SQL no rastrea quién hizo qué. Tú eres el que será despedido porque va a suceder, y no podrás decir qué persona lo hizo.
"¿Cómo la mejor práctica aumenta la seguridad de mis instancias de SQL Server?"
Quieres hacer dos cosas:
- Evitar que la gente rompa el servidor
- Cuando rompan el servidor, podrá identificar exactamente quién lo hizo
El primero se logra con el principio de privilegio mínimo: otorgar a las personas solo los permisos que necesitan y nada más.
El segundo se logra dando a cada persona su propio inicio de sesión, no permitiendo inicios de sesión compartidos (como permitir que todos usen el mismo nombre de usuario / contraseña) e, idealmente, auditando los inicios de sesión. Probablemente no haga esa última parte de inmediato, porque es un poco doloroso, pero primero pongamos las piezas en su lugar para que pueda agregar la auditoría más tarde después de que alguien suelte una base de datos y su jefe quiera saber por qué.
Sé lo que estás pensando: "Pero estamos codificando aplicaciones, y la aplicación necesita un inicio de sesión". Sí, otorgue a la aplicación su propio inicio de sesión, y los desarrolladores necesitan saber esa contraseña, pero ese inicio de sesión debe estar tan desprovisto de permisos que nadie en su sano juicio desearía usarlo. Por ejemplo, podría necesitar estar solo en los roles db_datareader y db_datawriter, nada más. De esa manera puede insertar, actualizar, eliminar y seleccionar datos, pero no necesariamente cambiar esquemas, agregar índices, cambiar procedimientos almacenados, etc.
"¿Esto solo se aplica a instancias de producción, o también a nuestras instancias de desarrollo interno?"
Creo que se aplica tanto a las instancias de desarrollo porque generalmente me preocupa que la gente rompa cosas. A la gente le encanta romper servidores en desarrollo. Y, por supuesto, cuando llega el momento de agrupar la lista de cambios para migrar a producción, necesito saber si un índice en particular es realmente vital para la aplicación o si algún huesohueso simplemente ejecutó el Asesor de ajuste de base de datos y le dijo que aplicara todos los cambios . Los permisos adecuados ayudan a disminuir ese dolor.