ON CLUSTER permet de créer des utilisateurs sur un cluster, voir DDL distribué.
Identification
IDENTIFIED WITH no_passwordIDENTIFIED WITH plaintext_password BY 'qwerty'IDENTIFIED WITH sha256_password BY 'qwerty'orIDENTIFIED BY 'password'IDENTIFIED WITH sha256_hash BY 'hash'orIDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'IDENTIFIED WITH double_sha1_password BY 'qwerty'IDENTIFIED WITH double_sha1_hash BY 'hash'IDENTIFIED WITH bcrypt_password BY 'qwerty'IDENTIFIED WITH bcrypt_hash BY 'hash'IDENTIFIED WITH ldap SERVER 'server_name'IDENTIFIED WITH kerberosorIDENTIFIED WITH kerberos REALM 'realm'IDENTIFIED WITH ssl_certificate CN 'mysite.com:user'IDENTIFIED WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa', KEY 'another_public_key' TYPE 'ssh-ed25519'IDENTIFIED WITH http SERVER 'http_server'orIDENTIFIED WITH http SERVER 'http_server' SCHEME 'basic'IDENTIFIED BY 'qwerty'
Dans ClickHouse Cloud, par défaut, les mots de passe doivent respecter les exigences de complexité suivantes :
- Comporter au moins 12 caractères
- Contenir au moins 1 chiffre
- Contenir au moins 1 majuscule
- Contenir au moins 1 minuscule
- Contenir au moins 1 caractère spécial
Exemples
-
Le nom d’utilisateur suivant est
name1et ne nécessite pas de mot de passe, ce qui n’offre évidemment guère de sécurité : -
Pour spécifier un mot de passe en clair :
-
L’option la plus courante consiste à utiliser un mot de passe haché avec SHA-256. ClickHouse hachera le mot de passe pour vous lorsque vous spécifiez
IDENTIFIED WITH sha256_password. Par exemple :L’utilisateurname3peut désormais se connecter avecmy_password, mais le mot de passe est stocké sous la forme de la valeur de hachage ci-dessus. Le fichier SQL suivant a été créé dans/var/lib/clickhouse/accesset est exécuté au démarrage du serveur :
-
double_sha1_passwordn’est généralement pas nécessaire, mais s’avère pratique lorsque vous travaillez avec des clients qui l’exigent (comme l’interface MySQL) :ClickHouse génère et exécute la requête suivante : -
bcrypt_passwordest l’option la plus sûre pour stocker les mots de passe. Il utilise l’algorithme bcrypt, qui résiste aux attaques par force brute même si le hachage du mot de passe est compromis.La longueur du mot de passe est limitée à 72 caractères avec cette méthode. Le paramètre de facteur de coût de bcrypt, qui définit la quantité de calculs et le temps nécessaires pour calculer le hachage et vérifier le mot de passe, peut être modifié dans la configuration du serveur :Le facteur de coût doit être compris entre 4 et 31, avec une valeur par défaut de 12.
-
Le type de mot de passe peut également être omis :
Dans ce cas, ClickHouse utilisera le type de mot de passe par défaut spécifié dans la configuration du serveur :Les types de mot de passe disponibles sont :
plaintext_password,sha256_password,double_sha1_password. -
Plusieurs méthodes d’authentification peuvent être spécifiées :
- Les anciennes versions de ClickHouse peuvent ne pas prendre en charge la syntaxe associée à plusieurs méthodes d’authentification. Par conséquent, si le serveur ClickHouse contient de tels utilisateurs et qu’il est rétrogradé vers une version qui ne la prend pas en charge, ces utilisateurs deviendront inutilisables et certaines opérations liées aux utilisateurs ne fonctionneront plus. Pour effectuer une rétrogradation proprement, il faut configurer tous les utilisateurs pour qu’ils n’utilisent qu’une seule méthode d’authentification avant la rétrogradation. Sinon, si le serveur a été rétrogradé sans suivre la procédure appropriée, les utilisateurs défectueux doivent être supprimés.
no_passwordne peut pas coexister avec d’autres méthodes d’authentification pour des raisons de sécurité. Par conséquent, vous ne pouvez spécifierno_passwordque s’il s’agit de la seule méthode d’authentification dans la requête.
Hôte de l’utilisateur
HOST de la requête des façons suivantes :
HOST IP 'ip_address_or_subnetwork'— L’utilisateur peut se connecter au serveur ClickHouse uniquement depuis l’adresse IP spécifiée ou un sous-réseau. Exemples :HOST IP '192.168.0.0/16',HOST IP '2001:DB8::/32'. Pour une utilisation en production, spécifiez uniquement des élémentsHOST IP(adresses IP et leurs masques), car l’utilisation dehostethost_regexppeut entraîner une latence supplémentaire.HOST ANY— L’utilisateur peut se connecter depuis n’importe où. Il s’agit de l’option par défaut.HOST LOCAL— L’utilisateur peut se connecter uniquement en local.HOST NAME 'fqdn'— L’hôte de l’utilisateur peut être spécifié sous forme de FQDN. Par exemple,HOST NAME 'mysite.com'.HOST REGEXP 'regexp'— Vous pouvez utiliser des expressions régulières pcre lorsque vous spécifiez les hôtes des utilisateurs. Par exemple,HOST REGEXP '.*\.mysite\.com'.HOST LIKE 'template'— Permet d’utiliser l’opérateur LIKE pour filtrer les hôtes des utilisateurs. Par exemple,HOST LIKE '%'est équivalent àHOST ANY,HOST LIKE '%.mysite.com'filtre tous les hôtes du domainemysite.com.
@ après le nom d’utilisateur. Exemples :
CREATE USER mira@'127.0.0.1'— Équivalent à la syntaxeHOST IP.CREATE USER mira@'localhost'— Équivalent à la syntaxeHOST LOCAL.CREATE USER mira@'192.168.%.%'— Équivalent à la syntaxeHOST LIKE.
Clause VALID UNTIL
YYYY-MM-DD [hh:mm:ss] [timezone] pour la date et l’heure, où [timezone] doit être un décalage numérique tel que +09:00 ou l’un des suivants : UTC, GMT, Z, MSK, MSD ; les zones IANA nommées telles que Asia/Tokyo ne sont pas reconnues (voir la remarque ci-dessous). Par défaut, ce paramètre est défini sur 'infinity'. La plage d’échéances acceptée s’étend de 1900-01-01 00:00:00 UTC à 9999-12-31 09:59:59 UTC — le dernier instant restant dans l’année 9999 dans tous les fuseaux horaires, afin que l’instant stocké ne soit jamais tronqué lors de son affichage. Une échéance dans le passé signifie que les identifiants ont déjà expiré. Les échéances antérieures à 1970-01-01 00:00:01 UTC ne sont acceptées que comme marqueur « déjà expiré » : elles sont normalisées au plus ancien instant expiré, soit une seconde après l’époque Unix (1970-01-01 00:00:01 UTC), de sorte que SHOW CREATE USER affiche cet instant plutôt que l’échéance que vous avez indiquée. Les échéances à partir de cet instant sont stockées telles quelles.
Une échéance est stockée sous forme d’instant absolu, mais SHOW CREATE USER et system.users l’affichent dans le fuseau horaire du serveur ou de la session. Ainsi, un même instant stocké apparaît sous la forme d’heures locales différentes sur des serveurs configurés différemment : l’instant expiré normalisé ci-dessus, par exemple, s’affiche sous la forme 1970-01-01 00:00:01 sur un serveur en UTC et sous la forme 1970-01-01 14:00:01 sur un serveur en Pacific/Kiritimati. La vérification utilise toujours l’instant stocké, et non son affichage.
L’emplacement de la clause détermine les méthodes d’authentification auxquelles elle s’applique :
- Avant la clause
IDENTIFIED(ou lorsque la requête ne spécifie aucune méthode d’authentification) : l’échéance est définie au niveau de l’utilisateur et s’applique à toutes ses méthodes d’authentification. - Après une méthode d’authentification : l’échéance s’applique uniquement à cette méthode. Une clause écrite après l’ensemble de la liste
IDENTIFIEDne s’applique donc qu’à la dernière méthode, les méthodes précédentes n’ayant pas d’expiration.
CREATE USER name1 VALID UNTIL '2025-01-01'CREATE USER name1 VALID UNTIL '2025-01-01 12:00:00 UTC'CREATE USER name1 VALID UNTIL '2025-01-01 12:00:00 +09:00'CREATE USER name1 VALID UNTIL 'infinity'CREATE USER name1 VALID UNTIL '2025-01-01' IDENTIFIED WITH plaintext_password BY 'password_1', bcrypt_password BY 'password_2'— l’échéance définie au niveau de l’utilisateur s’applique aux deux méthodes.CREATE USER name1 IDENTIFIED WITH plaintext_password BY 'no_expiration', bcrypt_password BY 'expiration_set' VALID UNTIL '2025-01-01'— l’échéance s’applique uniquement à la méthodebcrypt_password;plaintext_passwordn’expire jamais.
La chaîne de date et d’heure est analysée par
parseDateTimeBestEffort, qui reconnaît uniquement les jetons de fuseau horaire UTC, GMT, Z, MSK, MSD et les décalages numériques tels que +09:00 ou -05:00. Les fuseaux horaires IANA nommés tels que Asia/Tokyo ou Europe/London ne sont pas pris en charge, et un décalage fixe n’est pas équivalent à une zone IANA pour les régions qui observent l’heure d’été ; vous devez donc calculer le décalage correct pour la date précise que vous encodez.Clause VALID FOR
VALID FOR est une forme abrégée pratique de VALID UNTIL. Au lieu d’une date et d’une heure absolues, elle accepte un intervalle, et l’échéance d’expiration est calculée en ajoutant cet intervalle à l’heure actuelle au moment de l’exécution de la requête. Le résultat est ensuite stocké au format VALID UNTIL, de sorte que SHOW CREATE USER affiche toujours l’échéance absolue résolue. Elle peut être utilisée partout où VALID UNTIL est autorisé et obéit aux mêmes règles de positionnement : avant IDENTIFIED (ou en l’absence de méthode d’authentification), elle définit une échéance au niveau de l’utilisateur qui s’applique à toutes les méthodes, tandis qu’après une méthode d’authentification, elle ne s’applique qu’à cette méthode. L’échéance est stockée et appliquée avec une précision à la seconde ; les intervalles inférieurs à la seconde (NANOSECOND, MICROSECOND, MILLISECOND) sont donc rejetés, et la plus petite unité acceptée est SECOND. Un intervalle négatif est accepté pour indiquer que les identifiants ont déjà expiré ; si l’échéance obtenue est antérieure à 1970-01-01 00:00:01 UTC, elle est normalisée à cet instant expiré minimal, que SHOW CREATE USER affiche ensuite dans le fuseau horaire du serveur ou de la session, comme décrit pour VALID UNTIL.
Exemples :
CREATE USER name1 VALID FOR INTERVAL 1 DAYCREATE USER name1 VALID FOR INTERVAL 3 MONTHCREATE USER name1 VALID FOR INTERVAL 1 DAY + INTERVAL 12 HOURCREATE USER name1 VALID FOR INTERVAL 30 DAY IDENTIFIED WITH plaintext_password BY 'password_1', bcrypt_password BY 'password_2'— l’échéance au niveau de l’utilisateur s’applique aux deux méthodes.CREATE USER name1 IDENTIFIED WITH plaintext_password BY 'no_expiration', bcrypt_password BY 'expiration_set' VALID FOR INTERVAL 30 DAY— l’échéance ne s’applique qu’à la méthodebcrypt_password;plaintext_passwordn’expire jamais.
Clause GRANTS
VALID UNTIL, le cas échéant) et s’applique uniquement à cette méthode.
Lorsqu’un utilisateur se connecte avec une telle méthode d’authentification, les droits d’accès de la session correspondent à l’intersection des droits d’accès de l’utilisateur (y compris ceux issus des rôles accordés) et des privilèges répertoriés dans la clause. La clause n’ajoute jamais de droits d’accès : si un privilège répertorié n’est pas accordé à l’utilisateur, la session ne le possède pas. Les sessions authentifiées avec une telle méthode ne peuvent pas non plus accorder de privilèges (l’option GRANT OPTION ne survit jamais à l’intersection) ni administrer des rôles. L’administration des rôles inclut non seulement leur création, modification, suppression, attribution et révocation, mais aussi la modification des rôles activés par défaut pour un utilisateur (SET DEFAULT ROLE et ALTER USER ... DEFAULT ROLE), qui est également refusée.
EXECUTE AS change le principal de la session ; une instruction exécutée sous usurpation d’identité est donc limitée par l’intersection des droits d’accès de l’utilisateur cible et des privilèges répertoriés, plutôt que par les droits de l’utilisateur qui s’est connecté. Cette limite n’est jamais levée, et l’usurpation nécessite que IMPERSONATE ON target soit à la fois accordé à l’utilisateur et répertorié dans la clause ; ainsi, des identifiants limités ne peuvent jamais conférer davantage de droits que les identifiants illimités du même utilisateur.
Cela offre un moyen pratique de créer des jetons pour les applications : des identifiants supplémentaires, assortis d’une date d’expiration et d’un ensemble limité de privilèges, liés à l’utilisateur — ils apparaissent dans system.query_log et system.processes sous le nom de l’utilisateur, cessent de fonctionner si l’utilisateur est supprimé et perdent leurs droits d’accès lorsque l’utilisateur les perd.
Exemples :
CREATE USER name1 IDENTIFIED BY 'qwerty' GRANTS (SELECT ON db.*)ALTER USER name1 ADD IDENTIFIED WITH plaintext_password BY 'app_token' VALID UNTIL '2026-12-31' GRANTS (SELECT ON db.table, INSERT ON db.table)
ALTER USER affecte les nouvelles sessions, et non celles déjà établies.
Les autorisations sur des sources filtrées telles que READ ON S3('s3://bucket/.*') ne sont pas encore prises en charge dans la clause : l’intersection compare un filtre source comme une chaîne opaque et ne peut pas restreindre un filtre à un autre. Une telle autorisation est donc rejetée plutôt que de n’accorder silencieusement aucun accès.
La clause est prise en charge uniquement pour les méthodes d’authentification dont les identifiants sont vérifiés exclusivement localement par le serveur. Pour les méthodes dont la vérification contacte (ou, dans le cas de jwt, peut contacter — par exemple pour récupérer les clés de signature) un système externe (ldap, kerberos, http, jwt), la clause est rejetée : lorsque plusieurs méthodes d’authentification acceptent les mêmes identifiants, la limite est appliquée en revérifiant les identifiants avec les autres méthodes, et une interrogation supplémentaire d’un système externe n’est pas sûre ; une autre méthode acceptant les mêmes identifiants pourrait donc contourner la limite.
Lorsque les mêmes identifiants effectifs sont acceptés par plusieurs méthodes d’authentification, la connexion est limitée de manière restrictive par toutes ces méthodes : la session obtient l’intersection des GRANTS de toutes les méthodes correspondantes et expire à la plus proche de leurs dates VALID UNTIL. La date VALID UNTIL la plus proche prévaut même lorsqu’elle est déjà passée — la connexion est rejetée, exactement comme si l’unique méthode correspondante avait expiré ; ainsi, l’expiration d’un jeton ne confère jamais silencieusement aux identifiants partagés les droits ou la durée de vie d’une méthode plus permissive.
Cette combinaison n’est vérifiée que parmi les méthodes d’authentification validées localement par le serveur, pour la même raison que la clause elle-même est refusée pour une méthode validée par un système externe : revérifier les identifiants exigerait une interrogation supplémentaire non sûre du système externe. Ainsi, si les mêmes identifiants sont également acceptés par une méthode validée par un système externe (ldap, kerberos, http, jwt) pour le même utilisateur, le VALID UNTIL de cette méthode ne fait pas partie de la combinaison et une expiration antérieure configurée pour celle-ci ne raccourcit pas la session obtenue via la méthode validée localement.
Clause GRANTEES
GRANTEES :
user— Spécifie un utilisateur auquel cet utilisateur peut accorder des privilèges.role— Spécifie un rôle auquel cet utilisateur peut accorder des privilèges.ANY— Cet utilisateur peut accorder des privilèges à n’importe qui. Il s’agit du paramètre par défaut.NONE— Cet utilisateur ne peut accorder de privilèges à personne.
EXCEPT. Par exemple, CREATE USER user1 GRANTEES ANY EXCEPT user2. Cela signifie que si user1 s’est vu accorder certains privilèges avec GRANT OPTION, il pourra accorder ces privilèges à n’importe qui, sauf à user2.
Exemples
mira, protégé par le mot de passe qwerty :
mira doit démarrer l’application cliente sur l’hôte où s’exécute le serveur ClickHouse.
Créez le compte utilisateur john et attribuez-lui des rôles :
john, attribuez-lui des rôles et définissez-en certains par défaut :
john et autorisez-le à accorder ses privilèges à l’utilisateur associé au compte jack :
john :