Configurez l'authentification par jeton pour une passerelle Kyuubi dans EMR Serverless Spark. Les jetons associés aux utilisateurs RAM appliquent un contrôle d'accès granulaire aux données du catalogue Paimon dans Data Lake Formation (DLF), garantissant que chaque client n'interroge que les données autorisées.
Cas d'utilisation
Dans le cadre de l'analyse de données en entreprise, plusieurs utilisateurs ou applications accèdent aux données via une passerelle SQL unifiée, telle qu'une passerelle Kyuubi. La sécurité des données exige d'isoler les accès selon l'identité : par exemple, l'analyste A interroge uniquement les rapports métier, tandis que l'ingénieur de données B accède aux jeux de données bruts. Cette solution isole les permissions de données dans un environnement multilocataire grâce à une authentification complète des identités.
Procédure
Étape 1 : Préparer l'environnement et les permissions
-
Préparez les ressources de base.
Créez un espace de travail. Gérer les espaces de travail.
Créez et démarrez une passerelle Kyuubi dans l'espace de travail. Gérer les passerelles Kyuubi.
Créez un catalogue de données dans DLF avec la base de données et les tables requises.
-
Configurez les permissions de l'utilisateur RAM.
Permissions EMR Serverless Spark : Accorder des permissions à un utilisateur RAM.
Permissions de l'espace de travail : ajoutez l'utilisateur RAM à l'espace de travail et attribuez-lui un rôle. Gérer les utilisateurs et les rôles.
Étape 2 : Accorder des permissions sur les tables dans DLF
Accordez à l'utilisateur RAM l'accès à la table cible dans DLF. Vous devez également accorder la permission Describe sur la base de données default afin que la passerelle Kyuubi puisse initialiser la session Spark.
Connectez-vous à la .
Accédez à la base de données et à la table dans le catalogue de données cible.
Sélectionnez la table pour laquelle vous souhaitez accorder des permissions et cliquez sur l'onglet Permission.
-
Cliquez sur Add Permission.
Principal : sélectionnez DLF User.
Select DLF User : sélectionnez l'utilisateur RAM cible.
Permission : sélectionnez les permissions requises.
-
Cliquez sur OK.
RemarqueEMR Serverless Spark met par défaut en cache les métadonnées et les données DLF. Les modifications de permissions peuvent prendre environ 10 minutes pour être effectives.
Pour appliquer immédiatement les modifications de permissions, ajoutez
spark.sql.catalog.lakehouse.cache-enabled falseà la configuration Spark de la passerelle Kyuubi.
Étape 3 : Générer un jeton Kyuubi
Sur la page Kyuubi Gateway, localisez la passerelle cible et, dans la colonne Actions, cliquez sur Token Management.
-
Cliquez sur Create Token. Dans la boîte de dialogue qui s'affiche, configurez les paramètres suivants et cliquez sur OK.
Parameter
Description
Name
Nom du nouveau jeton.
Expired At
Période d'expiration en jours. Minimum : 1. Par défaut : 365 jours.
Assigned to
Sélectionnez l'utilisateur RAM cible.
-
Copiez les informations du jeton.
ImportantCopiez le jeton immédiatement : il ne sera plus possible de le consulter ultérieurement. Si le jeton expire ou est perdu, créez-en un nouveau ou réinitialisez le jeton existant.
Étape 4 : Se connecter avec Beeline et vérifier les permissions
-
Construisez la commande de connexion JDBC.
beeline -u "jdbc:hive2://<endpoint>:<port>/;transportMode=http;user=<UserName or RoleName>;httpPath=cliservice/token/<Token>"Paramètres :
Parameter
Description
<endpoint>Endpoint de la passerelle Kyuubi.
<port>443pour les endpoints publics,80pour les endpoints internes.<UserName or RoleName>Utilisateur RAM ou rôle RAM. Utilisez le nom court ou le nom complet. Exemples :
-
Utilisateur RAM :
agentouagent@xxxx05398154xxxx.onaliyun.com -
Rôle RAM :
AliyunServiceRoleForDataworksEngine
<Token>Le jeton que vous avez généré pour l'utilisateur RAM à l'étape 3.
[root@master-1-1(xxx) ~]# beeline -u "jdbc:hive2://kyuubi-cn-hangzhou-internal.spark.emr.aliyuncs.com:80;transportMode=http;user=emr_test;httpPath=cliservice/token/j2xxx" xxx SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/apps/HIVE/hive-3.1.3-hadoop3.1-1.0.9/lib/log4j-slf4j-impl-2.17.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/opt/apps/HADOOP-COMMON/hadoop-3.2.1-1.3.5-alinux3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] Connecting to jdbc:hive2://kyuubi-cn-hangzhou-internal.spark.emr.aliyuncs.com:80;transportMode=http;user=emr_test;httpPath=cliservice/token/j2xxx Connected to: Spark SQL (version 3.5.2-emr) Driver: Hive JDBC (version 3.1.3) Transaction isolation: TRANSACTION_REPEATABLE_READ Beeline version 3.1.3 by Apache Hive 0: jdbc:hive2://kyuubi-cn-hangzhou-internal.s> -
-
Vérifiez le contrôle d'accès.
-
Interrogez une table autorisée :
SELECT * FROM <database_name>.<authorized_table_name> LIMIT 10;Sortie attendue :
2025-10-24 16:55:45.008 INFO nioEventLoopGroup-7-1 org. nnelInactive! +-----+----------+ | id | name | +-----+----------+ | 1 | Alice | | 2 | Bob | | 3 | Charlie | +-----+----------+ 3 rows selected (5.079 seconds) -
Interrogez une table non autorisée :
SELECT * FROM <database_name>.<unauthorized_table_name> LIMIT 10;La requête échoue avec une erreur de permission telle que
emr_test doesn't have privilege SELECT on TABLE. Exemple de sortie d'erreur :Caused by: org.apache.paimon.rest.exceptions.ForbiddenException: Forbidden: User acs:ram::xxx:user/emr_test doesn't have privilege SELECT on TABLE default.paimon_tbl requestId:xxx at org.apache.paimon.rest.DefaultErrorHandler.accept(DefaultErrorHandler.java:59) at org.apache.paimon.rest.DefaultErrorHandler.accept(DefaultErrorHandler.java:35) at org.apache.paimon.rest.HttpClient.exec(HttpClient.java:156) at org.apache.paimon.rest.HttpClient.get(HttpClient.java:69) at org.apache.paimon.rest.RESTApi.getTable(RESTApi.java:465)
-
FAQ
Q1 : Pourquoi puis-je toujours interroger une table non autorisée après avoir accordé des permissions ? Causes possibles :
Cache des métadonnées DLF : le moteur Spark met en cache le schéma de la table, ce qui peut contourner les vérifications de permissions. Solution : ajoutez
spark.sql.catalog.lakehouse.cache-enabled falseà votre configuration Spark.Latence des permissions : la synchronisation des permissions DLF peut présenter un court délai, généralement inférieur à 10 secondes. Suggestion : patientez et réessayez, ou vérifiez les permissions dans la console DLF.
Q2 : Que faire si un jeton est perdu ? Le jeton en texte clair n'est affiché qu'une seule fois lors de sa création. Le système ne le stocke pas. Si le jeton est perdu ou divulgué :
Sur la page Token Management, localisez l'entrée correspondante et cliquez sur Reset Token.
L'ancien jeton est automatiquement invalidé et un nouvel identifiant est généré.
Mettez à jour toutes les configurations clientes avec le nouveau jeton.
Q3 : Pourquoi un utilisateur RAM doit-il disposer de la permission Describe sur la base de données default lors de la connexion à la passerelle Kyuubi ? Lorsque la passerelle Kyuubi établit une session Spark, elle charge la base de données default comme contexte initial. Sans accès à cette base de données, l'initialisation de la session échoue et la connexion est interrompue. Cela s'applique même si vos tables métier se trouvent dans d'autres bases de données ; tous les utilisateurs RAM se connectant à la passerelle doivent donc disposer de la permission DescribeDatabase sur la base de données default.
Q4 : Comment utiliser un jeton Kyuubi dans DataWorks pour contrôler l'accès aux données DLF pour EMR Serverless Spark ?
Lorsque vous soumettez une tâche via un nœud Serverless Kyuubi DataWorks, DataWorks transmet automatiquement l'identité d'accès par défaut de la ressource de calcul à la connexion JDBC. Lier des ressources de calcul EMR Serverless Spark. Nœud Serverless Kyuubi.
Annexe : Proxy d'identité et flux de permissions
Les jetons de la passerelle Kyuubi servent d'identifiants d'identité. Les demandes d'accès sont transmises par proxy sous l'identité de l'utilisateur RAM propriétaire du jeton, intégrant ainsi les permissions DLF au flux de travail des requêtes EMR Serverless Spark.
Flux de travail :
Génération du jeton : un jeton est généré pour un utilisateur RAM dans la passerelle Kyuubi, lié de manière unique à l'identité de cet utilisateur.
Authentification du client : le client (tel que Beeline) inclut le jeton et le nom d'utilisateur RAM dans la demande de connexion JDBC adressée à la passerelle Kyuubi.
Proxy d'identité : la passerelle Kyuubi valide le jeton et le moteur Spark emprunte l'identité de l'utilisateur RAM lors des requêtes.
Autorisation DLF : le moteur Spark envoie des requêtes à DLF en tant qu'utilisateur RAM emprunté.
Application des permissions : DLF autorise la requête en fonction de la politique d'accès de l'utilisateur RAM.