Comment restreindre l'exécution de commandes dans un répertoire spécifique via SUDOERS?

13

Je peux configurer sudo (via le fichier sudoers) pour permettre à un utilisateur d'exécuter les commandes chownet chmodsur n'importe quel fichier ou répertoire du système. Cependant, je veux seulement accorder à un utilisateur l'autorisation d'exécuter ces commandes sur des fichiers qui se trouvent sous le /var/www/htmlrépertoire.

Comment puis-je restreindre les commandes privilégiées de sorte que l'utilisateur ne puisse les exécuter que dans un répertoire prédéfini?

Par exemple: La commande suivante accorde 777 autorisations de index.htmlfichier.

sudo chmod 777 /var/www/html/index.html

Maintenant, je veux effectuer deux actions

  1. Restreindre de sudotelle sorte que l'utilisateur ne puisse exécuter chmodet à chownpartir de l'intérieur/var/www/html

  2. Interdire à l'utilisateur d'exécuter ces commandes ailleurs dans le système (par exemple, les commandes ne peuvent pas être exécutées dans /var/wwwou /var/ftp)

PrashantB
la source
1
S'il vous plaît ne pas crosspost - superuser.com/questions/456662/…
Ulrich Dangel
7
Est-ce vraiment la bonne façon? Que diriez-vous d'un www-datagroupe éliminant le besoin de chmod/ chownquoi que ce soit?
sr_
Cool. De cette façon, vous obtenez root facilement. C'est une très mauvaise idée de donner chown. En dehors de cela, je ne vois aucune raison chmodde l'exécuter en tant que root.
Nils

Réponses:

13

Ce que vous demandez est difficile, voire impossible. Même si vous restreignez l'application de chownet chmodaux fichiers d'un répertoire spécifique, quelqu'un peut toujours passer un lien symbolique et affecter ainsi les fichiers où bon leur semble.

Heureusement, il est fort probable que ce que vous essayez de faire n'est tout simplement pas la bonne solution à votre problème réel, et il existe une autre méthode qui fonctionne.

Habituellement, les utilisateurs qui ont besoin d'autorisations supplémentaires pour créer et modifier des fichiers sous /var/wwwsont ajoutés à un groupe (souvent www-data, ou vous pouvez avoir des groupes différents pour différentes parties du site). Vous pouvez utiliser la propriété du groupe et les répertoires setgid: chgrp www-data /var/www/html; chmod g+ws /var/www/htmlpermet à tous les www-datamembres du groupe d'écrire dans le /var/www/htmlrépertoire, et les fichiers créés dans ce répertoire appartiendront au www-datagroupe au lieu du groupe principal de l'utilisateur qui a créé le fichier. Cependant, ce n'est pas très flexible.

Ce que vous devriez probablement faire, c'est configurer des listes de contrôle d'accès pour les fichiers sous /var/www. Tout d'abord, assurez-vous que les ACL sont activées: le système de fichiers activé /var/wwwdoit être monté avec l' acloption. Voir Rendre tous les nouveaux fichiers dans un répertoire accessible à un groupe pour obtenir de l'aide à ce sujet. Installez également les utilitaires ACL ( getfaclet setfacl). Donnez ensuite des autorisations supplémentaires à l'arborescence sous /var/www/htmlaux utilisateurs qui devraient les avoir. Vous pouvez définir des ACL par utilisateur, mais il est souvent plus facile de placer des utilisateurs qui devraient avoir les mêmes droits sur une partie du système de fichiers dans un groupe et de définir des ACL pour ce groupe. Par exemple, si les utilisateurs du groupe html-writersdoivent avoir un accès en lecture-écriture à l'arborescence sous /var/www/html:

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html
Gilles 'SO- arrête d'être méchant'
la source
Concernant "ce n'est pas très flexible" (à la fin du paragraphe 3) - pourquoi n'est-ce pas? Est-ce parce que les gens doivent appartenir à un certain groupe? (Je ne connais pratiquement rien sur les autorisations et les
listes de
3
@KajMagnus C'est inflexible car root doit gérer les groupes, et les fichiers ne peuvent appartenir qu'à un seul groupe. L'ACL permet à n'importe quel utilisateur de sélectionner qui peut accéder aux fichiers dont il est propriétaire, et plusieurs utilisateurs et groupes peuvent être mentionnés dans une ACL.
Gilles 'SO- arrête d'être méchant'
2

Vous pouvez restreindre la commande à être utilisée par "myuser" avec tous les arguments dans le /etc/sudoersfichier avec la commande visudoadd:

## Allows myuser to chmod the html dir and chmod 755 the html2 dir
myuser  ALL=NOPASSWD:/bin/chmod [0-7][0-5][0-5] /var/www/html/*,/bin/chown myuser:mygroup /var/www/html/*,/bin/chmod 755 /var/www/html2/myapp/*.txt 

activer la journalisation pour chaque opération en ajoutant:

Defaults logfile=/var/log/sudo.log

exemple de sortie:

[root@myhost /]# su - myuser
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/index.html 
-sh-3.1$ sudo /bin/chmod 755 /var/www/html/*
-sh-3.1$ sudo /bin/chmod 777 /var/www/html2/myapp/*.txt
Sorry, user myuser is not allowed to execute '/bin/chmod 777 /var/www/html2/myapp/*.txt' as root on myhost.mydomain.
-sh-3.1$ sudo /bin/chmod 755 /var/www/html2/myapp/*.txt 
-sh-3.1$ 

Lorsque vous utilisez sudo, le principe doit être que "myuser" est une personne de confiance. Attention aux autorisations de fichiers, il n'y a pas de moyen simple d'empêcher un utilisateur sudo malveillant de lier un fichier à partir d'une ressource externe et de le modifier.

tombolinux
la source
Je l'ai déjà essayé, mais il a donné l'erreur comme suit: Désolé, l'utilisateur prashant n'est pas autorisé à exécuter '/ bin / chmod 777 / var / www / html / a' en tant que root sur prashant.xyz.com.
PrashantB
avez-vous changé d'utilisateur avec su - prashantou su prashant?
tombolinux
Oui j'exécute la commande par l'utilisateur prashant. Je lis les forums, ils disent que les commandes fonctionnent à l'échelle du système. Personne n'a écrit sur un tel problème.
PrashantB
Je le lance whooo :). Mais ce sera une commande statique. Pouvons-nous le rendre général afin que je puisse appliquer n'importe quelle autorisation sur n'importe quel fichier sous / var / www / html?
PrashantB
3
C'est complètement incertain: sudo /bin/chmod 666 /var/www/html/../../../etc/passwdEt si vous corrigez cela d'une manière ou d'une autre,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
Gilles 'SO- arrête d'être méchant'
1

Il existe en fait un moyen assez simple de le faire, en créant un script Bash (ou shell de votre choix) pour limiter les modifications apportées à un fichier ou un répertoire particulier.

Dans votre exemple, cela ressemblerait à ceci:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Ensuite, vous devez modifier le fichier sudoers pour permettre à www-data d'exécuter / usr / local / bin / mychmod.

Gardez cependant à l'esprit que permettre à l'utilisateur de saisir (par exemple, permettre à un utilisateur de changer le fichier ou le répertoire modifié) dans cet espace est extrêmement dangereux, et vous devez savoir comment filtrer les attaques par injection si vous voulez faire quelque chose comme cette. Un attaquant pourrait facilement exécuter n'importe quelle commande en tant que root de cette façon, compromettant efficacement la sécurité de votre système.

Ernie
la source
c'est exceptionnellement dangereux et ne résout vraiment pas la solution ...
SomeGuy