Est-il possible pour root d'exécuter une commande en tant que non root?

10

Je suis un utilisateur root et je suppose que je veux exécuter n'importe quelle application en tant qu'autre utilisateur. Est-ce possible sans passer à un autre utilisateur?

Quelque chose comme

# google-chrome user=abc

J'exécute en fait un programme CLI en tant qu'utilisateur non root. J'ai activé le bit collant et j'utilise setuid, donc le programme s'exécute avec les privilèges root. Maintenant, j'utilise system()dans le programme pour appeler une application GUI. Mais je ne veux pas l'exécuter en tant que root, donc je veux supprimer temporairement les privilèges root uniquement pour cet appel.

adnan kamili
la source
1
Courez-vous vraiment en tant que root la plupart du temps?
Keith
1
@Keith rien dans la question n'implique la plupart du temps .
kojiro
Ou non, c'est pourquoi je demande des éclaircissements.
Keith
Oui, c'est ainsi que le premier programme pour chaque utilisateur est exécuté. Le premier processus sur le système est exécuté en tant que root. Il existe de nombreuses façons de supprimer des privilèges, y compris toutes les façons qui peuvent augmenter les privilèges, ainsi que d'autres.
ctrl-alt-delor

Réponses:

9

Une solution portable serait:

su abc -c google-chrome

Cependant, comme google-chrome nécessite un accès X11, cela échouera probablement à moins que vous ne le sécurisiez, ce qui serait une très mauvaise idée, surtout lors de l'exécution en tant que root.

Si le réglage / transfert X11 est autorisé, une meilleure façon serait

ssh -X abc@localhost google-chrome

ou

ssh -Y abc@localhost google-chrome
jlliagre
la source
Pourquoi l'approche ssh serait-elle meilleure? Cela ne fonctionnerait-il pas toujours en utilisant la session X de l'utilisateur root?
Steve
1
@Steve Using su abc -c google-chromeéchouera probablement en premier lieu car abcne peut pas utiliser la session root, .Xauthorityétant illisible pour abc.
jlliagre
Oups désolé de vous avoir mal compris, je pensais que vous vouliez dire que ce serait mieux du point de vue de la sécurité
Steve
10

Réponse courte: "Oui, c'est possible".

si vous souhaitez exécuter une application non X, utilisez simplement la commande suivante:

commande sudo -u abc

Si vous aimez exécuter une application X en tant qu'autre utilisateur, mais avec votre propre bureau, vous devez d'abord créer un script d'aide, cela vous simplifiera la vie

  • créez un dossier bin sous votre répertoire personnel:

mkdir -p ~ / bin

et en utilisant votre éditeur de texte préféré, créez un fichier ~/bin/xsudocomme suit:

#!/bin/bash
# (C) serge 2012
# The script is licensed to all users of StackExchange family free of charge
# Fixes/Enhancements to the script are greatly appreciated. 
# 
# SUDO_ASKPASS has to be set to the path of ssh-askpass
# fix the following two lines if your distribution does not match this autodetection
. /etc/profile.d/gnome-ssh-askpass.sh
export SUDO_ASKPASS="${SSH_ASKPASS}"

SUDOUSERNAME="$1"
shift
xauth nlist "${DISPLAY}"|sudo -HA -u $SUDOUSERNAME env --unset=XAUTHORITY \
bash -c "xauth nmerge - ; $*"

puis rendez-le exécutable:

chmod + x ~ / bin / xsudo

et utilisez-le de la même manière que sudosans commutateur:

application utilisateur xsudo

Prendre plaisir.

PS Il est fortement déconseillé de xsessionpartir du rootcompte!

Serge
la source
Est-ce que tu l'as essayé ? J'ai peur que cet exemple particulier ne fonctionne pas.
jlliagre
Oui, car pour démarrer une application X à partir d'une autre session utilisateur, vous devez autoriser l'accès à votre affichage. Mais c'est aussi possible. Malheureusement, je ne me souviens pas exactement comment procéder.
Serge
@jlliagre Cependant, je me souviens comment démarrer une application X sur le même hôte de manière délicate: ssh -X abc@localhost google-chrome:)
Serge
Hmm ... J'écris dans les commentaires ce que tu as déjà posté il y a 22 min ...
Serge
Mais vous avez encore 6 votes pour une solution qui ne fonctionne pas alors que je n'en ai obtenu qu'un pour une solution correcte. Le modèle StackExchange est parfois assez frustrant ...
jlliagre
1

Il existe un moyen d'exécuter chrome lorsque vous êtes connecté à l'utilisateur root. Si vous l'ouvrez normalement, il vous donnera une erreur comme "le chrome ne peut pas être exécuté en tant que root".

Pour l' exécuter sans l'erreur, right clickvotre bureau, créez un nouveau lanceur avec la commande: chromium-browser --user-data-dir. Vous pouvez le nommer comme vous le souhaitez, l'enregistrer, lorsque vous l'ouvrirez, il vous donnera le navigateur chrome. (Fonctionne dans Ubuntu 10.04.4 LTS)

user299161
la source
1
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


execute () {
    function="${1}"
    command="${2}"
    error=$(eval "${command}" 2>&1 >"/dev/null")

    if [ ${?} -ne 0 ]; then
        echo "${function}: $error"
        exit 1
    fi
}


executeAsNonAdmin () {
    function="${1}"
    command="${2}"

    eval setPasswordAsker="SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass"
    run="runuser ${SUDO_USER} --session-command=\"${setPasswordAsker}\" --command=\"${command}\""
    execute "${function}" "${run}"
}


executeAsNonAdmin "" "${@}"
Alberto Salvia Novella
la source