Page 1 sur 2

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

Publié : sam. 21 juin 2014, 12:52
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.

Re: [Systemd] Droits sur certains services uniquement

Publié : sam. 21 juin 2014, 13:11
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

Re: [Systemd] Droits sur certains services uniquement

Publié : sam. 21 juin 2014, 13:24
par Cafeinoman
Ok, merci. Le but que ce soit l'administrateur qui donne les accès, donc je vais plutôt de sudo...

Re: [Systemd] Droits sur certains services uniquement

Publié : sam. 21 juin 2014, 18:14
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é?

Re: [Systemd] Droits sur certains services uniquement

Publié : sam. 21 juin 2014, 18:27
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.

Re: [Systemd] Droits sur certains services uniquement

Publié : sam. 21 juin 2014, 18:57
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é...

Re: [Systemd] Droits sur certains services uniquement

Publié : dim. 22 juin 2014, 15:35
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!

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

Publié : dim. 22 juin 2014, 15:43
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

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

Publié : dim. 22 juin 2014, 17:49
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à?

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

Publié : dim. 22 juin 2014, 18:24
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

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

Publié : dim. 22 juin 2014, 18:44
par waitnsea
Y aurait-il des moyens plus sûrs avec les capabilities ? Voir ICI

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

Publié : dim. 22 juin 2014, 18:54
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é.

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

Publié : dim. 22 juin 2014, 19:47
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?

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

Publié : dim. 22 juin 2014, 19:51
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

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

Publié : dim. 22 juin 2014, 20:28
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...

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

Publié : dim. 22 juin 2014, 21:00
par benjarobin
Quel erreur ? Quel code d'erreur ? Arrives tu as lancer controlTomcat depuis une console en utilisateur ? Est ce que cela fonctionne correctement ?

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

Publié : dim. 22 juin 2014, 21:09
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.

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

Publié : dim. 22 juin 2014, 21:35
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...

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

Publié : dim. 22 juin 2014, 21:41
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:

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

Publié : dim. 22 juin 2014, 21:42
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