Comportamento estranho usando o grupo do Active Directory mapeado para usuário / login do SQL Server

1

Eu me deparei com um comportamento muito estranho no SQL Server 2008R2.

Eu tenho um aplicativo de terceiros que atua como um cliente do SQL Server. Eu tenho um subconjunto de meus usuários que devem ter acesso a este aplicativo. Eu criei um grupo do Active Directory, chamo de "DOM \ appusers", com um par de usuários de teste. Eu criei um login do SQL Server com o mesmo nome, criei um banco de dados, chamei-o de "appdb", criei um usuário no banco de dados appdb, "DOM \ appusers" associado ao login e atribui a função "db_owner" a esse usuário .

A maioria das operações funciona. Mas "alguns" deles obtêm erros. Em particular, uma consulta falha:

SELECT x,y,z
  INTO tmpTable
  FROM (table1 INNER JOIN table 2 on table1.col1 = table2.col1)
       INNER JOIN table3 ON table1.col2 = table3.col2
 GROUP BY x,y,a,b,c
HAVING (((table2.col4)=0) AND
        ((table3.col5)=0)) AND
       ((table3.col6)=0)

Isso foi retirado do SQL Profiler, onde ele sinalizou a consulta com um erro, mas não havia mais detalhes sobre o erro, e o aplicativo não é de ajuda, então não posso dizer exatamente qual erro foi lançado. / p>

Não sou especialista em SQL, por isso não sei o que é especial sobre essa consulta ou por que ela deve exigir permissões além do db_owner, mas isso não é realmente uma dúvida sobre consultas SQL.

O que é realmente estranho para mim é que, se eu ignorar o grupo, obtenho resultados diferentes. Se eu excluir o login e o usuário do SQL Server detalhados acima, crie um novo login e um usuário fazendo referência diretamente a um usuário do Active Directory e atribua-lhe a mesma função db_owner, então a consulta acima funcionará. De fato, todas as consultas funcionam conforme o esperado.

Isso foi estranho o suficiente para que eu achasse que tinha que ser um erro da minha parte. Eu fiz o mesmo experimento três vezes, com o mesmo resultado. Verifiquei que os usuários de teste não têm acesso ao banco de dados sem uma das configurações acima. Tentei atribuir a função "sysadmin" do servidor ao grupo AD e a consulta começou a funcionar. Obviamente, não posso deixar assim, mas foi um ponto de dados. Eu também criei um login usando a autenticação do SQL Server em vez da autenticação do Windows, e isso funcionou também.

A pergunta óbvia é a seguinte: o que há de diferente nas permissões quando um usuário as obtém através de um grupo vs "diretamente" (na medida em que tudo é "direto" com as camadas extras de login e usuário do banco de dados do MSSQL)? O db_owner não significa a mesma coisa para um grupo como para um usuário? Isso é apenas um bug? Existe uma correção? Eu prefiro não ter que adicionar cada usuário do aplicativo à lista de usuários / logon do SQL Server individualmente, mas essa é a única solução que eu já vi até agora. Existe uma solução diferente?

Agradecemos antecipadamente por qualquer ajuda. : -)

    
por Rick Koshi 07.08.2013 / 16:45

2 respostas

3

Acontece que essa não era exatamente uma questão de "permissões", apesar da mensagem de erro que recebi.

Para encurtar a história, um usuário do SQL Server correlacionado a um grupo do Windows não tem um esquema padrão e não há como configurar um. É uma limitação do SQL Server 2008R2 (e provavelmente versões anteriores) que foi corrigida no SQL Server 2012.

Assim, a consulta do aplicativo estava tentando criar sua tmpTable em um esquema no qual não tinha permissão. O motivo pelo qual funcionou quando criei um usuário do SQL Server conectado a um único usuário do Windows é que, nesse caso, ele atribuiu um esquema padrão de "dbo", que era o esquema correto. O usuário tinha permissão para escrever lá e tudo funcionou.

Por fim, a única solução para mim era / é criar usuários e logins individuais do SQL Server conectados a contas individuais do Windows. É um incômodo de manutenção contínua, mas parece ser inevitável com esta versão do SQL Server.

    
por 03.12.2013 / 07:21
1

Tenho certeza de que o problema é que a conta de serviço (você disse que estava sendo executada como "SERVIÇO DE REDE") não tem as credenciais necessárias para procurar membros do grupo de domínio. Se um usuário de domínio é verificado pelo sistema operacional como realmente sendo DOMAIN \ user, o SQL Server confia isso, mas se o SQL Server precisa procurar se DOMAIN \ groupmember é realmente um membro de DOMAIN \ group, isso falha porque a conta de serviço não ' t tem as permissões necessárias para procurar essas informações. Assim, o membro do grupo é capaz de fazer o login porque o sistema operacional diz que está tudo bem, mas quando está verificando as permissões nos objetos mais tarde, a pesquisa falha.

Tente executar o Serviço SQL como uma conta de serviço de usuário / domínio do domínio e veja se isso ajuda.

    
por 11.08.2013 / 19:07