[Systemd] Droits sur certains services uniquement (Résolu)

Questions et astuces concernant l'installation et la configuration d'archlinux
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

[Systemd] Droits sur certains services uniquement (Résolu)

Message par Cafeinoman »

Bonjour,

je voudrais savoir s'il est possible de donner aux utilisateurs ou groupes des droits sur la gestion de certains services uniquement sans passer par sudo.

Merci.
Dernière modification par Cafeinoman le dim. 22 juin 2014, 15:35, modifié 1 fois.
Moviuro
Elfe
Messages : 765
Inscription : dim. 17 juin 2012, 22:49

Re: [Systemd] Droits sur certains services uniquement

Message par Moviuro »

Plop,

Je ne pense pas que ça soit possible sans prendre d'énormes risques.
Par contre, si tu lis bien le man de sudo, tu verras qu'il est possible de gérer très très finement les actions autorisées.

Et sinon, ce que tu pourrais faire (mais c'est super dangereux), c'est créer un <user>.target et un dossier<user>.target.wants en 755 pour <user>. Ensuite, les user peuvent poser leurs services dans ce dossier .wants. Je répète, c'est ultra dangereux.

Bon courage
psycho : Latitude E6430 ; BTRFS over LUKS, UEFI & secureboot
schizo : Acer 8942G ; KDE 4, BTRFS over LUKS ; W7 (prend la poussière)
toxo : i5-6600K, bspwm, VM W10 en PCI-passthrough
deadman : Lenovo Thinkcenter, OpenBSD 6.0-stable
popho.be : Kimsufi KS-3, FreeBSD 11.0
Loi de Murphy : Le jour où tu as besoin d'une backup, tu te dis que tu aurais dû en mettre en place
Venez sur IRC en plus du forum !
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement

Message par Cafeinoman »

Ok, merci. Le but que ce soit l'administrateur qui donne les accès, donc je vais plutôt de sudo...
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement

Message par Cafeinoman »

Le problème avec sudo c'est que je ne vois pas de moyen de démarrer des services de systemd. Par contre je suis tombé la-dessus. Cette méthode pose-t-elle des problèmes de sécurité?
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17580
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Systemd] Droits sur certains services uniquement

Message par benjarobin »

Cafeinoman a écrit :Cette méthode pose-t-elle des problèmes de sécurité?
Tout dépend comment est écrit le code C et quels services sont concernés... Bref si les choses sont bien faites il n'y a pas de souci.
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement

Message par Cafeinoman »

Pour l'instant, c'est surtout pour le lancement et l'arrêt de serveurs (tomcat et wildfly), donc tant que ça ne concerne pas les machines de prod, rien de critique. Pour le code C, il est simplissime, un appel système pour lancer un script qui fait systemctl start ou stop sur le service, donc je ne vois pas où peut être le problème de sécurité...
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement

Message par Cafeinoman »

Solution adoptée pour l'instant :

/root/Scripts/TomcatStart.sh (root:root 700)

Code : Tout sélectionner

#!/bin/bash

if systemctl | grep tomcat > /dev/null
then
close_tomcat=$(zenity --entry --text="Tomcat en fonctionnement. Eteindre le serveur (o/N)")
	if [ "$close_tomcat"=="o" ]
	then
		systemctl stop tomcat8
		exit
	fi
firefox skynet:8080
else
systemctl start tomcat8
sleep 2
firefox skynet:8080
fi
exit
lanceur C (root:root 705)

Code : Tout sélectionner

#include <unistd.h>

int main()
{
	setuid(0);
	system("/root/Scripts/TomcatStart.sh");

	return 0;
}
Si vous voyez un problème n'hésitez pas!
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17580
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par benjarobin »

Tu es conscient que tu lances firefox en root ?
De plus question sécurité c'est assez moyen... Faire confiance au contenu d'un script j'aime pas trop...
Le processus est lancé avec des droits un peu bizarre, à moitié root et à moitié utilisateur : root:users au lieu de root:root

