¿Cómo restringir la ejecución de comandos en un directorio específico a través de SUDOERS?

13

Puedo configurar sudo (a través del archivo sudoers) para permitir que un usuario ejecute los comandos chowny chmoden cualquier archivo o directorio en el sistema. Sin embargo, solo quiero otorgarle a un usuario permiso para ejecutar estos comandos en archivos que residen debajo del /var/www/htmldirectorio.

¿Cómo puedo restringir comandos privilegiados para que el usuario solo pueda ejecutarlos en un directorio especificado previamente?

Por ejemplo: el siguiente comando otorga 777 permisos para index.htmlarchivar.

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

Ahora quiero realizar dos acciones

  1. Restrinja de sudomodo que el usuario solo pueda ejecutar chmody chowndesde/var/www/html

  2. No permita que el usuario ejecute estos comandos en otra parte del sistema (por ejemplo, los comandos no pueden ejecutarse en /var/wwwo /var/ftp)

PrashantB
fuente
1
Por favor, no haga crosspost - superuser.com/questions/456662/…
Ulrich Dangel
77
¿Es esta realmente la forma correcta? ¿Qué tal un www-datagrupo que elimina la necesidad de chmod/ chownalgo?
sr_
Frio. De esa manera, obtienes root muy fácil. Es una muy mala idea regalar chown. Aparte de eso, no veo ninguna razón por la chmodque deba ejecutarse como root.
Nils

Respuestas:

13

Lo que estás preguntando es difícil, si no imposible. Incluso si lo hizo restringir la aplicación de chowny chmodpara los archivos bajo un directorio específico, alguien todavía podría pasar un enlace simbólico y por lo tanto afecta a los archivos en cualquier lugar que les gusta.

Afortunadamente, es muy probable que lo que intentas hacer no sea la solución correcta para tu problema real, y hay otro método que funciona.

Por lo general, los usuarios que necesitan permisos adicionales para crear y modificar archivos /var/wwwse agregan a un grupo (a menudo www-data, o puede tener diferentes grupos para diferentes partes del sitio). Puede usar la propiedad del grupo y los directorios setgid: chgrp www-data /var/www/html; chmod g+ws /var/www/htmlpermite que todos en el www-datagrupo escriban en el /var/www/htmldirectorio, y los archivos creados en ese directorio serán propiedad del www-datagrupo en lugar del grupo primario del usuario que creó el archivo. Sin embargo, esto no es muy flexible.

Lo que probablemente debería hacer es configurar listas de control de acceso para archivos en /var/www. Primero, asegúrese de que las ACL estén habilitadas: el sistema de archivos que /var/wwwestá encendido debe montarse con la aclopción. Consulte Hacer que todos los archivos nuevos en un directorio sean accesibles para un grupo para obtener ayuda sobre eso. Instale también las utilidades de ACL ( getfacly setfacl). Luego otorgue permisos adicionales al árbol debajo /var/www/htmlde los usuarios que deberían tenerlos. Puede establecer las ACL por usuario, pero a menudo es más fácil colocar a los usuarios que deberían tener los mismos derechos en una parte del sistema de archivos en un grupo y establecer las ACL para ese grupo. Por ejemplo, si los usuarios del grupo html-writersdeberían tener acceso de lectura y escritura al árbol bajo /var/www/html:

setfacl -d -m group:html-writers:rwx /var/www/html
setfacl -m group:html-writers:rwx /var/www/html
Gilles 'SO- deja de ser malvado'
fuente
Con respecto a "esto no es muy flexible" (al final del párrafo 3), ¿por qué no lo es? ¿Es porque las personas necesitan estar en cierto grupo? (No sé casi nada sobre permisos y ACL y cosas relacionadas.)
KajMagnus
3
@KajMagnus Es inflexible porque la raíz tiene que administrar grupos, y los archivos solo pueden pertenecer a un solo grupo. ACL permite que cualquier usuario seleccione quién puede acceder a los archivos que posee, y se pueden mencionar múltiples usuarios y grupos en una ACL.
Gilles 'SO- deja de ser malvado'
2

Puede restringir el comando para que "myuser" lo use con todos los argumentos en el /etc/sudoersarchivo con el comando 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 

habilitar el registro para cada operación agregando:

Defaults logfile=/var/log/sudo.log

salida de muestra:

[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$ 

Cuando usa sudo, la premisa debe ser que "myuser" es una persona de confianza. Tenga cuidado con los permisos de archivo, no hay una manera simple de evitar que un usuario malicioso de sudo vincule un archivo desde un recurso externo y lo cambie.

Tombolinux
fuente
Lo he intentado antes, pero me dio el error como: Lo siento, el usuario prashant no tiene permitido ejecutar '/ bin / chmod 777 / var / www / html / a' como root en prashant.xyz.com.
PrashantB
¿Has cambiado de usuario con su - prashanto su prashant?
tombolinux el
Sí, estoy ejecutando el comando por un usuario prashant. Leo foros, dicen que los comandos se ejecutan en todo el sistema. Nadie ha escrito sobre ese tema.
PrashantB
Lo ejecuto whooo :). Pero este será un comando estático. ¿Podemos hacerlo general para que pueda aplicar cualquier permiso en cualquier archivo en / var / www / html?
PrashantB
3
Esto es completamente inseguro: sudo /bin/chmod 666 /var/www/html/../../../etc/passwdY si de alguna manera arreglar eso,ln -s /etc /var/www/html/foo/etc; sudo /bin/chmod 666 /var/www/html/foo/etc/passwd
Gilles 'SO siendo parada del mal'
1

En realidad, hay una manera bastante simple de hacer esto, creando un script Bash (o shell de su elección) para restringir las modificaciones realizadas a un archivo o directorio en particular.

En su ejemplo, se vería así:

$ vi /usr/local/bin/mychmod

#!/bin/bash

chmod 777 /var/www/index.html

Luego, cambiaría el archivo sudoers para permitir que www-data ejecute / usr / local / bin / mychmod.

Sin embargo, tenga en cuenta que permitir la entrada del usuario (por ejemplo, permitir que un usuario cambie qué archivo o directorio está modificado) en este espacio es extremadamente peligroso, y necesita saber cómo filtrar los ataques de inyección si desea hacer algo como ese. Un atacante podría ejecutar fácilmente cualquier comando como root de esta manera, comprometiendo efectivamente la seguridad de su sistema.

Ernie
fuente
esto es excepcionalmente peligroso y realmente no resuelve la solución ...
SomeGuy