Modification du port de SQL Server 2019 sur Linux et utilisation des alias SQL Server sur les machines clientes

Introduction

Quand SQL Server est installé dans une zone WAN/DMZ en utilisant son port par défaut 1433, les règles de parefeu étant ouvertes sur ce port pour les connexions entrantes, rapidement des messages d'erreur étranges apparaissent dans le fichier de log de SQL Server :

errorlog
2019-06-01 11:03:58.18 Logon       Login failed for user 'usera'. Reason: Could not find a login matching the name provided. [CLIENT: 61.173.166.212]
2019-06-01 12:48:31.32 Logon       Login failed for user 'sa'. Reason: Password did not match that for the login provided. [CLIENT: 185.234.219.85]
2019-06-01 12:48:34.47 Logon       Login failed for user 'Mssqla'. Reason: Could not find a login matching the name provided. [CLIENT: 185.234.219.85]
2019-06-01 12:48:41.08 Logon       Login failed for user 'dbhelp'. Reason: Could not find a login matching the name provided. [CLIENT: 185.234.219.85]

En vérifiant quelques IP avec la commande tracert, un voyage vous est offert autour du monde, et plus particulièrement en Chine.

C:\> tracert 185.234.219.85

 ...
  7    13 ms    17 ms    15 ms  chinatelecom-1.gw.opentransit.net [81.52.179.174]
 ...
 13    34 ms    35 ms    42 ms  ZMRBK-569C1D561 [185.234.219.85]

C'est un comportement "normal", les robots connaissent bien le port 1433 dans leurs algorithmes. Voyons comment changer le port de SQL Server 2019 installé sur Linux Ubuntu avec l'utilitaire mssql-conf et les conséquences pour les clients. Dans cet article le port est modifié de 1433 à 35027. Un port atypique doit être choisi.

Architecture Linux SQL Server 2019

Avant de changer le port du serveur trop rapidement, penser aux machines clientes impactées, les traitements seront en échec sans aucune action.

Le déploiement (automatisé) d'alias SQL Server sur les machines clientes lors du changement du port du serveur réduit considérablement les impacts négatifs. Les alias SQL Server sont abordés à la fin de cet article.

Modification du port avec mssql-conf

Lancer l'utilitaire mssql-conf pour modifier le port de SQL Server :

mssql@vps$ /opt/mssql/bin/mssql-conf set network.tcpport 35027

Bien sûr, ce paramètre est statique, le service SQL Server doit être redémarré :

mssql@vps$ systemctl restart mssql-server

Créér une règle parefeu pour ouvrir le nouveau port 35027 de SQL Server. Pour le parefeu intégré d'Ubuntu (ufw - Uncomplicated Firewall), en tant que root :

root@vps$ ufw allow 35027/tcp comment 'Microsoft SQL Server'
          
root@vps$ ufw reload
          
root@vps$ ufw status numbered
          
Status: active

     To                Action      From
     --                ------      ----
...
[ 2] 1433              ALLOW IN    Anywhere
[ 3] 35027/tcp         ALLOW IN    Anywhere          # Microsoft SQL Server
...
[ 5] 1433 (v6)         ALLOW IN    Anywhere (v6)
[ 6] 35027/tcp (v6)    ALLOW IN    Anywhere (v6)     # Microsoft SQL Server

Supprimer les anciennes règles de parefeu pour le port 1433 :

root@vps$ ufw delete 5
root@vps$ ufw delete 2

Pour vérifier que tout est OK, lancer sqlcmd avec l'option -S "server or ip,port" depuis le serveur et depuis un ordinateur distant :

mssql@vps$ sqlcmd -Usa -S "localhost,35027"
C:\> sqlcmd -Usa -S "vps,35027"

Pour l'utilitaire bcp, même syntaxe :

C:\> bcp master..sysobjects out sysobjects.bcpc -Usa -S "vps,35027"

Pour SQL Server Management Studio 2018, idem, ajouter le port après le nom ou l'IP du serveur dans le champ Server name.