Pour vérifier que tomcat est bien lancé, je ferais plutôt quelque chose comme ceci :

Code : Tout sélectionner

systemctl show --property=ActiveState tomcat8
Bref je verrais bien ce script lancé avec l'utilisateur :

Code : Tout sélectionner

#!/bin/bash

if systemctl show --property=ActiveState tomcat8.service | grep -q active ; then

    close_tomcat=$(zenity --entry --text="Tomcat en fonctionnement. Eteindre le serveur (o/N)")
    if [ "$close_tomcat"=="o" ] ; then
        #systemctl stop tomcat8
        /root/Scripts/controlTomcat 0
    else
        firefox skynet:8080
    fi
else
    #systemctl start tomcat8
    /root/Scripts/controlTomcat 1
    sleep 2
    firefox skynet:8080
fi
Et tu écrit le code C pour

Code : Tout sélectionner

/root/Scripts/controlTomcat

Code : Tout sélectionner

#include <unistd.h>
#include <stdio.h>
#include <string.h>

#define APP_UID  0
#define APP_GID  0

int main(int argc, char *argv[])
{
    int r = 2;

    if (argc != 2) {
        return 2;
    }

    if (setgid(APP_GID) != 0)
    {
        perror("Fail to setgid");
        return 3;
    }
    if (setuid(APP_UID) != 0)
    {
        perror("Fail to setuid");
        return 4;
    }

    if (strcmp(argv[1], "0") == 0)
    {
        r = execl("/usr/bin/systemctl", "systemctl", "stop", "tomcat8.service", NULL);
    }
    else if (strcmp(argv[1], "1") == 0)
    {
        r = execl("/usr/bin/systemctl", "systemctl", "start", "tomcat8.service", NULL);
    }
    return r;
}
Le compiler :

Code : Tout sélectionner

gcc -std=c89 -Wall -Wextra -O2 t.c -o controlTomcat
Lui donner les droits root:

Code : Tout sélectionner

# chown root:root controlTomcat
# chmod ug+s controlTomcat
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par Cafeinoman »

Effectivement, pas très malin de lancer Firefox comme ça :oops:

Par contre je suis grand débutant en C, tu peux m'expliquer un peu le début du code? Ainsi que les arguments du compilateur...?

Merci en tout cas!

EDIT : après un essai, cela ne fonctionne pas... j'ai mis le script en root:user 750, l'erreur vient-elle de là?
Dernière modification par Cafeinoman le dim. 22 juin 2014, 18:33, modifié 1 fois.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17580
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par benjarobin »

:rtfm: :copain:
Désolé mais je suis relativement sérieux. Il y a un manuel qui explique ce que fait chaque fonction. Pas besoin de connaitre le C.

Mais en gros on vérifie que l'on a passé un argument.
On applique setgid et setuid pour que tous les processus lancés depuis ce programme soit lancés avec les droits de APP_GID (0) et APP_UID (0), soit root:root
Et enfin en fonction de la valeur de l'unique argument passé on arrête ou on démarre le service.

Pour le compilateur : https://gcc.gnu.org/onlinedocs/gcc-4.9. ... tion-Index
Mais en gros :
  • -std=c89 : Définit le langage utilisé, on code en C89, un peu inutile dans ce cas là...
  • -Wall -Wextra : Active des warning de compilation
  • -O2 : Permet une optimisation correct du code
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
waitnsea
Maître du Kyudo
Messages : 2114
Inscription : jeu. 15 mars 2012, 05:08

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par waitnsea »

Y aurait-il des moyens plus sûrs avec les capabilities ? Voir ICI
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17580
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par benjarobin »

C'est peut être possible, mais il est vrai que je ne me suis jamais intéressé aux capabilities nécessaire pour utiliser systemctl, si c'est faisable.
En tout cas ce que je t'ai écrit est pas mal sécurisé.
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par Cafeinoman »

