Executer en non-root

Chaque composant Mugnsoft peut s’executer comme service Linux sous son propre compte plutot qu’en root. C’est optionnel : sans RunUser, un composant s’execute en root comme avant.

Besoins de chaque composant

Tous les ports par defaut sont au-dessus de 1024 : aucun n’exige de privilege pour ecouter. L’unite du service accorde exactement les capacites ci-dessous et retire toutes les autres.

Composant Capacites Utilisation
Webserver, Webserver-Front aucune —
Integrator aucune —
Sonde monitor CAP_NET_RAW Moniteurs Ping et MTR, qui ouvrent des sockets ICMP bruts
Sentinel Agent CAP_NET_RAW Capture de paquets : bande passante et detection de protocole
CAP_SYS_PTRACE, CAP_DAC_READ_SEARCH Rattacher les sockets et les E/S disque aux processus d’autres utilisateurs (/proc/<pid>/fd, /proc/<pid>/io), et surveiller les fichiers journaux illisibles par le compte

Un port inferieur a 1024 dans le .json du composant ajoute automatiquement CAP_NET_BIND_SERVICE.

Le compte possede le dossier du composant, ou tout est ecrit : configuration, cles, bases, journaux, exports et webdrivers telecharges. L’hote Linux doit disposer de systemd 229 ou plus (RHEL 8, Debian 9, Ubuntu 16.04 et suivants) ; sur un systeme d’init plus ancien, les capacites ne sont pas appliquees.

Les capacites du Sentinel meritent un examen

CAP_SYS_PTRACE et CAP_DAC_READ_SEARCH sont puissantes : elles permettent a l’agent de lire les details des processus d’autres utilisateurs et tout fichier de l’hote. La decouverte des processus repose sur elles. Si vous n’avez pas besoin de la topologie entre utilisateurs, retirez-les comme indique dans Modifier les droits d’un service : les processus des autres utilisateurs apparaissent alors sans nom.

Nouvelle installation

Installez sous /opt/mugnsoft : le compte doit pouvoir atteindre le programme, ce qu’un dossier personnel prive comme /home/<vous> empeche en general.

Avec le script d’installation, ajoutez --run-as. Le compte est cree s’il n’existe pas :


bash mugnsoft-install.sh monitor --webserver 10.0.0.5:8050 --shared-internal 3f9c...e1 --run-as mugnsoft

Depuis un paquet extrait, en root :


cd /opt/mugnsoft/monitor                  # ou webserver, integrator, discovery_agent, webserver-front
./install.sh --run-as mugnsoft 10.0.0.5:8050
./monitor start

Ou avec votre propre compte, defini dans le .json du composant :


useradd --system --user-group --home-dir /opt/mugnsoft/monitor --no-create-home --shell /usr/sbin/nologin mugnsoft
sed -i 's/"RunUser": ""/"RunUser": "mugnsoft"/' monitor.json
./monitor install 10.0.0.5:8050 && ./monitor start

install doit toujours s’executer en root, car il cree le service. Il verifie que le compte existe, lui donne le dossier et restreint le fichier .json (il contient _sharedInternal) au mode 600. Les commandes qui ecrivent des fichiers en root (register, migrate, repair-records, run) les rendent au compte a la fin.

Migrer une installation existante

N’utilisez pas uninstall pour cela : il supprime la configuration et les bases du composant. Modifiez le service sur place, ici pour une sonde monitor :


cd /opt/mugnsoft/monitor
systemctl stop MugnsoftMonitor
id mugnsoft || useradd --system --user-group --home-dir "$PWD" --no-create-home --shell /usr/sbin/nologin mugnsoft
grep -q '"RunUser"' monitor.json && sed -i 's/"RunUser": *"[^"]*"/"RunUser": "mugnsoft"/' monitor.json \
  || sed -i '0,/{/s//{\n    "RunUser": "mugnsoft",/' monitor.json
chown -R mugnsoft: . && chmod 600 monitor.json
mkdir -p /etc/systemd/system/MugnsoftMonitor.service.d
cat > /etc/systemd/system/MugnsoftMonitor.service.d/10-run-as.conf <<'EOF'
[Service]
User=mugnsoft
NoNewPrivileges=true
CapabilityBoundingSet=CAP_NET_RAW
AmbientCapabilities=CAP_NET_RAW
EOF
systemctl daemon-reload
systemctl start MugnsoftMonitor

