web-dev-qa-db-fra.com

Exécution de tâches nouvelles en tant qu'utilisateurs non privilégiés

Quelle est la manière canonique de faire en sorte qu'un travail parvenu modifie son ID utilisateur et exécute le script en tant qu'utilisateur non privilégié?

Évidemment, on peut utiliser su ou Sudo, mais cela semble bidon (et peut générer des lignes de journal inutiles).

142
aaronsw

Avec upstart v1.4, setuid et setgid sont pris en charge de manière native dans le fichier de configuration.

108
qsun

En posant sur la chaîne #upstart sur freenode, la question officielle est la suivante:

La prochaine version d'Upstart aura un support natif pour cela, mais pour l'instant, vous pouvez utiliser quelque chose comme:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]
86
Roman Gaufman

Que diriez-vous d'utiliser start-stop-daemon?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd

De Livre de recettes Upstart :

La méthode recommandée pour les systèmes Debian et Ubuntu consiste à utiliser l'utilitaire d'assistance start-stop-daemon. […] start-stop-daemon n'impose pas de limites au processus démarré par PAM ("Pluggable Authentication Module").

Remarque: start-stop-daemon non pris en charge par RHEL.

17
Jason R. Coombs

Il existe plusieurs façons de le faire, toutes avec une sémantique légèrement différente, en particulier en ce qui concerne l'appartenance à un groupe:

  • setuidgid vous placera dans le groupe que vous spécifiez.

    • La setuidgid de daemontools original vous mettra only dans ce groupe, vous ne pourrez donc pas accéder aux fichiers appartenant aux autres groupes dont vous êtes membre.
    • Le setuidgid de daemontools-encore et le setuidgid du groupe d'outils nosh ont une option -s (aka --supplementary) qui vous placera dans le groupe supplémentaire. groupes pour l'utilisateur que vous spécifiez.
  • Utiliser newgrp une fois que vous êtes devenu l'utilisateur le moins privilégié ajoutera un seul groupe à votre groupe, mais créera également un nouveau sous-shell, ce qui rendra l'utilisation du script difficile.

  • start-stop-daemon préserve votre appartenance à un groupe et fait bien plus que simplement setuid/setgid.

  • chpst -u username:group1:group2:group3... commandname vous permettra de spécifier exactement les appartenances à un groupe à adopter, mais (dans Ubuntu ), il est uniquement fourni avec le package runit, qui est une alternative à upstart.

  • su -c commandname username récupère toutes les appartenances au groupe de noms d'utilisateur, tout comme Sudo -u username commandname, de sorte qu'elles sont probablement le chemin le moins étonné.

13
Jason Holt

Utilisez setuidgid dans le package daemontools.

Documentation ici: http://cr.yp.to/daemontools/setuidgid.html

8
aaronsw

Sur une instance Ubuntu 10.10 sur Amazon EC2, j'ai eu plus de chance avec la commande start-stop-daemon.

J'ai également eu du mal avec certains des autres parvenus strophes . J'appelle une application python avec une variable virtualenv spécifique et certains paramètres de mon programme exécuté.

Ce qui suit est ce qui a fonctionné pour moi.

script
  export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/
  exec start-stop-daemon --start  --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 &
end script

La PYTHONPATH consiste à installer certains packages à partir de la source dans le chemin de modulePYTHONlorsque ce travail en amont est exécuté. Je devais tout faire de manière absolue, car la strophe chdir ne semblait pas fonctionner.

4
Jesse Smith

J'utilisais CentOS 6 et je ne pouvais pas utiliser le hack recommandé (pour Upstart 0.6.5), ni le truc "su" car le nombre de fourches impliquées (4 je pense) n'était pas suivi par "expect fork" 'ou' attendons le démon '.

J'ai finalement juste fait

chown user:group executable
chmod +s executable

(c.-à-d. définir le bit setuid et changer la propriété).

Ce n'est peut-être pas la méthode la plus sûre, mais dans le cas d'un projet interne de R & D, cela importait peu dans notre cas.

3
Mark Lakata

Il y a une troisième possibilité en fonction de ce que vous essayez d'accomplir. Vous pourrez peut-être desserrer les contrôles d’accès sur les fichiers/périphériques en question . Cela peut permettre à un utilisateur non privilégié de monter ou d'accéder à des éléments auxquels il ne serait normalement pas autorisé. Veillez simplement à ne pas donner les clés du royaume dans le processus.

Vous pouvez également changer le délai d’expiration du cache de mots de passe Sudo . Mais je ne le recommande pas sauf si votre machine est physiquement sécurisée (c’est-à-dire que vous estimez qu’il est peu probable qu'un passant tente de se connecter à Sudo).

Il y a une bonne raison pour laquelle il y a très peu de manières d'effectuer des actions privilégiées et de les exécuter inutile nécessaire journalisation. Des restrictions lâches constitueraient un risque pour la sécurité de votre système, et l'absence de journalisation signifierait qu'il est impossible de savoir ce qui s'est passé lorsque vous avez été compromis.

Si le size de vos fichiers journaux pose un problème, il est probable que quelque chose ne va pas. Sudo génère une seule ligne par utilisation dans des conditions normales.

0
Chris Nava