benjarobin a écrit ::rtfm: :copain:
Ok, j'oublie la fénaiantise :wink: . Par j'ai un soucis sur les droits : le script ne peux par lancer le binaire C, la permission est refusé... sachant qu'il est passé en root:root 705. Une erreur de ma part?
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17580
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par benjarobin »

Surement... Il te faut faire dans cet ordre :

Code : Tout sélectionner

chown root:root controlTomcat
chmod 555 controlTomcat
chmod ug+s controlTomcat

# Ou

chown root:root controlTomcat
chmod 6555 controlTomcat
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par Cafeinoman »

pour le script

Code : Tout sélectionner

chown root:root tomcat.sh
chmod 755 tomcat.sh
pour le binaire

Code : Tout sélectionner

chown root:root controlTomcat
chmod 6555 controlTomcat
Et toujours erreur ligne 8 du script à l'appel du binaire...
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17580
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par benjarobin »

Quel erreur ? Quel code d'erreur ? Arrives tu as lancer controlTomcat depuis une console en utilisateur ? Est ce que cela fonctionne correctement ?
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par Cafeinoman »

Code : Tout sélectionner

[francois@skynet Script]$ ./tomcat.sh 
./tomcat.sh: ligne 8: /root/Scripts/controlTomcat: Permission non accordée
Pareil en lancant directement /root/Scripts/controlTomcat. En root aucun soucis.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17580
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par benjarobin »

J'ai testé une 2ième fois, aucun souci ici... Bon on va tout reprendre...
Quel est la sortie de

Code : Tout sélectionner

mount
stat /root/Scripts/controlTomcat
ls -l /root/Scripts/controlTomcat
LC_ALL=C /root/Scripts/controlTomcat 0; echo $?
Euh, j'ai un doute je crois que c'est un peu normal que cela ne marche pas... Ton utilisateur ne peux pas aller dans /root/Scripts/. Tu peux essayer de faire un ls -l /root/Scripts/ cela ne marchera pas.
Tu dois placer impérativement controlTomcat dans un chemin accessible par l'utilisateur...
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Cafeinoman
Hankyu
Messages : 30
Inscription : dim. 28 avr. 2013, 16:34

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par Cafeinoman »

Code : Tout sélectionner

[francois@skynet ~]$ mount
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sys on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
dev on /dev type devtmpfs (rw,nosuid,relatime,size=4044632k,nr_inodes=1011158,mode=755)
run on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)
/dev/mapper/arch_vg-root_lv on / type ext4 (rw,relatime,data=ordered)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=22,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
tmpfs on /tmp type tmpfs (rw)
/dev/sdb2 on /boot type ext2 (rw,relatime)
/dev/mapper/arch_vg-home_lv on /home type ext4 (rw,relatime,data=ordered)
/dev/mapper/arch_vg-var_lv on /var type ext4 (rw,relatime,data=ordered)
/dev/mapper/arch_vg-shared_lv on /home/shared type ext4 (rw,relatime,data=ordered)
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=809584k,mode=700,uid=1000,gid=100)
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=100)
gvfsd-fuse on /root/.gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0)

Code : Tout sélectionner

[francois@skynet ~]$ stat /root/Scripts/controlTomcat
stat: impossible d'évaluer « /root/Scripts/controlTomcat »: Permission non accordée
[francois@skynet ~]$ sudo stat /root/Scripts/controlTomcat
[sudo] password for root: 
  Fichier : « /root/Scripts/controlTomcat »
   Taille : 7387      	Blocs : 16         Blocs d'E/S : 4096   fichier
Périphérique : fe00h/65024d	Inœud : 1057028     Liens : 1
Accès : (6555/-r-sr-sr-x)  UID : (    0/    root)   GID : (    0/    root)
 Accès : 2014-06-22 19:08:04.706562484 +0000
Modif. : 2014-06-22 15:56:37.274914219 +0000
Changt : 2014-06-22 18:27:08.195566660 +0000
  Créé : -

