Montar um modelo de menor privilégio com roles (CREATE ROLE, DEFAULT ROLE)
MySQLSegurançaComando
CREATE ROLE IF NOT EXISTS 'app_read', 'app_write';
GRANT SELECT ON shop.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON shop.* TO 'app_write';
-- Application account: network range, TLS required, roles active by default
CREATE USER 'svc_app'@'10.0.%' IDENTIFIED BY 'S3cure#App2024' DEFAULT ROLE 'app_read', 'app_write' REQUIRE SSL;
CREATE USER 'ana'@'%' IDENTIFIED BY 'An4#Report2024';
GRANT 'app_read' TO 'ana'@'%';
SET DEFAULT ROLE ALL TO 'ana'@'%';
-- Show grants with roles expanded
SHOW GRANTS FOR 'svc_app'@'10.0.%' USING 'app_read', 'app_write';
SELECT FROM_USER, FROM_HOST, TO_USER, TO_HOST FROM mysql.role_edges;O que faz
Concede privilégios a roles em vez de usuários individuais; as contas obtêm privilégios por pertencerem a roles. As mudanças acontecem em um só lugar, e auditoria e desligamento de pessoas ficam mais fáceis.
Quando usar
Ao criar novas contas de aplicação / equipe e ao limpar servidores legados com privilégios emaranhados.
Atenção
Uma role que não é default role não fica ativa na sessão (CURRENT_ROLE() NONE) e o usuário parece não ter privilégios; use SET DEFAULT ROLE ALL ou activate_all_roles_on_login=ON. Uma role também é uma conta (bloqueada, sem senha) e aparece em mysql.user. Use uma faixa de rede em vez de '%' para contas de aplicação. Nunca conceda ALL, SUPER, FILE, PROCESS ou CONNECTION_ADMIN a uma conta de aplicação. Revogar um privilégio de uma role afeta também as sessões ativas.