3 votes

Devenir Root après le démarrage de l'application

Parfois, l'utilisateur initie une action dans mon application Node qui nécessite des privilèges d'administrateur ou de racine. Plutôt que de demander aux utilisateurs d'exécuter l'application avec les privilèges sudo J'aimerais demander à l'utilisateur son mot de passe et escalade des privilèges du processus Node déjà en cours d'exécution.

Je ne suis pas intéressé par le fait que mon application exécute un processus enfant avec sudo (comme c'est déjà le cas avec sudo-prompt ). Je veux que le processus de nœud lui-même obtienne les privilèges de Root après avoir été démarré par un utilisateur non-Root sans que le processus de nœud ne puisse être démarré par un utilisateur non-Root. sudo .

Un exemple d'application qui affiche un comportement qui illustre le problème :

var process = require('process');
var http = require('http');
var server = http.createServer(...);
// Several steps here that are unsafe to run as root
promptUserForAdminPassword();
server.listen(80); // Fails, needs to be root

Je voudrais écrire la fonction promptUserForAdminPassword() qui demandera à l'utilisateur son mot de passe, escaladant ainsi les privilèges de Node afin qu'il puisse exécuter les opérations suivantes server.listen(80) avec les privilèges de root, mais exécutez tout ce qui précède avec les privilèges d'utilisateur.

2voto

Cory Klein Points 5117

Vous souhaitez essentiellement modifier le uid du processus de nœud à 0, l'identifiant de la racine. Cette opération s'effectue à l'aide de la fonction process.setuid(0) mais seulement root ou les processus exécutés avec sudo sera couronné de succès avec cet appel, ce qui n'est donc pas possible.

Il n'est pas possible qu'un processus avec un uid d'un utilisateur non privilégié de modifier son uid à 0.

Alternatives

Démarrer un autre processus

// Prompts user for password in terminal running Node process
child_process.spawn('sudo', ['node', 'serverlistener.js']);

// Prompts user for password using UI element
child_process.spawn('gksudo', ['node', 'serverlistener.js']);

Le présent La question comporte quelques options pour la réponse manquante gksudo sur macOS.

Identifiant effectif de l'utilisateur

Si l'on démarre l'application avec sudo est possible, vous pouvez réduire l'exposition de Root :

  1. Commencer par la racine
  2. La modification immédiate de la l'identifiant effectif de l'utilisateur pour un utilisateur plus sûr
  3. Plus tard, si nécessaire, l'utilisateur effectif sera remplacé par Root.

Exemple :

var userid = require('userid');
var sudoUserId = userid.uid(process.env.SUDO_USER);
process.seteuid(sudoUserId);
// Do things
process.seteuid(0);
server.listen(80);

Utilisations <a href="https://github.com/jandre/node-userid" rel="nofollow noreferrer">module userid </a>.

0voto

Gabriel Littman Points 96

En général, vous voulez lancer votre serveur en tant que Root, puis supprimer les autorisations, et non l'inverse.

https://thomashunter.name/blog/drop-Root-privileges-in-node-js/

Si tout ce que vous voulez faire est de fonctionner sur le port 80, c'est ce que je recommande.

Si vous avez besoin d'autorisations pour d'autres choses, vous devriez probablement demander à l'utilisateur sous lequel tourne votre serveur d'avoir ces autorisations. (accès en écriture aux répertoires, etc.) L'exécution en tant que Root n'est généralement pas une bonne chose.

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