Autoriser un groupe à utiliser une commande root

Salut tout le monde :grinning:

Je viens vers vous après moult recherches concernant le problème suivant :
je dispose d’un serveur sous Debian 6 qui tourne dans une machine virtuelle.
Dans le but de créer des dépôts git, on trouve dans ce serveur un script contenant la commande chown.
Mon problème est le suivant : j’aimerai que tout les utilisateurs du groupe git puissent exécuter ce script sauf que la commande chown nécessite les droits root :cry:
J’ai trouvé sur le net tout un tas de modifications à effectuer sur /etc/sudoers via visudo mais aucune d’entre elle fonctionne…
Parmi les lignes ajoutées on trouve (entre autres):

%git ALL=NOPASSWD: /bin/chown
%git ALL=(root) NOPASSWD: /bin/chown
Cmnd_Alias CHOWN = /bin/chown
%git ALL=(ALL) NOPASSWD: CHOWN
%git ALL=NOPASSWD: chown

J’ai aussi vu sur un forum anglophone un post suggérant la modification des droit sur la commande chown directement, ce qui n’a pas fonctionné…
J’aimerai savoir si l’un de vous possède la solution miracle qui résoudrai mon problème :wink:

Merci d’avance et bonne journée :sunglasses:

PS : je vous ajouterai bien les lignes entières du script ou de /etc/sudoers mais je n’arrive pas à insérer du code proprement :confused:

Et : %git ALL=(ALL) NOPASSWD: /bin/chown ?

Effectivement sans le contenu du script, il nous est difficile de vous conseiller.

Pour insérer votre script vous tapez

  • Voici le contenu de /path/to/script

  • Une ligne de balisage ne contenant que 3 backticks (AltGR+7) et éventuellement le type de fichier bash par exemple

  • Le contenu du script (copier/coller)

  • Une balise de fermeture, ligne ne contenant que 3 caractères AltGr+7

Pourriez-vous préciser pourquoi vous avez besoin de passer par un script pour faire une chose aussi banale que la création d’un dépôt git
Je vous conseille d’installer les paquets gitolite3 et debian-goodies et de taper la commande

debmany  gitolite3

gitolite vous permet de gérer très facilement les accès sécurisés aux dépôts git.

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة

F. Petitjean
Ingénieur civil du Génie Maritime.

« Je préfère le vin d’ici à l’au-delà »
Pierre Dac

Mhm… Bonne question.
Je l’ai peut être déjà essayé :slight_smile:
Dans le doute je ré-essaye :wink:

%git ALL=(ALL) NOPASSWD: /bin/chown ne fonctionne pas hélas :cry:

Voici le script create_project.sh qui se trouve dans /var/git :

#!/bin/bash REPO=${1} [[ ${REPO} == *.git ]] || REPO+=.git git init --bare --shared ${REPO} chown git:git -R ${REPO} && chmod 0770 -R ${REPO} touch ${REPO}/git-daemon-export-ok#java -jar /var/jenkins-cli/jenkins-cli.jar -s http://192.168.2.106:8080/ create-job ${REPO}

Je passe par ce script car l’entreprise dans laquelle je suis est toujours passée par ce script.
L’ancien admin réseau leur avait donné le mot de passe root pour pouvoir l’exécuter, chose que je ne veux pas faire.
Ma volonté est donc d’adapté la façon de faire de manière à ne pas changer leur habitude sans pour autant leur donner un mot de passe qui leur permettrait de faire tout et n’importe quoi :yum:

Je reviens vers vous pour vous annoncer que je viens de trouver la solution à mon problème :sunglasses:
Je prenais le problème à l’envers si on peut dire ça comme ça.
Voici comment je l’ai résolu :
au lieu d’attribuer la permission au groupe git d’utiliser la commande chown, j’ai autoriser mon groupe à exécuter le script en tant que root sans rentrer de mot de passe en ajoutant la ligne suivante à /etc/sudoers en passant par visudo évidemment :
%git ALL=NOPASSWD: /var/git/create_project.sh
Ainsi les membres du groupe git peuvent exécuter le script via la commande :
sudo ./create_project.sh
Et cela sans qu’un mot de passe ne leur soit demandé :smile:
Voila voila désolé de vous avoir dérangé pour rien mais au moins si quelqu’un à le même problème il aura une solution.
Merci à vous de m’avoir aidé.
Passez une bonne journée :sunglasses:

Je suppose qu’actuellement les instructions pour créer un dépôt sont

  • Se connecter comme administrateur ( par exemple en tapant su )

  • Faire

cd /var/git
./create_project.sh NomduDepot

Vous voyez la fragilité de l’approche , il manque un élément essentiel qui est de s’assurer que les dépôts sont créés dans /var/git et non pas n’importe où.

