Qual é a diferença entre EXECUTE AS USER e EXECUTE AS LOGIN que faz com que o segundo se comporte inesperadamente?


10

Recentemente, tenho usado EXECUTE AS LOGIN para verificar se uma determinada pessoa pode ou não usar uma função de tabela em um de nossos bancos de dados. Os testes mostraram que ele podia, mas ele relatou repetidamente falhas.

A pessoa usa o login 'WEB' para conectar-se ao banco de dados e ele tem o usuário 'WEB' nesse banco de dados associado ao login 'WEB', então tentei os seguintes scripts:

-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT 
    USER_NAME() AS 'user_name'
    ,SUSER_NAME() AS 'suser_name'
    ,SUSER_SNAME() AS 'suser_sname'
    ,SYSTEM_USER AS 'system_user'
GO
REVERT
GO

e

-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT 
    USER_NAME() AS 'user_name'
    ,SUSER_NAME() AS 'suser_name'
    ,SUSER_SNAME() AS 'suser_sname'
    ,SYSTEM_USER AS 'system_user'
GO
REVERT
GO

A primeira parte foi boa com o resultado de:

WEB WEB WEB REDE

Mas o segundo resultado foi um pouco confuso:

dbo WEB WEB REDE

Qual é a diferença entre EXECUTE AS USER e EXECUTE AS LOGIN que faz com que o segundo falhe? Além disso, é claro, o primeiro é o nível do banco de dados e o segundo é a representação no nível do servidor, do que estou ciente e não explica a situação aqui.


O segundo não está "falhando", apenas está dizendo que o login tem uma função de servidor (sysadmin) atribuída. Você verificou os esquemas que estão sendo solicitados pelo usuário? Teve isso antes, onde o esquema padrão do dbo não é o que os desenvolvedores esperavam que fosse. Melhor fixo no código referenciando totalmente a mesa
Stuart Moore

Respostas:


7

Um membro do sysadmingrupo é sempre mapeado para dbo, mesmo se tiver um usuário explícito no banco de dados. Portanto, parece que o login WEBé membro e sysadmin, portanto, USER_NAME()retorna corretamente dbono segundo caso.


Verificado e confirmado. Era um membro do sysadmin de fato. Aconteceu que este relatório chegou a um dos outros desenvolvedores e, em vez da solução correta, ele simplesmente atribuiu a função de administrador de sistema de login. Eu nem pensaria nisso, estou realmente decepcionado. Nós vamos ter uma conversa séria quando ele voltar. Aprendi algo novo hoje, obrigado.
gemisigo

Isso também significa que seu aplicativo (relatório?) Possui permissão de representação em um membro sysadmin. Veja como exatamente isso é concedido na hierarquia de permissões. É provável que, mesmo agora, o relatório possa, se desejar, representar outro sysadminmembro, de modo que o aplicativo de relatório seja um administrador de sistema de fato. Ou seja. Como possível vetor de ataque de elevação de privilégios, ele pode ser usado por um hacker ou, mais provavelmente, por sua equipe.
Remus Rusanu

Se o aplicativo de relatório tiver permissão IMPERSONATE ativada WEBe WEBfoi removido sysadmin, a porta estará fechada. Mas vale a pena conferir.
Remus Rusanu

Sim, teremos que verificar tudo que afeta os direitos novamente para ver se houve outros problemas "corrigidos" dessa maneira. Não
estou
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.