Você tem várias perguntas diferentes aqui, então eu vou eliminá-las individualmente:
"Li que é uma prática recomendada não permitir que os usuários usem o logon sa diretamente, em vez disso, usando a autenticação do Windows"
Você está misturando duas coisas aqui: o conceito de SA e o conceito de autenticação SQL e autenticação do Windows.
A autenticação SQL é uma lista de nomes de usuário e senhas armazenados em todo e qualquer servidor SQL. O fato de estar armazenado no SQL é o primeiro problema. Se você precisar alterar a senha de um login, precisará alterá-la em todos os servidores (ou manter senhas diferentes em servidores diferentes). Com a autenticação do Windows, você pode desativar centralmente os logins, alterar senhas, definir políticas etc.
Se você optar por usar a autenticação SQL, o SA será apenas um login de autenticação SQL. É o nome de usuário do administrador padrão, assim como o administrador está na autenticação do Windows. Ele possui superpotências locais nessa instância, mas não superpotências globais em todas as instâncias.
"... e permitindo a essas contas (ou grupos de contas) privilégios de administrador de sistema."
Qualquer que seja o método de autenticação que você escolher, o ideal é seguir o princípio do menor privilégio: conceder às pessoas os direitos mínimos necessários para realizar seu trabalho e nada mais.
Não pense neles apenas como logins - são pessoas que podem fazer com que você seja demitido. Se eles descartarem o banco de dados ou desabilitarem suas tarefas de backup acidentalmente, não serão demitidos, porque, por padrão, o SQL não rastreia quem fez o que. Você é quem vai ser demitido porque isso vai acontecer, e você não será capaz de dizer qual pessoa fez isso.
"Como as práticas recomendadas aumentam a segurança das minhas instâncias do SQL Server?"
Você quer fazer duas coisas:
- Impedir que as pessoas quebrem o servidor
- Quando eles quebrarem o servidor, poderão identificar exatamente quem o fez
O primeiro é realizado com o princípio do menor privilégio: dar às pessoas apenas as permissões necessárias e nada mais.
A segunda é realizada dando a cada pessoa seu próprio login, não permitindo logins compartilhados (como permitir que todos usem o mesmo nome de usuário / senha) e, idealmente, auditando os logins. Você provavelmente não fará a última parte imediatamente, porque é meio doloroso, mas vamos colocar as peças em primeiro lugar, para que você possa adicionar auditorias mais tarde depois que alguém soltar um banco de dados e seu chefe quiser saber o porquê.
Sei o que você está pensando: "Mas estamos codificando aplicativos, e o aplicativo precisa de um login". Sim, dê ao aplicativo seu próprio logon, e os desenvolvedores precisam saber essa senha, mas esse logon deve ser tão despojado de permissões que ninguém em sã consciência desejaria usá-lo. Por exemplo, pode ser necessário apenas nas funções db_datareader e db_datawriter, nada mais. Dessa forma, ele pode inserir, atualizar, excluir e selecionar dados, mas não necessariamente alterar esquemas, adicionar índices, alterar procedimentos armazenados etc.
"Isso se aplica apenas a instâncias de produção ou também a nossas instâncias de desenvolvimento interno?"
Eu acho que isso se aplica tanto a instâncias de desenvolvimento porque geralmente estou preocupado com pessoas quebrando coisas. As pessoas adoram quebrar servidores em desenvolvimento. E, é claro, quando é hora de agrupar a lista de alterações para migrar para a produção, preciso saber se um determinado índice é realmente vital para o aplicativo ou se algum idiota acabou de executar o Orientador de Otimização do Banco de Dados e disse-lhe para aplicar todas as alterações . Permissões apropriadas ajudam a diminuir essa dor.