Code : Tout sélectionner

[francois@skynet ~]$ ls -l /root/Scripts/controlTomcat
ls: impossible d'accéder à /root/Scripts/controlTomcat: Permission non accordée
[francois@skynet ~]$ sudo ls -l /root/Scripts/controlTomcat
-r-sr-sr-x 1 root root 7387 22 juin  15:56 /root/Scripts/controlTomcat

Code : Tout sélectionner

[francois@skynet ~]$ LC_ALL=C /root/Scripts/controlTomcat 0
bash: /root/Scripts/controlTomcat: Permission non accordée
[francois@skynet ~]$ sudo LC_ALL=C /root/Scripts/controlTomcat 0
[francois@skynet ~]$ systemctl status tomcat8
● tomcat8.service - Tomcat 8 servlet container
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled)
   Active: inactive (dead)
[francois@skynet ~]$ sudo LC_ALL=C /root/Scripts/controlTomcat 1
[francois@skynet ~]$ systemctl status tomcat8
● tomcat8.service - Tomcat 8 servlet container
   Loaded: loaded (/usr/lib/systemd/system/tomcat8.service; disabled)
   Active: active (running) since dim. 2014-06-22 19:39:59 UTC; 2s ago
  Process: 13061 ExecStart=/usr/bin/jsvc -Dcatalina.home=${CATALINA_HOME} -Dcatalina.base=${CATALINA_BASE} -Djava.io.tmpdir=/var/tmp/tomcat8/temp -cp /usr/share/java/commons-daemon.jar:/usr/share/java/eclipse-ecj.jar:${CATALINA_HOME}/bin/bootstrap.jar:${CATALINA_HOME}/bin/tomcat-juli.jar -user tomcat8 -java-home ${TOMCAT_JAVA_HOME} -pidfile /var/run/tomcat8.pid -errfile SYSLOG -outfile SYSLOG $CATALINA_OPTS org.apache.catalina.startup.Bootstrap (code=exited, status=0/SUCCESS)
 Main PID: 13066 (jsvc)
   CGroup: /system.slice/tomcat8.service
           ├─13064 jsvc.exec -Dcatalina.home=/usr/share/tomcat8 -Dcatalina.base=/usr/share/tomcat8 -Djava.io.tmpdir=/var/tmp/tomcat8/temp -cp /usr/share/ja...
           ├─13065 jsvc.exec -Dcatalina.home=/usr/share/tomcat8 -Dcatalina.base=/usr/share/tomcat8 -Djava.io.tmpdir=/var/tmp/tomcat8/temp -cp /usr/share/ja...
           └─13066 jsvc.exec -Dcatalina.home=/usr/share/tomcat8 -Dcatalina.base=/usr/share/tomcat8 -Djava.io.tmpdir=/var/tmp/tomcat8/temp -cp /usr/share/ja...
C'est grave docteur? :wink:
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17580
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Systemd] Droits sur certains services uniquement (Résol

Message par benjarobin »

Cafeinoman a écrit :C'est grave docteur? :wink:
C'est tellement évident que je ne pensais pas que tu aurais fait une telle chose... Et moi je n'ai pas réfléchi, je n'ai jamais fait mes tests dans /root, cela ne peut pas marcher. Uniquement root peut accéder à /root.
Depuis le début tu m'as laissé pensé que tomcat.sh était dans le même dossier que controlTomcat
Euh, j'ai un doute je crois que c'est un peu normal que cela ne marche pas... Ton utilisateur ne peux pas aller dans /root/Scripts/. Tu peux essayer de faire un ls -l /root/Scripts/ cela ne marchera pas.
Tu dois placer impérativement controlTomcat dans un chemin accessible par l'utilisateur...
Tu dois placer controlTomcat par exemple dans le même dossier que ./tomcat.sh
Zsh | KDE | PC fixe : AMD Ryzen 9900X, Radeon RX 7700 XT
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Répondre