Pour un autre composant, remplacez les noms et reprenez sa ligne du tableau ci-dessus. Sans capacite, ecrivez CapabilityBoundingSet= et omettez AmbientCapabilities.

Verifier


systemctl status MugnsoftMonitor
ps -o user,comm -C monitor                # la colonne user affiche mugnsoft
grep Cap /proc/$(pidof monitor)/status    # CapEff 0000000000002000 correspond a CAP_NET_RAW
find /opt/mugnsoft/monitor ! -user mugnsoft   # n'affiche rien

Executer au premier plan

Pour diagnostiquer, arretez le service et lancez le programme sous le compte :


systemctl stop MugnsoftMonitor
sudo -u mugnsoft ./monitor run

Les capacites du service ne s’appliquent pas ici. Si les moniteurs ping ou la capture de paquets doivent fonctionner dans ce mode, accordez-les au programme avec setcap cap_net_raw+ep ./monitor. Le remplacement du programme les efface : reappliquez apres une mise a jour.

Modifier les droits d’un service

Ajoutez un fichier complementaire (drop-in) plutot que d’editer l’unite : il survit a une reinstallation. Chaque exemple est un cas ; un service n’a besoin que des lignes de ce que vous utilisez. systemctl edit MugnsoftMonitor ouvre le bon fichier :


[Service]
# Moniteurs de conteneurs joignant le socket Docker local
SupplementaryGroups=docker

# Scripts d'action appelant sudo : retire les limites qu'ils rencontreraient
NoNewPrivileges=false
CapabilityBoundingSet=~

# Sentinel Agent limite a la capture de paquets
CapabilityBoundingSet=
CapabilityBoundingSet=CAP_NET_RAW
AmbientCapabilities=
AmbientCapabilities=CAP_NET_RAW

A savoir sur le compte :

  • Vos scripts s’executent aussi sous ce compte. Les actions et les moniteurs de script heritent de ses droits, y compris les capacites ci-dessus. sudo est refuse par defaut, a cause de NoNewPrivileges.
  • Fichiers hors du dossier : donnez au compte l’acces en lecture a ce que ses moniteurs lisent, comme une cle privee pour un moniteur SSH ou un journal que le Sentinel Agent n’atteint pas. Une cle SSH doit appartenir a ce compte.
  • Parcours EUM et rapports PDF demarrent un navigateur. Son profil va dans le dossier personnel du compte, qui est le dossier du composant lorsque install.sh a cree le compte. Le bac a sable de Chrome reste actif pour un compte non root, alors que root exige --no-sandbox : sur un hote qui bloque les espaces de noms utilisateur non privilegies (certains profils AppArmor), autorisez-les pour le navigateur.

Windows et conteneurs

Sous Windows, les services s’executent en LocalSystem. RunUser ne s’applique pas : un compte personnalise n’est pas une configuration prise en charge dans cette version.

Les images Docker et le chart Helm de la sonde monitor s’executent deja sous un compte non privilegie : voir Installer sur Kubernetes.

Depannage

Symptome Cause et solution
RunUser "x" does not exist a install Creez le compte (le message donne la commande), ou utilisez install.sh --run-as
status=203/EXEC dans systemctl status ; install a signale que le compte ne peut pas entrer dans un dossier Un dossier parent est ferme au compte, en general un dossier personnel. Deplacez le composant vers /opt/mugnsoft, puis faites chown -R
Le service demarre puis s’arrete ; permission denied dans journalctl -u <service> Fichiers crees en root. chown -R <compte>: <dossier>. Avec RunUser, register conserve les proprietaires : ce cas suit surtout une copie manuelle
Les moniteurs Ping ou MTR echouent avec operation not permitted Pas de CAP_NET_RAW : verifiez grep Cap /proc/<pid>/status, et que l’unite ou un drop-in l’accorde
La bande passante reste a 0 sur un Sentinel Agent Voir Capture de paquets
Les processus d’autres utilisateurs n’ont pas de nom sur un Sentinel Agent CAP_SYS_PTRACE ou CAP_DAC_READ_SEARCH a ete retiree
Un port inferieur a 1024 est refuse apres modification L’unite a ete generee pour l’ancien port. Ajoutez AmbientCapabilities=CAP_NET_BIND_SERVICE et la meme valeur dans CapabilityBoundingSet= avec un drop-in

Voir aussi

Traductions