REVOKE e a imagem espelhada de GRANT: retira privilegios que voce concedeu antes a um usuario ou a um papel. Na pratica, revogar e mais traicoeiro do que conceder, porque o mesmo acesso pode chegar por varios caminhos ao mesmo tempo.
Sintaxe basica
Para retirar um privilegio especifico em uma tabela, informe o privilegio, o objeto e o beneficiario:
REVOKE INSERT ON orders FROM analyst;
Voce pode revogar varios privilegios de uma vez e mirar colunas especificas:
REVOKE SELECT, UPDATE ON users FROM analyst;
REVOKE UPDATE (salary) ON employees FROM analyst;
REVOKE ALL PRIVILEGES ON orders FROM analyst;
O principio central: REVOKE so remove o que foi concedido diretamente aquele beneficiario. Se o acesso veio de outro caminho, o comando ainda assim executa sem erro, mas o acesso efetivo continua de pe.
CASCADE versus RESTRICT
Se um privilegio foi concedido WITH GRANT OPTION, quem o recebeu pode ter repassado adiante. Ao revogar, o PostgreSQL precisa decidir o destino dessas concessoes derivadas.
RESTRICT (o comportamento padrao) recusa a revogacao se outras concessoes dependerem desta.
CASCADE remove o privilegio e todas as concessoes que descendem dele.
GRANT SELECT ON orders TO manager WITH GRANT OPTION;
GRANT SELECT ON orders TO analyst;
REVOKE SELECT ON orders FROM manager RESTRICT;
REVOKE SELECT ON orders FROM manager CASCADE;
Voce tambem pode revogar apenas a capacidade de reconceder, deixando o acesso em si intacto:
REVOKE GRANT OPTION FOR SELECT ON orders FROM manager CASCADE;
Gotcha: CASCADE pode apagar o acesso de contas em que voce nem pensou. Antes de revogar com CASCADE, inspecione a cadeia de concessoes em information_schema.role_table_grants, ou voce pode quebrar o painel ou o job de ETL de alguem.
Por que o PUBLIC ainda tem acesso
A surpresa mais comum: voce revoga um privilegio de um usuario e ele continua lendo a tabela mesmo assim. A causa e o pseudo-papel PUBLIC, ao qual todo papel do cluster pertence de forma implicita. Se o privilegio foi concedido a PUBLIC, revoga-lo de um unico usuario nao muda nada.
GRANT SELECT ON users TO PUBLIC;
REVOKE SELECT ON users FROM analyst;
REVOKE SELECT ON users FROM PUBLIC;
Atencao tambem aos privilegios do dono: o dono da tabela e os superusuarios mantem acesso total apesar do REVOKE. Voce nao consegue tirar o acesso deles com uma revogacao comum.
Papel versus usuario
Distribuir acesso por meio de papeis de grupo e pratico, mas complica a revogacao. Se o usuario analyst e membro do papel analytics_team, revogar um privilegio de analyst pessoalmente nao afeta o que ele herda atraves do papel.
GRANT SELECT ON orders TO analytics_team;
GRANT analytics_team TO analyst;
REVOKE SELECT ON orders FROM analyst;
REVOKE SELECT ON orders FROM analytics_team;
REVOKE analytics_team FROM analyst;
O MySQL segue um modelo parecido, mas nao suporta REVOKE ... CASCADE/RESTRICT, e os papeis so chegaram na versao 8.0; antes disso, os privilegios eram atribuidos diretamente as contas. O ClickHouse suporta REVOKE e papeis, mas seus privilegios e sua sintaxe diferem bastante do SQL padrao.
- Verifique primeiro o acesso efetivo: leia
information_schema.role_table_grants e percorra as participacoes em papeis antes de revogar qualquer coisa.
- Nao esqueca do
PUBLIC: para tabelas sensiveis, execute de forma explicita REVOKE ... FROM PUBLIC.
- Prefira
RESTRICT (ou simplesmente omita CASCADE) para que o comando falhe de forma evidente quando houver concessoes dependentes e voce veja o problema com antecedencia.
- Revogue no mesmo nivel em que concedeu: revogue um papel de um papel e uma concessao direta de um usuario.
- Envolva a serie de comandos
REVOKE em uma transacao e verifique com um SELECT como o usuario afetado antes de confirmar.
REVOKEe a imagem espelhada deGRANT: retira privilegios que voce concedeu antes a um usuario ou a um papel. Na pratica, revogar e mais traicoeiro do que conceder, porque o mesmo acesso pode chegar por varios caminhos ao mesmo tempo.Sintaxe basica
Para retirar um privilegio especifico em uma tabela, informe o privilegio, o objeto e o beneficiario:
REVOKE INSERT ON orders FROM analyst;Voce pode revogar varios privilegios de uma vez e mirar colunas especificas:
REVOKE SELECT, UPDATE ON users FROM analyst; REVOKE UPDATE (salary) ON employees FROM analyst; REVOKE ALL PRIVILEGES ON orders FROM analyst;O principio central:
REVOKEso remove o que foi concedido diretamente aquele beneficiario. Se o acesso veio de outro caminho, o comando ainda assim executa sem erro, mas o acesso efetivo continua de pe.CASCADE versus RESTRICT
Se um privilegio foi concedido
WITH GRANT OPTION, quem o recebeu pode ter repassado adiante. Ao revogar, o PostgreSQL precisa decidir o destino dessas concessoes derivadas.RESTRICT(o comportamento padrao) recusa a revogacao se outras concessoes dependerem desta.CASCADEremove o privilegio e todas as concessoes que descendem dele.GRANT SELECT ON orders TO manager WITH GRANT OPTION; -- manager passed it on: GRANT SELECT ON orders TO analyst; -- This fails because manager re-granted the right: REVOKE SELECT ON orders FROM manager RESTRICT; -- This removes manager's grant AND analyst's: REVOKE SELECT ON orders FROM manager CASCADE;Voce tambem pode revogar apenas a capacidade de reconceder, deixando o acesso em si intacto:
REVOKE GRANT OPTION FOR SELECT ON orders FROM manager CASCADE;Por que o PUBLIC ainda tem acesso
A surpresa mais comum: voce revoga um privilegio de um usuario e ele continua lendo a tabela mesmo assim. A causa e o pseudo-papel
PUBLIC, ao qual todo papel do cluster pertence de forma implicita. Se o privilegio foi concedido aPUBLIC, revoga-lo de um unico usuario nao muda nada.-- Someone granted broad access earlier: GRANT SELECT ON users TO PUBLIC; -- This looks right but analyst still reads users: REVOKE SELECT ON users FROM analyst; -- You must revoke from PUBLIC itself: REVOKE SELECT ON users FROM PUBLIC;Atencao tambem aos privilegios do dono: o dono da tabela e os superusuarios mantem acesso total apesar do
REVOKE. Voce nao consegue tirar o acesso deles com uma revogacao comum.Papel versus usuario
Distribuir acesso por meio de papeis de grupo e pratico, mas complica a revogacao. Se o usuario
analyste membro do papelanalytics_team, revogar um privilegio deanalystpessoalmente nao afeta o que ele herda atraves do papel.GRANT SELECT ON orders TO analytics_team; GRANT analytics_team TO analyst; -- No effect: analyst gets SELECT via the role, not directly: REVOKE SELECT ON orders FROM analyst; -- Option A: revoke from the role (affects everyone in it): REVOKE SELECT ON orders FROM analytics_team; -- Option B: remove this user from the role: REVOKE analytics_team FROM analyst;O MySQL segue um modelo parecido, mas nao suporta
REVOKE ... CASCADE/RESTRICT, e os papeis so chegaram na versao 8.0; antes disso, os privilegios eram atribuidos diretamente as contas. O ClickHouse suportaREVOKEe papeis, mas seus privilegios e sua sintaxe diferem bastante do SQL padrao.Como apertar permissoes com seguranca
information_schema.role_table_grantse percorra as participacoes em papeis antes de revogar qualquer coisa.PUBLIC: para tabelas sensiveis, execute de forma explicitaREVOKE ... FROM PUBLIC.RESTRICT(ou simplesmente omitaCASCADE) para que o comando falhe de forma evidente quando houver concessoes dependentes e voce veja o problema com antecedencia.REVOKEem uma transacao e verifique com umSELECTcomo o usuario afetado antes de confirmar.