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-server
comme un service utilisateur avec le comptemssql
. - Donner les droits avec aucun mot de passe sur le service système
mssql-server
au usermssql
viasudo
.
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é.