Introduction
SQL Server 2019 est installé sur une plateforme Ubuntu 18.04. Dans l’architecture par défaut, SQL Server 2019 tourne avec le compte
mssql.
Avec le compte mssql, le statut du service mssql-server est facilement obtenu :
mssql@vps$ systemctl status mssql-server● mssql-server.service - Microsoft SQL Server Database Engine Loaded: loaded (/lib/systemd/system/mssql-server.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2019-05-31 11:20:09 CEST; 36min ago Docs: https://docs.microsoft.com/en-us/sql/linux Main PID: 1448 (sqlservr) Tasks: 182 CGroup: /system.slice/mssql-server.service ├─1448 /opt/mssql/bin/sqlservr └─1460 /opt/mssql/bin/sqlservr
Mais en essayant de stopper/démarrer/redémarrer le service mssql-server avec systemctl, le mot de passe est demandé.
mssql@vps$ systemctl stop mssql-server==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units === Authentication is required to stop 'mssql-server.service'. Multiple identities can be used for authentication: 1. Ubuntu (ubuntu) 2. mssql Choose identity to authenticate as (1-2):
mssql@vps$ sudo systemctl stop mssql-server[sudo] password for mssql:
On préfèrerait autoriser mssql à gérer son propre service sans ces saisies du mot de passe.
2 solutions sont possibles :
- Définir
mssql-servercomme un service utilisateur avec le comptemssql. - Donner les droits avec aucun mot de passe sur le service système
mssql-serverau usermssqlviasudo.
Solution 1 : Définir mssql-server comme un service utilisateur avec le compte mssql
Par défaut le service système mssql-server est défini dans le fichier /lib/systemd/system/mssql-server.service.
Il s’agit d’une configuration classique d’un service.
/lib/systemd/system/mssql-server.service
[Unit]
Description=Microsoft SQL Server Database Engine
After=network.target auditd.service
Documentation=https://docs.microsoft.com/en-us/sql/linux
[Service]
ExecStart=/opt/mssql/bin/sqlservr
User=mssql
WorkingDirectory=/var/opt/mssql
# Kill root process
KillMode=process
# Wait up to 30 minutes for service to start/stop
TimeoutSec=30min
# Remove process, file, thread limits
#
LimitNPROC=infinity
LimitNOFILE=infinity
TasksMax=infinity
UMask=007
# Restart on non-successful exits.
Restart=on-failure
# Don't restart if we've restarted more than 3 times in 2 minutes.
StartLimitInterval=120
StartLimitBurst=3
[Install]
WantedBy=multi-user.target
Au lieu d’utiliser un service système, une bascule vers un service utilisateur mssql est réalisée.
Le service système mssql-server est d’abord arrêté et désactivé en tant que root :
root@vps$ systemctl stop mssql-server
root@vps$ systemctl disable mssql-server
root@vps$ systemctl daemon-reload
En tant que mssql, le fichier /lib/systemd/system/mssql-server.service est copié dans le répertoire $HOME/.config/systemd/user (répertoire des services du user mssql).
mssql@vps$ mkdir -p $HOME/.config/systemd/user
mssql@vps$ cp /lib/systemd/system/mssql-server.service $HOME/.config/systemd/user
Dans ce fichier copié, 2 modifications à faire :
$HOME/.config/systemd/user/mssql-server.service
...
[Service]
# User=mssql
...
...
[Install]
WantedBy=default.target
La directive User=mssql est commentée, si ce n’est pas le cas un message d’erreur est levé à propos du groupe lors du fork.
Process: 1904 ExecStart=/opt/mssql/bin/sqlservr (code=exited, status=216/GROUP)
Main PID: 1904 (code=exited, status=216/GROUP)
Si le service utilisateur doit démarrer au boot de la machine, la directive WantedBy doit être à default.target et non
multi-user.target, cette dernière n’est en effet appliquable que pour un service système au boot.
À cette étape, le service utilisateur peut déjà être géré par mssql, sans mot de passe demandé, systemctl est invoqué avec
l’option --user :
mssql@vps$ systemctl --user daemon-reload mssql@vps$ systemctl --user status mssql-server● mssql-server.service - Microsoft SQL Server Database Engine Loaded: loaded (/home/mssql/.config/systemd/user/mssql-server.service; disabled; vendor preset: enabled) Active: inactive (dead)
mssql@vps$ systemctl --user start|stop|restart mssql-server
Dernière étape, activer le service utilisateur mssql-server au (re)démarrage de la machine :
mssql@vps$ systemctl --user enable mssql-server
Ne pas oublier d’autoriser le user mssql à exécuter des services en mode non connecté, pour cela, en tant que root :
root@vps$ loginctl enable-linger mssql
Solution 2 : Donner les droits avec aucun mot de passe sur le service système mssql-server au user mssql via sudo.
Si on souhaite conserver le service mssql-server comme un service système, éditer le fichier /etc/sudoers avec
visudo.
root@vps$ visudo
et ajouter les autorisations ci-dessous pour le user mssql dans ce fichier :
Cmnd_Alias MSSQL_CMDS = /bin/systemctl start mssql-server, /bin/systemctl stop mssql-server
mssql ALL=(root) NOPASSWD: MSSQL_CMDS
Utiliser le chemin complet /bin/systemctl, c’est recommandé pour le fichier sudoers.
Le compte mssql peut maintenant gérer le service système mssql-server sans être invité à saisir le mot de passe :
mssql@vps$ sudo systemctl start|stop mssql-server
Conclusion
Pour gérer le service mssql-server avec le compte mssql, 2 solutions faciles. Cela dépend
essentiellement de la méthode préférée ou des contraintes entreprise et sécurité.