Une des problématiques que rencontre mon client lors de releases de son application principale est de s’assurer qu’aucun utilisateur ne soit connecté pendant la fenêtre de mise à jour de ces bases de données ceci afin de garantir qu’aucune perturbation ne soit créée pendant l’application de ces mises à jour. L’utilisation des points de terminaison ou ENDPOINT de SQL Server peut s’avérer bien utile dans ce cas.
Pour bien comprendre le problème voici tout d’abord la topologie réseau simplifiée de l’application et des serveurs mis en jeu. Cette application fonctionne sur une ferme de serveurs IIS et un serveur de bases de données SQL Server. Les données sont extraites et mises à jour depuis la ferme IIS mais aussi directement depuis d’autres serveurs ou postes du le réseau comme le montre l’image ci-dessous :
Â
Â
Pour SQL Server, un compte de connexion SQL et un utilisateur associé sont utilisés par l’application pour son fonctionnement normal. D’autres utilisateurs utilisant leur propre compte de connexion (Windows ou SQL) peuvent également se connecter à n’importe quel moment et depuis n’importe quel poste utilisateur directement sur la base de données pour des tâches de maintenance, de mise à jour ou de Reporting. Les programmes de mise à jour (scripts TSQL), quant à eux, utilisent le même compte de connexion SQL que celui de l’application.
En sachant tout cela, comment s’assurer qu’aucun utilisateur ne pourra se connecter pendant la période de mise à jour de l’application ? Plusieurs approches existent :
- Demander à l’éditeur de l’application qui fournit les scripts de mise à jour de changer le compte de connexion. Il ne resterait plus qu’à utiliser l’instruction DENY LOGIN sur tous les autres comptes de connexion. Cependant il est prudent de garder un compte de connexion administrateur pour d’éventuelles tâches de reprise de données après incident par exemple et dans ce cas rien ne garantit qu’aucune autre personne (administrateur) ne puisse se connecter au même moment.
- Demander à l’administrateur réseau de filtrer les IP en activant certaines règles sur le firewall. Dans ce cas, on réduit la surface d’attaque à un seul ordinateur du réseau, ce qui limiterait considérablement le risque de connexion d’autres utilisateurs mais on monopolise une ressource de plus avant et après la mise à jour de l’application.
- Utiliser les points de terminaisons ou ENDPOINT temporairement pour dévier les communications réseaux sur un autre port pendant la mise à jour. Cela ne nécessite aucune intervention humaine supplémentaire et l’utilisation des points de terminaison peut être tout à fait automatisée et encapsulée dans les scripts de mise à jour par exemple.Â
Qu’est ce qu’un point de terminaison ou ENDPOINT ?
Je ne rentrerais pas dans le détail car cela demanderait un article entier et ce n’est pas le but de mon post. J’en resterais donc à une explication simplifiée. Un point de terminaison est un point d’entrée dans SQL Server pour permettre la communication à travers le réseau. Ils sont implémentés en tant qu’objet de serveur et leur fonctionnement peut être assimilé à celui des pare-feu dans un contexte de sécurité.
Il s’agit donc ici d’empêcher toute utilisation du serveur lors de notre fenêtre de mise à jour. Pour cela nous allons utiliser les points de terminaison sur le protocole TCP pour empêcher toute communication avec le serveur SQL sur port 1433. Nous reporterons la communication sur le port 5000. Ce choix est tout à fait arbitraire. Il est possible de choisir un autre port.
La 1 étape consiste à configurer SQL Server pour qu’il soit à l’écoute du port 5000. Cette action est réalisée par le gestionnaire de configuration SQL Server dans la partie configuration du réseau et dans les propriétés du protocole TCP/IP. Il faut ajouter dans la section TCP Port le port 5000. Il faut redémarrer le service SQL Server pour que la modification soit prise en compte.
Â
La 2ème étape consiste à créer le point de terminaison en exécutant la requête suivante :
CREATE ENDPOINT [TSQL Release Program]
STATE = STOPPED
AS TCP
(
LISTENER_PORT = 5000,
LISTENER_IP = ALL
)
FOR TSQL();
Pour rappel, la configuration d’un point de terminaison s’effectue toujours pour un protocole et une charge utile. Dans notre cas on a donc paramétré le point de terminaison [TSQL Release Program] pour qu’il prenne en charge le protocole TCP et pour une utilisation TSQL. Celui-ci écoutera sur le port 5000 et ceci pour toutes les adresses IP. Notez l’état du point de terminaison à sa création. Pour le moment il sera arrêté. Il existe 3 états (démarré et en écoute, arrêté avec renvoi d’un message d’erreur en cas de tentative de connexion et désactivé sans qu’aucun message ne soit renvoyé).
Les vues système sys.endpoints et sys.tcp_endpoints permettent de visualiser les points de terminaison présents sur le serveur.
SELECT
   name,
   protocol_desc,
   type_desc,
   state_desc,
   port,
   ip_address
FROM sys.tcp_endpoints;
et son résultat :
name                                   protocol_desc   type_desc                    port     ip_address
——————————————————————————————-
Dedicated Admin Connection    TCP                 TSQL         STARTED     0        NULL
TSQL Default                        TCP                 TSQL         STARTED     0        NULL
TSQL Release Program            TCP                 TSQL         STOPPED     5000   NULL
Notre point de terminaison est ici bien présent et il est dans l’état STOPPED. On peut noter également qu’il existe 2 autres points de terminaison qui sont sont en fait des points de terminaison système : TSQL Default qui permet la communication à travers le réseau sur n’importe quel port et n’importe quelle adresse et Dedicated Admin Connection qui permet une connexion dédiée pour les administrateurs du serveur SQL (DAC).
Pendant la mise à jour il ne reste plus qu’à démarrer le point de terminaison TSQL Release Program et désactiver ou stopper le point de terminaison TSQL Default par l’instruction suivante:
– Point de terminaison système stoppé
ALTER ENDPOINT [TSQL Default TCP] STATE = STOPPED;
GO
– Point de terminaison pour la mise à jour démarré
ALTER ENDPOINT [TSQL Release Program] STATE = STARTED;
GO
Â
Â
Â
A présent la connexion à SQL Server n’est possible que par le port 5000 ce qui limite considérablement le risque de connexion par d’autres utilisateurs et notre mise à jour d’application peut s’effectuer sans problème. Pour tester ce changement de configuration on peut utiliser l’utilitaire sqlcmd de la façon suivante :
> sqlcmd -U application -P password -S srv-sql,5000
Une fois la mise à jour effectuée, la dernière étape consistera à supprimer le point de terminaison dédié à notre mise à jour et à démarrer le point de terminaison système TSQL Default TCP
– Suppresion du point de terminaison dédié à la mise à jour
DROP ENDPOINT [TSQL Release Program];
GO
– Démarrage du point de terminaison système
ALTER ENDPOINT [TSQL Default TCP] STATE = STARTED;
GO
Bien évidement, il restera à tester si la communication se fait correctement entre SQL Server et l’ensemble des autres éléments du réseau !!!
David BARBARIN (Mikedavem)
Elève ingénieur CNAM Lyon