Utilisateur non privilégié, non root, pour démarrer ou redémarrer un serveur de serveur Web tel que nginx sans root ou sudo

J’utilise capistrano pour déployer une application web de rails. Je veux donner à l’utilisateur déployé sur le serveur Web le moins de privilèges possible. J’ai été capable de faire tout ce que je devais faire en tant qu’utilisateur non privilégié, sauf redémarrer le serveur Web.

Je le fais sur un serveur Ubuntu, mais ce problème n’est pas spécifique à mon cas d’utilisation (rails, capistrano, déploiement) et j’ai vu beaucoup d’approches à ce problème qui semblent impliquer de mauvaises pratiques de sécurité. Vous vous demandez si d’autres personnes peuvent examiner ma solution et indiquer si elle est sécurisée?

Tout d’abord, pas nécessaire, mais je ne sais pas pourquoi /etc/init.d/nginx aurait besoin d’un access (même en lecture) par les autres utilisateurs. S’ils ont besoin de le lire, faites-les devenir root (par sudo ou d’autres moyens), alors je:

chmod 750 /etc/init.d/nginx 

Étant donné que la propriété est la racine du propriétaire, la racine du groupe (ou peut être définie avec la racine chown: root /etc/init.d/nginx) seule la racine, ou un utilisateur correctement sudo’ed, peut lire, modifier ou exécuter / etc / init .d / nginx, et je ne vais pas donner à mon utilisateur déployé des droits aussi larges. Au lieu de cela, je vais seulement donner à l’utilisateur déployé le droit sudo spécifique pour exécuter le script de contrôle /etc/init.d/nginx. Ils ne pourront pas exécuter un éditeur pour le modifier, car ils ne pourront exécuter que ce script. Cela signifie que si quelqu’un a access à ma boîte en tant qu’utilisateur deploy, il peut redémarrer et arrêter, etc., le processus nginx, mais il ne peut pas faire plus, comme changer le script pour faire beaucoup d’autres choses mauvaises.

Plus précisément, je le fais:

 visudo 

visudo est un outil spécifique utilisé pour éditer le fichier sudoers, et vous devez disposer de privilèges sudoer pour y accéder.

En utilisant visudo, j’ajoute:

 # Give deploy the right to control nginx deploy ALL=NOPASSWD: /etc/init.d/nginx 

Vérifiez la page de manuel sudo , mais si je comprends bien, la première colonne correspond à l’utilisateur qui reçoit les droits sudo, dans ce cas, “deploy”. ALL permet de déployer l’access depuis tous les types de terminaux / connexions (par exemple, via ssh). La fin, /etc/init.d/nginx, permet UNIQUEMENT à l’utilisateur root de déployer /etc/init.d/nginx (et dans ce cas, NOPASSWD signifie sans mot de passe, ce dont j’ai besoin pour un déploiement sans surveillance) . L’utilisateur de déploiement ne peut pas éditer le script pour le rendre maléfique, ils auraient besoin d’un access complet à sudo pour le faire. En fait, personne ne peut le faire à moins d’avoir un access root, auquel cas le problème est plus grand. (J’ai testé que l’utilisateur déployé ne pouvait pas modifier le script après cela, et vous aussi!)

Qu’en pensez-vous? Est-ce que ça marche? Y a-t-il de meilleures façons de le faire? Ma question est similaire à ceci et à cela , mais fournit plus d’explications que ce que j’ai trouvé là-bas, désolé si cela fait trop double, si c’est le cas, je le supprimerai, bien que je demande également différentes approches.

La meilleure pratique consiste à utiliser /etc/sudoers.d/myuser

Le dossier /etc/sudoers.d/ peut contenir plusieurs fichiers qui permettent aux utilisateurs d’appeler des éléments à l’aide de sudo sans être root.

Le fichier contient généralement un utilisateur et une liste de commandes que l’utilisateur peut exécuter sans avoir à spécifier un mot de passe. Tel que

 sudo service nginx restart 

Notez que nous exécutons la commande en utilisant sudo . Sans sudo le fichier sudoers.d/myuser ne sera jamais utilisé.

Un exemple d’un tel fichier est

 myuser ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart 

Cela permettra à l’utilisateur myuser d’appeler tous les démarrages, arrêts et redémarrages du service nginx.

Vous pouvez append une autre ligne avec un autre service ou continuer à les append à la liste séparée par des virgules, pour plus d’éléments à contrôler.

Assurez-vous également que vous avez exécuté la commande ci-dessous pour sécuriser les choses

 chmod 0440 /etc/sudoers.d/myuser 

C’est aussi comme ça que je lance et arrête les services mes propres scripts de démarrage créés dans / etc / init Il peut être utile de vérifier cela si vous voulez pouvoir exécuter facilement vos propres services.

Instructions:

Dans toutes les commandes, remplacez myuser par le nom de votre utilisateur que vous souhaitez utiliser pour démarrer, redémarrer et arrêter nginx sans sudo.

  1. Ouvrez le fichier sudoers pour votre utilisateur:

     $ sudo visudo -f /etc/sudoers.d/myuser 
  2. L’éditeur ouvrira Là, vous collez la ligne suivante:

     $ myusername ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart 
  3. Enregistrer en appuyant sur ctrl + o . Il vous demandera où vous voulez enregistrer, appuyez simplement sur Entrée pour confirmer la valeur par défaut. Quittez ensuite l’éditeur avec ctrl + x .