Question Exécution de travaux en démarrage en tant qu'utilisateurs non privilégiés


Quelle est la manière canonique d’avoir un job upstart qui change son userid et lance le script en tant qu’utilisateur non privilégié?

De toute évidence on peut utiliser su ou sudo, mais cela semble pirate (et peut générer des lignes de journal inutiles).


138
2018-03-11 14:26


origine




Réponses:


Avec upstart v1.4, setuid et setgid sont supportés nativement dans le fichier de configuration.


108
2017-09-09 11:26



Voir le livre de recettes pour plus de détails à ce sujet: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user - Jason Navarrete
En d'autres termes, il est pris en charge dans Precise (12.04) et plus récent. - Edward Anderson
En d'autres termes, n'est pas pris en charge dans centos 6 - socketpair
Pour mémoire, initctl --version pour trouver votre version actuelle de upstart. - Mahn
Malheureusement, la distribution Amazon Linux sur AWS utilise la version upstart de RHEL 6 (0.6.5 !!!!), donc toute personne qui l'utilisera devra utiliser la solution 'su'. - Asfand Qazi


En ce qui concerne le canal #upstart sur freenode, la prise officielle en la matière est la suivante:

Une future version de Upstart aura   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...]

84
2018-01-18 01:41



C'est la seule réponse qui a fonctionné sur Amazon Linue EC2 (j'ai essayé toutes les variantes de sudo et su, y compris --session-command, -c, ad nauseum); aucun d'entre eux n'a permis d'arrêter le processus une fois démarré; Merci beaucoup pour cela. - Kato
C'est de la magie fantaisiste, +1. - Steve Kehlet
Cela n'a pas fonctionné pour moi sur CentOS 6 (Upstart 0.6.5). Il y a une série de fourches (4 en profondeur je pense) initiées par su cela signifie que expect fork et même expect daemon ne pas attraper le PID final. - Mark Lakata
Je l'ai utilisé sur Amazon Linux (Upstart 0.6.5) pour démarrer un processus Jenkins (qui ne se démonise pas, heureusement) et ça a fonctionné! J'ai dû le changer un peu pour rediriger la sortie standard vers un fichier journal et définir certaines variables d'environnement, mais cela a fonctionné! Ma version ressemble à: exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...] - Asfand Qazi


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

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

De Livre de cuisine:

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

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


17
2017-12-23 15:11



Vous pouvez également utiliser le groupe, si vous en avez besoin. Avec --chuid daemonuser: daemongroup - Evgeny


Il y a plusieurs manières 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 mettra dans le groupe que vous spécifiez.

    • Les daemontools d'origine setuidgid va te mettre seulement dans ce groupe, vous ne pourrez donc pas accéder aux fichiers appartenant à d’autres groupes dont vous êtes membre.
    • le setuidgid de daemontools-encore et le setuidgid de la boîte à outils nosh les deux ont un -s (alias. --supplementary) option qui vous mettra dans ce groupe et vous mettra également dans tous les groupes supplémentaires pour l'utilisateur que vous spécifiez.
  • En utilisant newgrp Une fois que vous êtes le moins privilégié, l'utilisateur ajoute un groupe unique à votre groupe, mais crée également un nouveau sous-shell, ce qui complique l'utilisation des scripts.

  • start-stop-daemon conserve votre appartenance à un groupe et fait beaucoup plus que simplement setuid / setgid.

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

  • su -c commandname username récupère toutes les appartenances aux groupes de noms d’utilisateur, sudo -u username commandname, ils sont probablement la voie à la moins étonnement.


13
2017-12-24 00:00





Utilisation setuidgid de l'emballage daemontools.

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


8
2018-03-11 15:50



daemontools n'est pas une condition préalable au démarrage, donc cela ne semble pas être la réponse «canonique» - Adam Nelson
De plus, daemontools est dans l'Univers (Ubuntu 10.04), et le démarrage est en cours. - jtimberman


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

J'ai aussi eu du mal avec certains des autres strophes. J'appelle une application python avec un spécifique virtualenv et quelques paramètres pour mon programme exécuté.

Voici 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

le PYTHONPATH est de faire installer des paquets de la source dans le PYTHON chemin du module lorsque ce travail est exécuté. Je devais tout faire dans des chemins absolus parce que le chdir la strophe ne semblait pas fonctionner.


4
2018-01-06 19:52



J'ai aussi eu des problèmes avec env les variables utilisées avec exec start-stop-daemon. - Thomas Bratt


J'utilisais CentOS 6, et je ne pouvais pas obtenir le hack recommandé (pour Upstart 0.6.5) pour moi, ni le truc parce que le nombre de fourchettes impliquées (4 je pense) n'était pas suivi par "expect fork". 'ou' attendre le démon '.

Je viens juste de faire

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 pour un projet de R & D interne, cela n'a pas d'importance dans notre cas.


3
2017-08-27 21:56



Si vous deviez faire un chmod 1700 ou au moins un chmod u+sx,go-x là-bas au lieu de juste +s, il serait qualifié de "suffisamment sécurisé". :) - dannysauer


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é. Assurez-vous simplement de ne pas donner les clés du royaume dans le processus.

Vous pouvez aussi modifier le délai d'attente du cache de mot de passe sudo. Mais je ne le recommande pas à moins que votre machine ne soit physiquement sécurisée (c’est-à-dire qu’il est peu probable qu’un passant essaie d’obtenir un accès sudo).

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

Si la Taille de vos fichiers journaux est un problème, alors quelque chose est probablement faux. Sudo génère une seule ligne par utilisation dans des conditions normales.


0
2018-03-11 17:07