Tous les appels (HTTP) au serveur Constellation doivent être authentifiés. Pour cela, nous utilisons une clé d’accès que l’on nomme “AccessKey”.

L’AccessKey

Chaque requête au serveur Constellation comporte soit dans les paramètres de l’URL (querystring) soit dans les entêtes (headers) HTTP trois informations :

  • SentinelName : le nom de la sentinelle
  • PackageName : le nom du package
  • AccessKey : la clé d’accès

Les paramètres “SentinelName” et “PackageName” permettent d’identifier le package qui réalise la requête car un package (virtuel ou non) est toujours associé à une sentinelle (virtuelle ou non).

En fait le couple “SentinelName/PackageName” forme l’identifiant unique du package (nommé instance de package) dans la Constellation et l’AccessKey peut être comparé au “mot de passe”.

Une sentinelle (virtuelle ou non) déclarée dans la configuration de votre Constellation doit obligatoirement être associée à une clé d’accès et les packages (virtuels ou non) déclarés sur une sentinelle utilisent implicitement la même clé d’accès ou bien peuvent redéfinir une clé spécifique.

Il y a quelques cas particuliers :

  • Lorsqu’une sentinelle produit des logs, son “PackageName” est “Sentinel”
  • Pour les consommateurs ou contrôleurs, le “SentinelName” est soit “Consumer” ou soit “Controller” et le “PackageName” sert de “FriendlyName” pour les logs
  • Dans le cas de l’utilisation de la fonction de “Debug on Constellation” depuis le SDK VisualStudio, le “SentinelName” est “Developer”

Les Credentials

Dans le fichier de configuration de votre Constellation, on ne déclare pas l’AccessKey directement sur une sentinelle ou un package.

En effet une sentinelle est associée à un credential et un package utilise implicitement le même credential que sa sentinelle ou bien redéfini son propre credential.

Un credential comporte obligatoirement deux propriétés :

  • Le nom (unique) du credential
  • L’AccessKey

Pour authentifier une requête, le serveur Constellation regardera alors si l’AccessKey de la requête correspond bien à celle déclarée pour le credential utilisé par le couple Sentinel/Package.

Un credential peut définir les propriétés suivantes :

  • Enable : indique si le credential est activé ou désactivé
  • EnableControlHub : indique si le credential peut se connecter sur le hub de contrôle (pour l’administration de la Constellation)
  • EnableManagementAPI : indique si le credential peut se connecter à l’API de Management (pour l’édition de la configuration)
  • EnableDeveloperAccess : indique si le credential peut utiliser la sentinelle virtuelle “Developer” pour debugger des packages (utilisé par le SDK Visual Studio)

Vous pouvez gérer les credentials depuis la Console Constellation ou depuis le fichier de configuration.

Manage Credential

Login et AccessKey

L’AccessKey doit être une chaîne de caractère assez longue et sera utilisée un peu comme un mot de passe pour l’authentification.

Cependant il est assez compliqué de retenir un AccessKey surtout comparé à un couple “login / password” que nous utilisons au quotidien.

C’est pourquoi la Console Constellation, les installeurs Constellation ou encore le SDK Constellation propose d’utiliser un login/password pour générer un AccessKey.

La formule est très simple : AccessKey = sha1(login + password). En clair une clé d’accès peut être obtenue par le hash SHA1 de la concaténation du login avec un mot de passe.

Par exemple, si mon login est “admin” et que mon mot de passe est “P@ssw0rd” alors ma clé d’accès (AccessKey) sera a5761adf00e4060f05fab7017b32905cc9e5d540 (= le hash SHA1 de “adminP@ssw0rd”).

Les Authorizations

Par défaut un credential actif (enable=true) à le droit d’interroger (Request ou Subscribe) tous les StateObjects de votre Constellation sans restriction ou d’envoyer des messages à n’importe quel scope ou encore de s’abonner n’importe quel groupe.

Imaginez maintenant que vous réalisez une page Web en Javascript connectée à votre Constellation pour afficher les valeurs de quelques StateObjects en temps réel ou encore pour envoyer des messages pour contrôler certains dispositifs.

Dans le cas présent, si il s’agit d’une page JavaScript, le code est “client-side”, donc n’importe quelle personne ayant accès à cette page pourra visualiser le code source et récupérer l’AccessKey utilisée.

En clair si vous développez un petit morceau de Javscript pour afficher en temps réel la consommation de votre CPU (StateObject produit par le package HWMonitor par exemple) sur votre site Web, n’importe qui pourrait récupérer votre clé d’accès et suivre en temps réel le statut de votre alarme, votre courbe de poids, la température de votre chambre, le volume de votre ampli, etc… Ou pire encore, envoyer différents messages dans votre Constellation pour éteindre des machines, allumer des lumières, ouvrir la porte de garage, augmenter le chauffage, etc…

Un concept « d’autorisation” a été introduite dans la version 1.8 de Constellation pour restreindre les droits sur une clé d’accès (AccessKey) sur les éléments suivants :

  • L’interrogation des StateObjects
  • L’envoi de message (invocation des MessageCallback)
  • L’abonnement à des groupes de message

De ce fait, si vous souhaitez afficher par exemple la consommation de votre CPU de telle machine, vous allez créer un credential qui n’aura que le droit (autorisation) de visualiser ce StateObject ni plus ni moins.

Plus d’information, consultez l’article dédié à la configuration des autorisations.

La sécurité : AccessKey, Credential et Authorization
Editer la page sur GitHub
Étiqueté avec :            

Démarrez la discussion sur le forum Constellation