O ApsaraDB for SelectDB utiliza um modelo de permissão compatível com MySQL para aplicar controle de acesso granular no nível de tabela. É possível conceder permissões diretamente aos usuários ou por meio de funções, além de restringir o acesso por endereço IP ou domínio usando listas de permissões.
Conceitos principais
|
Conceito |
Parâmetro |
Descrição |
|
Identidade do usuário |
|
Identifica um usuário pela combinação de nome de usuário e endereço do host. Formatos suportados: |
|
Permissão |
|
Direito de executar uma operação específica em um nó, catálogo, banco de dados ou tabela. |
|
Função |
|
Grupo nomeado de permissões. Atribua uma função a um usuário para conceder todas as permissões desse grupo de uma só vez. Alterar as permissões de uma função afeta imediatamente todos os usuários atribuídos a ela. Funções personalizadas são suportadas. |
|
Propriedade do usuário |
|
Conjunto de atributos vinculados a um nome de usuário, e não a uma identidade de usuário. Por exemplo, |
As propriedades do usuário pertencem ao nome de usuário , e não a uma identidade de usuário específica. Múltiplas identidades que compartilham o mesmo nome de usuário também compartilham um único conjunto de propriedades de usuário.
Funções integradas
Durante a inicialização de uma instância do SelectDB, duas funções e seus respectivos usuários são criados automaticamente.
|
Função |
Usuário padrão |
Permissões |
Cenário de uso |
|
|
|
NODE_PRIV + ADMIN_PRIV; permite login a partir de qualquer nó |
Controle total do cluster, incluindo gerenciamento de nós |
|
|
|
ADMIN_PRIV; todas as permissões, exceto alterações de nós |
Administração diária sem acesso ao nível de nó |
Não é possível revogar ou modificar as permissões de funções ou usuários criados automaticamente.
Caso esqueça a senha do usuário admin e não consiga fazer login na instância, redefina-a pelo console do SelectDB. Para mais informações, consulte Redefinir a senha de um usuário admin para uma instância.
Tipos de permissão
Após criar um usuário, utilize uma conta privilegiada para conceder a ele permissões de acesso a clusters, bancos de dados e tabelas. Para obter informações sobre como conceder permissões de acesso ao cluster, consulte Conceder a um usuário as permissões para acessar clusters.
A tabela a seguir descreve os tipos de permissão disponíveis e os níveis em que cada um pode ser aplicado.
|
Permissão |
Níveis aplicáveis |
Descrição |
|
GRANT_PRIV |
Global, Catálogo, Banco de dados, Tabela |
Concede ou revoga permissões de usuários e funções. Também permite criar, excluir e modificar usuários e funções. |
|
SELECT_PRIV |
Global, Catálogo, Banco de dados, Tabela |
Acesso somente leitura a bancos de dados e tabelas. |
|
LOAD_PRIV |
Global, Catálogo, Banco de dados, Tabela |
Acesso de escrita a bancos de dados e tabelas, incluindo operações LOAD, INSERT e DELETE. |
|
ALTER_PRIV |
Global, Catálogo, Banco de dados, Tabela |
Modifica bancos de dados e tabelas: renomeia, cria ou remove colunas e gerencia partições. |
|
CREATE_PRIV |
Global, Catálogo, Banco de dados, Tabela |
Cria bancos de dados, tabelas e visualizações. |
|
DROP_PRIV |
Global, Catálogo, Banco de dados, Tabela |
Remove bancos de dados, tabelas e visualizações. |
|
USAGE_PRIV |
Recurso |
Utiliza recursos. |
Níveis de permissão
As permissões se aplicam a objetos de dados em quatro níveis de escopo.
|
Nível |
Notação |
Escopo |
|
Global |
|
Todas as tabelas em todos os bancos de dados de todos os catálogos |
|
Catálogo |
|
Todos os bancos de dados e tabelas no catálogo especificado |
|
Banco de dados |
|
Todas as tabelas no banco de dados especificado |
|
Tabela |
|
A tabela especificada no banco de dados especificado |
As permissões de recurso usam um escopo separado (RESOURCE resource_name) e não correspondem aos níveis de dados.
Referência de sintaxe SQL
Gerenciamento de usuários e funções
|
Operação |
Palavra-chave |
Sintaxe |
|
Criar um usuário |
CREATE USER |
|
|
Excluir um usuário |
DROP USER |
|
|
Conceder permissões |
GRANT |
|
|
Revogar permissões |
REVOKE |
|
|
Criar uma função |
CREATE ROLE |
|
|
Excluir uma função |
DROP ROLE |
|
|
Consultar permissões de um usuário |
SHOW GRANTS |
|
|
Consultar todas as funções |
SHOW ROLES |
|
|
Consultar propriedades do usuário |
SHOW PROPERTY |
|
|
Definir propriedades do usuário |
SET PROPERTY |
|
Opções de política de senha
Utilize a cláusula [password_policy] em CREATE USER para configurar restrições de autenticação.
|
Política |
Valores válidos |
Padrão |
Descrição |
||
|
PASSWORD_HISTORY |
|
|
|
Número de senhas anteriores que não podem ser reutilizadas. |
|
|
PASSWORD_EXPIRE |
|
|
|
|
Tempo durante o qual a senha permanece válida antes de expirar. |
|
FAILED_LOGIN_ATTEMPTS |
|
|
Sem limite |
Máximo de tentativas consecutivas de login com falha antes que a conta seja bloqueada. |
|
|
PASSWORD_LOCK_TIME |
|
|
— |
Duração do bloqueio da conta após atingir o limite de tentativas com falha. |
Permissões ADMIN_PRIV e GRANT_PRIV
Tanto ADMIN_PRIV quanto GRANT_PRIV permitem conceder permissões a outros usuários, mas seus escopos diferem.
ADMIN_PRIV: Só pode ser concedida ou revogada no nível global. A permissão GRANT_PRIV no nível global equivale à ADMIN_PRIV — use ambas com cautela.
GRANT_PRIV: Pode ter escopo global, de catálogo, de banco de dados ou de tabela. Um usuário com GRANT_PRIV em um determinado nível só pode conceder permissões dentro desse escopo.
A tabela abaixo mostra qual permissão é necessária para cada operação administrativa.
|
Operação |
Permissão necessária |
|
CREATE USER |
ADMIN_PRIV ou GRANT_PRIV no nível global ou de banco de dados |
|
DROP USER |
ADMIN_PRIV ou GRANT_PRIV no nível global |
|
CREATE/DROP ROLE |
ADMIN_PRIV ou GRANT_PRIV no nível global |
|
GRANT/REVOKE (escopo global) |
ADMIN_PRIV ou GRANT_PRIV no nível global |
|
GRANT/REVOKE (escopo de catálogo) |
GRANT_PRIV no nível de catálogo |
|
GRANT/REVOKE (escopo de banco de dados) |
GRANT_PRIV no nível de banco de dados |
|
GRANT/REVOKE (escopo de tabela) |
GRANT_PRIV no nível de tabela |
|
SET PASSWORD (qualquer usuário) |
ADMIN_PRIV ou GRANT_PRIV no nível global |
|
SET PASSWORD (própria identidade) |
Nenhuma permissão especial necessária |
Usuários com GRANT_PRIV em um nível não global não podem alterar a senha de um usuário existente. Eles só podem definir uma senha ao criar um novo usuário.
Para consultar sua identidade de usuário autenticada atual, execute:
SELECT current_user();
Para consultar sua identidade de login real, execute:
SELECT user();
Todas as permissões são aplicadas com base no current_user, que é a identidade que passou pela autenticação.
Por exemplo, se você criar um usuário cuja identidade seja user1@'192.%' e user1 fizer login a partir do bloco CIDR 192.168.0.0/16, então current_user será user1@'192.%' e user será user1@'192.168.%'. Todas as permissões se aplicam à identidade current_user.
Propriedades do usuário
As propriedades do usuário controlam limites de recursos e comportamentos para um determinado nome de usuário. Defina-as com SET PROPERTY e consulte-as com SHOW PROPERTY.
|
Propriedade |
Descrição |
|
|
Limite máximo de recursos de CPU para consultas. |
|
|
Cluster padrão para importação de dados. |
|
|
Memória máxima para consultas. |
|
|
Tempo limite para operações INSERT. |
|
|
Número máximo de instâncias de consulta que o usuário pode executar simultaneamente. |
|
|
Número máximo de conexões simultâneas. |
|
|
Tempo limite para consultas. |
|
|
Tags de recurso. |
|
|
Regras de bloqueio de SQL. Consultas que correspondem a essas regras são rejeitadas. |
Quando a mesma configuração existe em vários níveis, o sistema a resolve nesta ordem:
session variable > user property > global variable > default value
Exemplos
Conceder acesso somente leitura a uma única tabela
Crie um usuário e conceda acesso somente leitura a test_db.test_table.
-- Create the user, allowing login from the 172.10.0.0/16 CIDR block
CREATE USER test_user@'172.10.%' IDENTIFIED BY '123456';
-- Grant read, modify, and import permissions on the table
GRANT SELECT_PRIV, ALTER_PRIV, LOAD_PRIV ON test_db.test_table TO 'test_user'@'172.10.%';
Revogar permissões de um usuário
REVOKE SELECT_PRIV ON test_db.* FROM 'test_user'@'172.10.%';
Delegar permissões por meio de uma função
Crie uma função, conceda permissões a ela e, em seguida, atribua-a a um usuário.
-- Create the role
CREATE ROLE test_role;
-- Grant import permissions on all tables in test_db to the role
GRANT LOAD_PRIV ON test_db.* TO ROLE 'test_role';
-- Assign the role to a user
GRANT "test_role" TO test_user@'172.10.%';
Consultar e atualizar propriedades do usuário
-- Query all properties of a user
SHOW PROPERTY FOR 'test_user';
-- Filter by property name
SHOW PROPERTY FOR 'test_user' LIKE '%max_user_connections%';
-- Set a property
SET PROPERTY FOR 'test_user' 'max_user_connections' = '1000';
Excluir um usuário ou função
DROP USER 'test_user'@'172.10.%';
DROP ROLE test_role;
Consultar permissões de um usuário
SHOW GRANTS FOR test_user@'%';
Melhores práticas
Mapear tipos de usuário para permissões
Um padrão comum para clusters multilocatários:
|
Tipo de usuário |
Permissões recomendadas |
Observações |
|
Administrador do cluster |
ADMIN_PRIV ou GRANT_PRIV (global) |
Controle total, incluindo gerenciamento de nós via função |
|
Engenheiro de P&D |
CREATE_PRIV, DROP_PRIV, ALTER_PRIV, LOAD_PRIV, SELECT_PRIV no nível de banco de dados |
Gerencia esquema e dados dos bancos de dados atribuídos |
|
Usuário regular |
SELECT_PRIV no nível de banco de dados ou tabela |
Acesso somente leitura aos dados atribuídos |
Use funções para simplificar o gerenciamento de permissões quando vários usuários compartilharem o mesmo conjunto de permissões.
Delegar direitos de concessão sem acesso administrativo total
Se cada banco de dados pertencer a uma equipe diferente, crie um usuário por banco de dados com GRANT_PRIV restrita a esse banco de dados. Esse usuário poderá conceder permissões em seu banco de dados a outras pessoas, sem conseguir afetar outros bancos de dados.
Simular uma lista de bloqueios usando correspondência por prioridade
O SelectDB suporta apenas listas de permissões. Para bloquear o acesso de um intervalo de IP específico dentro de um intervalo mais amplo, crie uma identidade de usuário mais específica com uma senha diferente.
Por exemplo, test_user1@'192.%' permite login a partir de 192.*. Para bloquear o intervalo 192.168.0.0/16, crie test_user2@'192.168.%' com uma senha diferente. Como 192.168.% é mais específico, ele tem prioridade — os usuários desse intervalo devem usar a nova senha e não podem usar a original.
Observações de uso
A permissão ADMIN_PRIV só pode ser concedida e revogada no nível global.
A permissão GRANT_PRIV no nível global equivale à ADMIN_PRIV, pois permite conceder todas as permissões. Aplique-a com cautela.
Todas as permissões são aplicadas com base no
current_user(a identidade autenticada), e não na identidade de login real (user).
Perguntas frequentes
O que fazer se houver conflito entre um nome de domínio e um endereço IP ao criar um usuário?
Exclua o usuário conflitante com DROP USER e recrie-o com a identidade correta.
Para um conflito entre domínio e IP, crie primeiro o usuário com a identidade de domínio e depois conceda as permissões no nível de domínio:
CREATE USER test_user@['domain'];
GRANT SELECT_PRIV ON *.* TO test_user@['domain'];
Se o DNS resolver o domínio para IP1 e IP2, e você posteriormente conceder uma permissão diferente a test_user@'IP1', essa identidade receberá seu próprio conjunto de permissões — alterar test_user@['domain'] não afetará test_user@'IP1'.
O que fazer se houver conflito entre duas identidades de usuário com intervalos de IP sobrepostos?
Crie a identidade mais específica. O padrão de host mais específico tem prioridade.
CREATE USER test_user@'%' IDENTIFIED BY "12345";
CREATE USER test_user@'192.%' IDENTIFIED BY "abcde";
Uma tentativa de login a partir do intervalo 192.168.0.0/16 corresponde a 192.% (maior prioridade). O uso da senha 12345 nesse intervalo será rejeitado; use abcde em vez disso.