Si vous faites

cd /etc/apt
sudo /var/git/create_project.sh naouak

il y aura création d’un dépôt git nu dans /etc/apt/naouak.git

D’autre part, il manque aussi le test de la présence d’un paramètre nomDuDepot, et les paramètres supplémentaires sont silencieusement ignorés.
Imaginez les dégâts si vous tapez

cd /etc
sudo  /var/git/create_project.sh 
cd /usr/lib
sudo  /var/git/create_project.sh  مع

En premier, vous écrasez le dépôt etckeeper contenant l’historique de la configuration de votre système depuis l’installation du paquet etckeeper (si vous avez installé ce paquet très pratique), et en deux vous créez une arborescence dans un répertoire qui contient des centaines d’entrées avec un nom assez difficile à taper.

En cherchant dans le code de gitolite les commandes de votre script sont présentes, par exemple création de dépôt nu

fp2x@drhpcmss:~$ fgrep bare /usr/share/gitolite3/lib/Gitolite/Conf/Store.pm
    _system("git init --bare >&2");

Je pense donc que c’est une solution qui reste à creuser :wink:

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة

F. Petitjean
Ingénieur civil du Génie Maritime.

« Moi, lorsque je n’ai rien à dire, je veux qu’on le sache. » (R. Devos)

Donc en fait vous me conseillez d’ajouter 2 choses à ce script :

  • Une ligne de “vérification” permettant de ne pas créer 2 dépôts du même nom
  • Un complément sur une des lignes permettant de garantir le dossier de création du dossier

C’est bien cela?
A vrai dire je n’ai jamais vraiment ouvert ce script. Il a été fait par mon prédécesseur et fait ce dont les différents utilisateurs ont besoin donc je ne me suis jamais attardé sur son contenu :confused:

Une question bête, je n’ai pas suivi tout le fil, mais s’il s’agit de simplement permettre aux personnes appartenant au groupe git d’executer le script, pourquoi ne pas simplement faire :

# chown root:git ton_fichier_script
# chmod 750 ton_fichier_script 

De cette manière root aura tous les droits sur le script, et les personnes appartenant au groupe git uniquement le droit de lecture et execution, les autres n’auront aucun droit…
Après s’il y a une commande dans le script qui doit être executée avec les droits root, peut-être se tourner vers le sticky_bit (je ne m’avance pas trop car je ne me rapelle plus exactement, mais il me semble qu’il y a un des trois bits qui permet aux personnes appartenant au groupe d’executer le script comme si c’etait root qui le faisait, voir du cote des acl…).

Pour résumer, je voulais que les membres du groupe git puisse utiliser une commande nécessitant les droits super utilisateur. Au début je voulais faire en sorte que la commande en question (chown) soit exécutable par les membres de git mais sans succès.
Pour parer au problème j’ai ajouter une règle dans /etc/sudoers pour que les membres de git puissent taper :
sudo ./create_project.sh
sans qu’ils aient besoin de taper le mot de passe super utilisateur :slight_smile:

Comme tout code fait maison, il est perfectible.

Jusqu’au jour où un utilisateur membre du groupe git est un peu pressé et lance directement

/var/git/create_project.sh truc

alors qu’il est dans un répertoire système, comme je l’ai indiqué précédemment.

Mon conseil serait que vous installiez les paquets que je vous ai indiqué sur une machine de tests, que vous vous familiarisez avec ce logiciel.
Lors de l’installation et configuration de gitolite3 une question debconf apparaît chemin de la clef (SSH) publique qui servira pour administrer l’ensemble des dépôts.
Sur un Debian 8.6 si vous donnez un chemin valide tout est automatique, mais je ne conseille pas cette solution, laissez le champ vide.
Puis

sudo dpkg-reconfigure gitolite3

vous demandera le nom de l’utilisateur système à créer ( git par exemple ), puis un nom de répertoire qui var servir de HOME à cet utilisateur. Ce répertoire doit être dans /var/lib (*) et les dépôts gérés sont dans HOME/repositories

EDIT: Il serait intéressant d’avoir une idée du nombre de dépôts générés par votre script, et de la volumétrie associée.
Comment sont accédés les dépôts ?
Avec gitolite, c’est du SSH URL = git@serveur:NomDepot .

Note
(*) D’après mes essais; C’est un bug assez agaçant.

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة

F. Petitjean
Ingénieur civil du Génie Maritime.
Bureau Veritas
Département Recherche, le département de l’excellence technique.

