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).
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...]
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.
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.
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.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é.
Utilisez setuidgid
dans le package daemontools
.
Documentation ici: http://cr.yp.to/daemontools/setuidgid.html
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.
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.
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.