none
Revoke permissão sem efeito cascata? RRS feed

  • Pergunta

  • Boa tarde pessoal!

     

    Possuo um usuário que tem permissão de executar uma determinada procedure e também tem o direito de conceder permissão para executar esta procedure.

    Gostaria de saber se é possível utilizar o REVOKE na permissão de executar a procedure deste usuário, sem afetar a mesma permissão que este usuário concedeu para outros usuários?

    Resumindo: quero dar um revoke na permissão deste usuário, mas sem que afete as permissões que ele concedeu a outros usuário.

    quinta-feira, 14 de julho de 2011 18:00

Respostas

  • Boa Noite,

    É possível conceder permissões com a opção WITH GRANT OPTION para que um usuário que recebeu uma determinada permissão, possa repassar essa permissão. Entretanto, por uma questão de segurança, caso o usuário tenha recebido a permissão e repassado-a, quando este a perde, todos os usuários que receberam a permissão através do repasse também a perdem. Não há como mudar esse comportamento (que não é exclusivo do SQL Server, mas de muitos SGBDs). Se você quer que os usuários mantenham sua permissão, o ideal é que você conceda todas as permissões por si só (WITH GRANT OPTION é uma opção DEPRECATED e insegura). Segue um exemplo:

    -- Muda o contexto de banco de dados
    USE tempdb

    -- Cria um usuário Usr1
    CREATE USER Usr1 WITHOUT LOGIN

    -- Cria um usuário Usr2
    CREATE USER Usr2 WITHOUT LOGIN

    -- Cria uma tabela
    CREATE TABLE T (ID INT)
    INSERT INTO T VALUES (1)

    -- Concede permissão ao usuário Usr1
    GRANT SELECT ON T TO Usr1 WITH GRANT OPTION

    -- Muda o contexto para Usr1
    EXECUTE AS USER = 'Usr1'

    -- Faz o SELECT
    SELECT ID FROM T

    -- O usuário Usr1 repassa a permissão
    GRANT SELECT ON T TO Usr2 WITH GRANT OPTION

    -- Volta ao usuário Principal
    REVERT

    -- Muda o contexto para o usuário Usr2
    EXECUTE AS USER = 'Usr2'

    -- Faz o SELECT
    SELECT ID FROM T

    -- Volta ao usuário Principal
    REVERT

    -- Consulta as permissões
    SELECT USER_NAME(grantee_principal_id), OBJECT_NAME(major_id), permission_name, STATE_DESC
    FROM sys.database_permissions WHERE major_id = OBJECT_ID('T')

    -- Retira a permissão do Usr1 somente (ocorre um erro)
    REVOKE SELECT ON T TO Usr1

    -- Como a permissão foi com GRANT OPTION, é preciso Cascata
    REVOKE SELECT ON T TO Usr1 CASCADE

    -- Consulta as permissões
    SELECT USER_NAME(grantee_principal_id), OBJECT_NAME(major_id), permission_name, STATE_DESC
    FROM sys.database_permissions WHERE major_id = OBJECT_ID('T')

    -- Usr2 perdeu a permissão
    -- Muda o contexto para o usuário Usr2
    EXECUTE AS USER = 'Usr2'

    -- Faz o SELECT
    SELECT ID FROM T

    -- Volta ao usuário Principal
    REVERT

    -- Elimina os usuários
    DROP USER Usr1
    DROP USER Usr2

    -- Mata o objeto
    DROP TABLE T

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 15 de julho de 2011 04:02

Todas as Respostas

  • Leivo, eu fiz o teste e afetou sim.

    Na verdade eu tentei primeiro revogar a permissão, então o SQL Server reclama pedindo que eu use o CASCADE, e se eu uso este comando ele tira as permissões também daqueles que receberam a permissão do determinado usuário.

    quinta-feira, 14 de julho de 2011 20:23
  • Boa Noite,

    É possível conceder permissões com a opção WITH GRANT OPTION para que um usuário que recebeu uma determinada permissão, possa repassar essa permissão. Entretanto, por uma questão de segurança, caso o usuário tenha recebido a permissão e repassado-a, quando este a perde, todos os usuários que receberam a permissão através do repasse também a perdem. Não há como mudar esse comportamento (que não é exclusivo do SQL Server, mas de muitos SGBDs). Se você quer que os usuários mantenham sua permissão, o ideal é que você conceda todas as permissões por si só (WITH GRANT OPTION é uma opção DEPRECATED e insegura). Segue um exemplo:

    -- Muda o contexto de banco de dados
    USE tempdb

    -- Cria um usuário Usr1
    CREATE USER Usr1 WITHOUT LOGIN

    -- Cria um usuário Usr2
    CREATE USER Usr2 WITHOUT LOGIN

    -- Cria uma tabela
    CREATE TABLE T (ID INT)
    INSERT INTO T VALUES (1)

    -- Concede permissão ao usuário Usr1
    GRANT SELECT ON T TO Usr1 WITH GRANT OPTION

    -- Muda o contexto para Usr1
    EXECUTE AS USER = 'Usr1'

    -- Faz o SELECT
    SELECT ID FROM T

    -- O usuário Usr1 repassa a permissão
    GRANT SELECT ON T TO Usr2 WITH GRANT OPTION

    -- Volta ao usuário Principal
    REVERT

    -- Muda o contexto para o usuário Usr2
    EXECUTE AS USER = 'Usr2'

    -- Faz o SELECT
    SELECT ID FROM T

    -- Volta ao usuário Principal
    REVERT

    -- Consulta as permissões
    SELECT USER_NAME(grantee_principal_id), OBJECT_NAME(major_id), permission_name, STATE_DESC
    FROM sys.database_permissions WHERE major_id = OBJECT_ID('T')

    -- Retira a permissão do Usr1 somente (ocorre um erro)
    REVOKE SELECT ON T TO Usr1

    -- Como a permissão foi com GRANT OPTION, é preciso Cascata
    REVOKE SELECT ON T TO Usr1 CASCADE

    -- Consulta as permissões
    SELECT USER_NAME(grantee_principal_id), OBJECT_NAME(major_id), permission_name, STATE_DESC
    FROM sys.database_permissions WHERE major_id = OBJECT_ID('T')

    -- Usr2 perdeu a permissão
    -- Muda o contexto para o usuário Usr2
    EXECUTE AS USER = 'Usr2'

    -- Faz o SELECT
    SELECT ID FROM T

    -- Volta ao usuário Principal
    REVERT

    -- Elimina os usuários
    DROP USER Usr1
    DROP USER Usr2

    -- Mata o objeto
    DROP TABLE T

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.wordpress.com


    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 15 de julho de 2011 04:02
  • Gustavo, obrigado!

     

    O jeito vai ser eu conceder as permissões com o usuário 'sa', por exemplo, utilizando o WITH EXECUTE AS OWNER (estou concedendo as permissões de forma automática através de procedures).

    Obrigado!

    sexta-feira, 15 de julho de 2011 12:45