ApsaraDB for SelectDB utilise un modèle de permissions compatible MySQL pour appliquer un contrôle d'accès granulaire au niveau des tables. Vous pouvez accorder des permissions directement aux utilisateurs ou via des rôles, et restreindre l'accès par adresse IP ou par domaine à l'aide de listes d'autorisation.
Concepts clés
| Concept | Paramètre | Description |
|---|---|---|
| Identité utilisateur | user_identity |
Identifie un utilisateur par la combinaison d'un nom d'utilisateur et d'une adresse hôte. Formats pris en charge : username@'userhost' (une adresse IP spécifique) et username@['domain'] (un nom de domaine que le DNS résout en une ou plusieurs adresses IP). |
| Permission | privilege |
Droit d'exécuter une opération spécifique sur un nœud, un catalogue, une base de données ou une table. |
| Rôle | role |
Groupe de permissions nommé. Attribuez un rôle à un utilisateur pour lui accorder simultanément toutes les permissions associées. Toute modification des permissions d'un rôle s'applique immédiatement à tous les utilisateurs auxquels ce rôle est attribué. Les rôles personnalisés sont pris en charge. |
| Propriété utilisateur | user_property |
Ensemble d'attributs rattachés à un nom d'utilisateur plutôt qu'à une identité utilisateur spécifique. Par exemple, cmy@'192.%' et cmy@['domain'] partagent les mêmes propriétés utilisateur car ils appartiennent tous deux à l'utilisateur cmy. Ces propriétés incluent notamment les limites de connexion et les paramètres du cluster d'importation par défaut. |
Les propriétés utilisateur sont associées au nom d'utilisateur , et non à une identité utilisateur spécifique. Plusieurs identités partageant le même nom d'utilisateur disposent d'un ensemble unique de propriétés utilisateur.
Rôles intégrés
Lors de l'initialisation d'une instance SelectDB, le système crée automatiquement deux rôles et leurs utilisateurs correspondants.
| Rôle | Utilisateur par défaut | Permissions | Cas d'usage |
|---|---|---|---|
operator |
root@'%' |
NODE_PRIV + ADMIN_PRIV ; connexion possible depuis n'importe quel nœud | Contrôle complet du cluster, y compris la gestion des nœuds |
admin |
admin@'%' |
ADMIN_PRIV ; toutes les permissions sauf la modification des nœuds | Administration courante sans accès au niveau des nœuds |
Vous ne pouvez ni révoquer ni modifier les permissions des rôles ou utilisateurs créés automatiquement.
Si vous avez oublié le mot de passe de l'utilisateur admin et ne parvenez plus à vous connecter à l'instance, réinitialisez-le depuis la console SelectDB. Pour plus d'informations, consultez Réinitialiser le mot de passe d'un utilisateur admin pour une instance.
Types de permissions
Après avoir créé un utilisateur, servez-vous d'un compte privilégié pour lui accorder les permissions d'accès aux clusters, bases de données et tables. Pour plus d'informations sur l'octroi des permissions d'accès aux clusters, consultez Accorder à un utilisateur les permissions d'accès aux clusters.
Le tableau suivant décrit les types de permissions disponibles ainsi que les niveaux auxquels chacune peut s'appliquer.
| Permission | Niveaux applicables | Description |
|---|---|---|
| GRANT_PRIV | Global, Catalogue, Base de données, Table | Accorde ou révoque des permissions pour les utilisateurs et les rôles. Permet également de créer, supprimer et modifier des utilisateurs et des rôles. |
| SELECT_PRIV | Global, Catalogue, Base de données, Table | Accès en lecture seule aux bases de données et aux tables. |
| LOAD_PRIV | Global, Catalogue, Base de données, Table | Accès en écriture aux bases de données et aux tables, incluant les opérations LOAD, INSERT et DELETE. |
| ALTER_PRIV | Global, Catalogue, Base de données, Table | Modification des bases de données et des tables : renommage, création ou suppression de colonnes, et gestion des partitions. |
| CREATE_PRIV | Global, Catalogue, Base de données, Table | Création de bases de données, de tables et de vues. |
| DROP_PRIV | Global, Catalogue, Base de données, Table | Suppression de bases de données, de tables et de vues. |
| USAGE_PRIV | Ressource | Utilisation des ressources. |
Niveaux de permissions
Les permissions s'appliquent aux objets de données selon quatre niveaux de portée.
| Niveau | Notation | Portée |
|---|---|---|
| Global | *.*.* |
Toutes les tables de toutes les bases de données dans tous les catalogues |
| Catalogue | ctl.*.* |
Toutes les bases de données et tables du catalogue spécifié |
| Base de données | ctl.db.* |
Toutes les tables de la base de données spécifiée |
| Table | ctl.db.tbl |
La table spécifiée dans la base de données indiquée |
Les permissions sur les ressources utilisent une portée distincte (RESOURCE resource_name) et ne correspondent pas aux niveaux de données.
Référence de la syntaxe SQL
Gestion des utilisateurs et des rôles
| Opération | Mot-clé | Syntaxe |
|---|---|---|
| Créer un utilisateur | CREATE USER | CREATE USER [IF EXISTS] user_identity [IDENTIFIED BY 'password'] [DEFAULT ROLE 'role_name'] [password_policy] |
| Supprimer un utilisateur | DROP USER | DROP USER 'user_identity' |
| Accorder des permissions | GRANT |
|
| Révoquer des permissions | REVOKE |
|
| Créer un rôle | CREATE ROLE | CREATE ROLE rol_name; |
| Supprimer un rôle | DROP ROLE | DROP ROLE rol_name; |
| Consulter les permissions d'un utilisateur | SHOW GRANTS | SHOW [ALL] GRANTS [FOR user_identity]; |
| Lister tous les rôles | SHOW ROLES | SHOW ROLES |
| Interroger les propriétés utilisateur | SHOW PROPERTY | SHOW PROPERTY [FOR user] [LIKE key] |
| Définir les propriétés utilisateur | SET PROPERTY | SET PROPERTY [FOR 'user'] 'key' = 'value' [, 'key' = 'value'] |
Options de politique de mot de passe
Utilisez la clause [password_policy] dans CREATE USER pour configurer les contraintes d'authentification.
| Politique | Valeurs valides | Valeur par défaut | Description | ||
|---|---|---|---|---|---|
| PASSWORD_HISTORY | n |
DEFAULT |
0 (désactivé) |
Nombre de mots de passe précédents qui ne peuvent pas être réutilisés. |
|
| PASSWORD_EXPIRE | DEFAULT |
NEVER |
INTERVAL n DAY/HOUR/SECOND |
|
Durée de validité du mot de passe avant expiration. |
| FAILED_LOGIN_ATTEMPTS | n |
DEFAULT |
Aucune limite |
Nombre maximal de tentatives de connexion échouées consécutives avant le verrouillage du compte. |
|
| PASSWORD_LOCK_TIME | n DAY/HOUR/SECOND |
UNBOUNDED |
— |
Durée pendant laquelle le compte reste verrouillé après avoir atteint la limite de tentatives échouées. |
Permissions ADMIN_PRIV et GRANT_PRIV
ADMIN_PRIV et GRANT_PRIV permettent toutes deux d'accorder des permissions à d'autres utilisateurs, mais leur portée diffère.
ADMIN_PRIV : Ne peut être accordée ou révoquée qu'au niveau global. Au niveau global, GRANT_PRIV équivaut à ADMIN_PRIV ; utilisez-les avec prudence.
GRANT_PRIV : Peut être limitée au niveau global, catalogue, base de données ou table. Un utilisateur disposant de GRANT_PRIV à un niveau donné ne peut accorder des permissions que dans cette portée.
Le tableau ci-dessous indique la permission requise pour chaque opération d'administration.
| Opération | Permission requise |
|---|---|
| CREATE USER | ADMIN_PRIV, ou GRANT_PRIV au niveau global ou base de données |
| DROP USER | ADMIN_PRIV, ou GRANT_PRIV au niveau global |
| CREATE/DROP ROLE | ADMIN_PRIV, ou GRANT_PRIV au niveau global |
| GRANT/REVOKE (portée globale) | ADMIN_PRIV, ou GRANT_PRIV au niveau global |
| GRANT/REVOKE (portée catalogue) | GRANT_PRIV au niveau catalogue |
| GRANT/REVOKE (portée base de données) | GRANT_PRIV au niveau base de données |
| GRANT/REVOKE (portée table) | GRANT_PRIV au niveau table |
| SET PASSWORD (tout utilisateur) | ADMIN_PRIV, ou GRANT_PRIV au niveau global |
| SET PASSWORD (propre identité) | Aucune permission spéciale requise |
Les utilisateurs disposant de GRANT_PRIV à un niveau non global ne peuvent pas modifier le mot de passe d'un utilisateur existant. Ils peuvent uniquement définir un mot de passe lors de la création d'un nouvel utilisateur.
Pour consulter votre identité utilisateur authentifiée actuelle, exécutez :
SELECT current_user();
Pour connaître votre identité de connexion réelle, exécutez :
SELECT user();
Toutes les permissions s'appliquent à current_user, c'est-à-dire l'identité ayant passé l'authentification.
Par exemple, si vous créez un utilisateur dont l'identité est user1@'192.%' et que user1 se connecte depuis le bloc CIDR 192.168.0.0/16, alors current_user correspond à user1@'192.%' tandis que user vaut user1@'192.168.%'. Toutes les permissions s'appliquent à l'identité current_user.
Propriétés utilisateur
Les propriétés utilisateur contrôlent les limites de ressources et le comportement associés à un nom d'utilisateur donné. Définissez-les avec SET PROPERTY et consultez-les avec SHOW PROPERTY.
| Propriété | Description |
|---|---|
cpu_resource_limit |
Ressources CPU maximales pour les requêtes. -1 signifie illimité. Voir aussi : la variable de session cpu_resource_limit. |
default_load_cluster |
Cluster par défaut pour l'importation de données. |
exec_mem_limit |
Mémoire maximale allouée aux requêtes. -1 signifie illimité. Voir aussi : la variable de session exec_mem_limit. |
insert_timeout |
Délai d'expiration pour les opérations INSERT. |
max_query_instances |
Nombre maximal d'instances de requête que l'utilisateur peut exécuter simultanément. |
max_user_connections |
Nombre maximal de connexions simultanées. |
query_timeout |
Délai d'expiration des requêtes. |
resource_tags |
Tags de ressources. |
sql_block_rules |
Règles de blocage SQL. Les requêtes correspondant à ces règles sont rejetées. |
Lorsqu'un même paramètre existe à plusieurs niveaux, le système le résout selon l'ordre suivant :
session variable > user property > global variable > default value
Exemples
Accorder un accès en lecture seule à une seule table
Créez un utilisateur et accordez-lui un accès en lecture seule à 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.%';
Révoquer les permissions d'un utilisateur
REVOKE SELECT_PRIV ON test_db.* FROM 'test_user'@'172.10.%';
Déléguer des permissions via un rôle
Créez un rôle, attribuez-lui des permissions, puis assignez-le à un utilisateur.
-- 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.%';
Consulter et mettre à jour les propriétés utilisateur
-- 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';
Supprimer un utilisateur ou un rôle
DROP USER 'test_user'@'172.10.%';
DROP ROLE test_role;
Consulter les permissions d'un utilisateur
SHOW GRANTS FOR test_user@'%';
Bonnes pratiques
Associer les types d'utilisateurs aux permissions
Voici un modèle courant pour les clusters multi-locataires :
| Type d'utilisateur | Permissions recommandées | Notes |
|---|---|---|
| Administrateur de cluster | ADMIN_PRIV ou GRANT_PRIV (global) | Contrôle total, y compris la gestion des nœuds via le rôle operator |
| Ingénieur R&D | CREATE_PRIV, DROP_PRIV, ALTER_PRIV, LOAD_PRIV, SELECT_PRIV au niveau base de données | Gestion du schéma et des données pour les bases attribuées |
| Utilisateur standard | SELECT_PRIV au niveau base de données ou table | Accès en lecture seule aux données attribuées |
Recourez aux rôles pour simplifier la gestion des permissions lorsque plusieurs utilisateurs partagent le même ensemble de droits.
Déléguer les droits d'octroi sans accès administrateur complet
Si chaque base de données appartient à une équipe différente, créez un utilisateur par base avec GRANT_PRIV limité à cette base. Cet utilisateur pourra ainsi accorder des permissions sur sa propre base à d'autres personnes, sans pouvoir affecter les autres bases de données.
Simuler une liste de blocage grâce à la correspondance prioritaire
SelectDB prend uniquement en charge les listes d'autorisation. Pour bloquer l'accès depuis une plage IP spécifique au sein d'une plage plus large, créez une identité utilisateur plus précise avec un mot de passe différent.
Par exemple, test_user1@'192.%' autorise la connexion depuis 192.*. Pour bloquer la plage 192.168.0.0/16, créez test_user2@'192.168.%' avec un autre mot de passe. Étant donné que 192.168.% est plus spécifique, cette règle est prioritaire : les utilisateurs provenant de cette plage doivent utiliser le nouveau mot de passe et ne peuvent pas employer l'ancien.
Remarques d'utilisation
ADMIN_PRIV ne peut être accordée et révoquée qu'au niveau global.
Au niveau global, GRANT_PRIV équivaut à ADMIN_PRIV car elle permet d'accorder toutes les permissions. Appliquez-la avec prudence.
Toutes les permissions s'appliquent à
current_user(l'identité authentifiée), et non à l'identité de connexion réelle (user).
FAQ
Que faire si un nom de domaine entre en conflit avec une adresse IP lors de la création d'un utilisateur ?
Supprimez l'utilisateur conflictuel avec DROP USER, puis recréez-le avec l'identité correcte.
En cas de conflit entre un domaine et une IP, créez d'abord l'utilisateur avec l'identité de domaine, puis accordez les permissions au niveau du domaine :
CREATE USER test_user@['domain'];
GRANT SELECT_PRIV ON *.* TO test_user@['domain'];
Si le DNS résout le domaine en IP1 et IP2, et que vous accordez ultérieurement une permission différente à test_user@'IP1', cette identité obtient son propre jeu de permissions. Ainsi, la modification de test_user@['domain'] n'affecte pas test_user@'IP1'.
Que faire si deux identités utilisateur avec des plages IP chevauchantes entrent en conflit ?
Créez l'identité la plus spécifique. Le modèle d'hôte le plus précis est toujours prioritaire.
CREATE USER test_user@'%' IDENTIFIED BY "12345";
CREATE USER test_user@'192.%' IDENTIFIED BY "abcde";
Une tentative de connexion depuis la plage 192.168.0.0/16 correspond à 192.% (priorité supérieure). L'utilisation du mot de passe 12345 depuis cette plage sera rejetée ; utilisez plutôt abcde.