136 votes

Les meilleures pratiques pour exécuter le service Linux en tant qu'utilisateur différent

Les Services par défaut à partir d'aussi root au moment du démarrage sur ma boîte de RHEL. IIRC, la même chose est vraie pour les autres distributions Linux qui utilisent les scripts d'initialisation en /etc/init.d.

Que pensez-vous est la meilleure façon de la place que le processus s'exécutent en tant que (statique) de l'utilisateur de mon choix?

La seule méthode que je serais arrivé à faire, c'était d'utiliser quelque chose comme:

 su my_user -c 'daemon my_cmd &>/dev/null &'

Mais cela semble un peu désordonné...

Est-il un peu de magie caché qui fournit un mécanisme simple pour démarrer automatiquement des services que les autres, les utilisateurs non-root?

EDIT: j'aurais dit que le processus, je me lance dans cette instance sont soit des scripts Python ou des programmes Java. Je préfère ne pas écrire un natif wrapper autour d'eux, donc, malheureusement, je suis incapable de faire appel setuid() comme Noir suggère.

67voto

hop Points 15423

Sur Debian, on peut utiliser l' start-stop-daemon utilitaire qui gère les pid des fichiers, la modification de l'utilisateur, de mettre le démon en arrière-plan et beaucoup plus.

Je ne suis pas familier avec RedHat, mais l' daemon utilitaire que vous utilisez déjà (qui est défini dans l' /etc/init.d/functions, btw.) est mentionné partout comme l'équivalent d' start-stop-daemon, donc soit il peut également changer l'uid de votre programme, ou la façon dont vous le faire est déjà de la bonne.

Si vous regardez sur le net, il y a plusieurs ready-made wrappers que vous pouvez utiliser. Certains peuvent même être déjà emballés sous RedHat. Jetez un oeil à l' daemonize, par exemple.

53voto

James Brady Points 11646

Après avoir regardé toutes les suggestions ici, j'ai découvert quelques petites choses qui, je l'espère sera utile à d'autres personnes dans ma position:

  1. hop est juste pour me pointer en arrière en /etc/init.d/functions: l' daemon fonction vous permet déjà de pour définir un autre utilisateur:

    daemon --user=my_user my_cmd &>/dev/null &
    

    Ceci est mis en œuvre par emballage de la l'appel de processus avec runuser- plus sur cela plus tard.

  2. Jonathan Leffler est juste: il est setuid en Python:

    import os
    os.setuid(501) # UID of my_user is 501
    

    Je ne pense toujours pas que vous pouvez setuid à l'intérieur de la JVM, cependant.

  3. Ni su ni runuser traiter le cas où vous demander d'exécuter une commande en tant qu'utilisateur, vous le sont déjà. E. g.:

    [my_user@my_host]$ id
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    [my_user@my_host]$ su my_user -c "id"
    Password: # don't want to be prompted!
    uid=500(my_user) gid=500(my_user) groups=500(my_user)
    

Pour contourner ce comportement d' su et runuser, j'ai modifié mon script d'initialisation pour quelque chose comme:

if [[ "$USER" == "my_user" ]]
then
    daemon my_cmd &>/dev/null &
else
    daemon --user=my_user my_cmd &>/dev/null &
fi

Merci à tous pour votre aide!

5voto

Black Points 3104
  • Certains démons (par exemple apache) faire par eux-mêmes en appelant setuid()
  • Vous pouvez utiliser le setuid-fichier drapeau d'exécution du processus en tant qu'utilisateur différent.
  • Bien sûr, la solution que Vous avez mentionné, fonctionne aussi bien.

Si Vous avez l'intention d'écrire Votre propre démon, alors je vous recommandons de téléphoner setuid(). De cette façon, Vos processus

  1. Faire usage de ses privilèges root (par exemple, ouvrir les fichiers journaux, de créer des fichiers pid).
  2. Abandonner ses privilèges root à un certain moment pendant le démarrage.

3voto

dulcana Points 39

sur un CENTOS (Red Hat) de la machine virtuelle de serveur svn: édité /etc/init.d/svnserver pour modifier le pid pour quelque chose que svn peut écrire:

pidfile=${PIDFILE-/home/svn/run/svnserve.pid}

et ajout de l'option --user=svn:

daemon --pidfile=${pidfile} --user=svn $exec $args

L'original pidfile a été /var/run/svnserve.pid. Le démon n'a pas de début becaseu seul root peut y écrire.

 These all work:
/etc/init.d/svnserve start
/etc/init.d/svnserve stop
/etc/init.d/svnserve restart

2voto

claymation Points 703

Quelques choses à regarder dehors pour:

  • Comme vous l'avez mentionné, su vous invite à saisir un mot de passe si vous êtes déjà utilisateur cible
  • De même, les programmes setuid(2) échoue si vous êtes déjà utilisateur cible (sur certains systèmes d'exploitation)
  • setuid(2) ne pas installer des privilèges ou des contrôles des ressources définies dans /etc/limits.conf (Linux) ou /etc/user_attr (Solaris)
  • Si vous allez le setgid(2)/setuid(2) la route, n'oubliez pas d'appeler initgroups(3) - plus sur cela ici

En général, je utiliser /sbin/su pour passer à la appropriée de l'utilisateur avant de commencer les démons.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X