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.
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
.
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 :
Pour créér l’alias, clic droit sur Aliases dans le menu SQL Native Client 11.0 Configuration 32 bitsNew Alias…
Renseigner le nom de l’alias, le nom du serveur et le port.
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
É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.