Connexion SQL Server Management Studio

Simplifier les connexions clientes avec les alias SQL Server

Parfait, le port est modifié et le moteur SQL Server est mieux protégé des attaques et robots, mais bien sûr le nouveau port ne sera pas codé en dur dans tous les programmes clients (sqlcmd, bcp, ADO.NET...). Si le port est modifié, chaque programme client est impacté.

Malheureusement, les numéros de port ne peuvent pas être spécifiés dans les alias DNS ou dans les entrées des fichiers hosts. Les alias SQL Server résolvent ce problème.

En pré-requis, SQL Server native client est installé sur toutes les machines clientes. Au lieu d'utiliser la nomenclature <hostname,port>, tous les clients utiliseront désormais l'alias SQL Server vps, alias qui pointe vers le serveur vps, port 35027. Par défaut l'existence d'un alias SQL Server est d'abord vérifié par le client SQL Server, aussi le nom de l'alias peut être le même que le nom du serveur : ceci réduira considérablement les régressions côté clients.

L'alias est créé de 2 manières possibles :

  • Avec l'interface graphique de l'outil SQL Server Configuration Manager.
  • Avec des scripts modifiant la base de registres Windows.

SQL Server Configuration Manager

Ouvrir Microsoft Management Console (mmc.exe). Si le composant SQL Server Configuration Manager n'est pas présent, dans le menu, sélectionner Fichier Ajouter/Supprimer un compostant logiciel enfichable..., puis ajouter SQL Server Configuration Manager :

Ajout de SQL Server Configuration Manager dans MMC

Pour créér l'alias, clic droit sur Aliases dans le menu SQL Native Client 11.0 Configuration 32 bitsNew Alias...

SQL Server Configuration Manager MMC - New Alias

Renseigner le nom de l'alias, le nom du serveur et le port.

SQL Server Configuration Manager MMC - Propriétés Alias

Répéter les étapes précédentes pour la version 64 bits : SQL Native Client 11.0 ConfigurationNew Alias....

C'est fini, le client peut maintenant utiliser l'alias (sqlcmd, SSMS...)

C:\> sqlcmd -Usa -Svps 

Scripts

Toutes les actions effectuées précédemment à travers l'interface graphique sont écrites dans les clés ci-dessous de la base de registres Windows :

32 bits : HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSSQLServer\Client\ConnectTo

64 bits : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo

Base de registres Windows - Alias SQL Server

Évidemment, un script (powershell ou regedit) peut gérer la création de l'alias dans la base de registres, par exemple en PowerShell :

New-Item -Path "HKLM:\Software\Microsoft\MSSQLServer\Client\" -Name ConnectTo -Force -ErrorAction Stop | Out-Null
New-Item -Path "HKLM:\Software\Wow6432Node\Microsoft\MSSQLServer\Client\" -Name ConnectTo -Force -ErrorAction Stop  | Out-Null
 
$Alias      = "vps";
$ServerName = "vps";
$dbPort     = "35027";
$TCPAlias   = "DBMSSOCN," + $ServerName + "," + $dbPort

New-ItemProperty -Path "HKLM:\Software\Microsoft\MSSQLServer\Client\ConnectTo\" -Name $Alias -PropertyType String -Value $TCPAlias -ErrorAction Stop | Out-Null
New-ItemProperty -Path "HKLM:\Software\Wow6432Node\Microsoft\MSSQLServer\Client\ConnectTo\" -Name $Alias -PropertyType String -Value $TCPAlias -ErrorAction Stop | Out-Null

Ce type de script est utilisable dans tout outil de déploiement pour facilement mettre à jour les configurations des machines clientes.

Conclusion

Le déploiement des alias SQL Server sur les machines clientes, si possible en automatique, est une très bonne solution quand vous décidez de changer le port du serveur SQL Server pour ne plus utiliser le 1433, modification recommandée pour un SQL Server dans une zone WAN/DMZ, plus vulnérable aux attaques et robots.