Mais en installant gitolite3 comment pourrais-je être sûr que mon nouveau script (ou autre) fonctionne comme le précédent? Car en plus de ne pas l’avoir fait moi même, je ne comprend pas tout ce que le script fait :confused: Mais je pense que je pourrai le demander à une autre personne qui a “supervisé” la création du script. Et puis dans tout les cas je n’aurai qu’à comparer ce que fait le script et gitolite3 sur mon serveur de test.
Les dépôts créés par le script sont gérés par des utilisateurs utilisant Source Tree sur Windows.
Actuellement les dépôts sont créés un par un, mais parce que les utilisateurs n’ont pas l’utilité d’en créer 2 simultanément.
Qu’entendez vous par volumétrie? Si vous demandez la taille de ces dépôts, et si je ne me suis pas trompé dans mon relevé, quasiment tout les dépôt font 4ko, ce qui me paraît bien étrange :confused:

C’est grandiose, sachant qu’on a affaire à cinq lignes de code ! :confounded:

J’ai l’impression qu’on cherche à appliquer pricipe de Peter dans votre organisation.

Je ne connais pas. ça a l’air d’être un habillage autour de git pour Windows.
Quel type d’URL est utilisé ?

git remote --verbose

Pour ma part, je trouve que la gestion des accès aux dépôts git avec gitolite est très facile. Pas plus tard que cette après-midi j’ai donné l’accès à un stagiaire qui lui, utilise xubuntu alors que l’énorme majorité des utilisateurs ont W7 Pro, Putty/pageant et git for W$.
Cela marche très bien, même pour des chercheurs basés à Singapour.
On ne touche qu’à un dépôt gitolite-admin et avec les directives du genre config gitweb.owner, gitweb.url ou gitweb.description on peut améliorer sensiblement l’affichage gitweb .

Exemple : liste des dépôts (depuis Windows)

C:\Temp>ssh gits@drhpcmss info
hello admin, this is gits@drhpcmss running gitolite3 3.6.4-1~bpo70+1 (Debian) on
 git 1.7.10.4

     C  CREATOR/[a-zA-Z0-9].*
 R W    ForwardSpeed
 R W    Towing
 R W    admin/OpenFOAM-2.1.x
 R W    admin/attic
 R W    admin/libsose-0.1
 R W    admin/mesquite
 R W    aster
 R W    bbot
 R W    cmonroy/bvRoll
 R W    cmonroy/foamBazar
 R W    cmonroy/foamValid
 R W    gitolite-admin
 R W    masse_ressort
 R W    opera
 R W    operaDoc
 R W    soseng/CRSFoam
 R W    soseng/OpenFOAM-2.4.x
 R W    soseng/foam-extend-3.1
 R W    soseng/foamStar
 R W    structure
 R W    testing

C:\Temp>

Et la commande ssh utilisée est un lien vers plink.exe Voir l’annexe :wink:

Par volumétrie j’entendais bien la place prise par les dépôts

sudo du -m -s /var/git
sudo du -m -s /var/git/* /var/git/.*

La taille de 4Ko semble être due à une histoire de shell (* et .* sont dans un bateau )

Annexe
Utilisation de fsutil hardlink (create/list) sous W$

C:\Temp\bin>which ssh
C:\Temp\bin\ssh.EXE

C:\Temp\bin>lln ssh.exe
\Program Files\PuTTY\plink.exe
\Temp\bin\ssh.exe

C:\Temp\bin>cat lln.bat
@echo off
Rem lln.bat target ..
FOR /F "usebackq delims=<>" %%I IN (`CMD /C "which --all --show-dot --skip-dot -
- %* 2> NUL"`) DO fsutil hardlink list "%%I"
C:\Temp\bin>

Autrement dit, même sous W$ on peut avoir des liens.

Cordialement,
Regards,
Mit freundlichen Grüßen,
مع تحياتي الخالصة

F. Petitjean
Ingénieur civil du Génie Maritime.

dans /etc/sudoers
%mongroup localhost=(root) NOPASSWD:/usr/bin/macommande

ou si la macommande nécessite des paramètres:

%mongroup localhost=(root) NOPASSWD:/usr/bin/macommande *

Ha oui j’ai oublié de préciser que je ne suis pas un crack en script :confused:

Je ne pense pas que cela soit lié à une loi de la sorte. C’est juste que mon prédécesseur à ce poste était étudiant en alternance tout comme je le suis actuellement :slight_smile:

Je ne sais pas trop, cette étape se fait via Source Tree et je ne manipule pas ce logiciel. Le peu que je peux vous dire c’est que dans le logiciel ils doivent spécifier une adresse du type ssh://utilisateur@adresse/chemin/… Attention c’est à prendre avec des pincettes, je ne suis pas sûr à 100% de ça :confused:

En farfouillant un peu sur le net il s’avère que gitolite3 est LE gestionnaire de dépôts par excellence :smiley: Je vais donc essayé de “bidouiller” tout ça sur mon serveur de test grâce à toutes les informations que vous me fournissez.
Merci encore