Restrinja a un usuario de Linux a los archivos que posee

24

Imagine una configuración de servidor de una empresa de alojamiento web compartida donde varios (~ 100) clientes tienen acceso de shell a un solo servidor.

Una gran cantidad de "software" web recomienda chmod files 0777 . Estoy nervioso porque nuestros clientes sigan imprudentemente estos tutoriales, abriendo sus archivos a nuestros otros clientes. (¡Ciertamente no lo estoy usando cmod 0777innecesariamente!) ¿Existe un método para asegurar que los clientes solo puedan acceder a sus propios archivos y evitar que accedan a archivos legibles por el mundo de otros usuarios?

Miré en AppArmor , pero eso está muy estrechamente vinculado a un proceso, que parece fallar en ese entorno.

Phillipp
fuente
12
De hecho, consideraría si las recomendaciones del "software web" chmod files 0777son estrictamente necesarias, es decir, abordar la causa raíz del problema, en lugar del síntoma de que, al hacerlo, cualquiera puede leer los archivos de cualquier otra persona. Muchas veces, la recomendación de permitir todo el acceso es simplemente una forma económica de evitar llamadas de soporte, o la falta de destreza técnica para poder configurar los permisos correctamente. En casi ningún caso tuve que configurar archivos 0777u otorgar acceso completo a las aplicaciones cuando lo solicité. La educación de los usuarios y / o proveedores ayuda enormemente aquí.
Cosmic Ossifrage
3
@CosmicOssifrage, los usuarios no pueden ser educados tan fácilmente, no quieren leer instrucciones o manuales.
Cristian Ciupitu
12
Cualquier "software web" que todavía recomienda 777 permisos necesita ser sacado y tiro . Uso suexeco mpm_itko similar.
Shadur
3
@ CosmicOssifrage No creo que Phillipp esté diciendo u obligando a los usuarios a chmod 0777sus archivos. Creo que está nervioso de que vayan loltoturialz.com/php_problemsy se pongan chmod 0777solos mientras siguen ciegamente un artículo mal escrito. Realmente no hay forma de evitar que lo hagan, o evitar que se enojen cuando alguien roba sus cosas.
Kevin - Restablece a Mónica el
2
@kevin, que es precisamente por eso que se creó la garantía nula. Casi nunca he visto un dispositivo serio (ya sea compilado por software, un montón de scripts o lo que sea) sin esa cláusula. Y lo creas o no, en la mayoría de los entornos corporativos, los usuarios lo saben
Dani_l

Respuestas:

34

Ponga un directorio restringido e inmutable entre el mundo exterior y los archivos protegidos, p. Ej.

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

o /home/joe/restricted/public_html.

Restringido significa que solo el usuario y quizás el servidor web pueden leerlo (por ejemplo, modos 0700/ 0750o algunas ACL ).

La inmutabilidad se puede hacer con chattr +io cambiando la propiedad a algo así root:joe.

Una manera fácil de crear esa jerarquía en Ubuntu sería la de editar /etc/adduser.confy conjunto GROUPHOMESa yes.

Cristian Ciupitu
fuente
15

Hay una opción que es posible que desee considerar (dependiendo de cuánto trabajo quiera hacer para eso).

Como otros ya publicaron, "normalmente" no puede evitar que alguien con acceso de shell lea archivos legibles en todo el mundo.

Sin embargo, podría agruparlos en su propio hogar, básicamente limitando el acceso de shell a, primero, solo el directorio raíz que desee (también conocido como el directorio de inicio) y, en segundo lugar, evitar que los usuarios ejecuten todo lo que no desea que ejecuten.

Hice un enfoque similar cuando tuve un usuario para tener acceso a los archivos web, pero no quería que él viera otros archivos fuera de la carpeta web.

Esto tenía mucha sobrecarga, era un desastre para configurar, y cada vez que actualizaba algo, se rompía.

Pero por hoy creo que podría lograrlo bastante fácil con la opción de chroot OpenSSH :

WikiBooks OpenSSH

Dennis Nolte
fuente
chroot para SFTP es fácil de implementar, pero no estoy seguro de que sea tan fácil para el acceso de shell. Tendría que configurar un chroot con todos los binarios y bibliotecas para cada usuario.
Cristian Ciupitu
2
Esa es la implementación específica. ARCHLINUX tiene un comando arch-chroot específico que se encarga de todos los montajes de enlace adicionales, etc. wiki.archlinux.org/index.php/Change_Root#Change_root
Dani_l
@CristianCiupitu es lo que hice, permitiendo solo un subconjunto específico de comandos con la vinculación de todas las bibliotecas necesarias, por eso dije que era un desastre :) Dani_l es cierto, mi configuración era un servidor Debian, nunca tuve el tiempo de registrarme en Gentoo tristemente .
Dennis Nolte
@Dani_l: ¿qué pasa con los paquetes instalados? El arch-chrootcomando no parece cubrir eso. Y luego también está el problema del desperdicio de espacio en disco con todos los duplicados. No digo que sea imposible hacerlo, solo que podría ser un poco más complicado actualmente.
Cristian Ciupitu
1
Algo para que esto sea más fácil es usar UnionFS para agrupar a los usuarios en una unión especial de rootfs en modo de solo lectura y un directorio de inicio de lectura y escritura, esto significa que ven todos los paquetes y binarios del sistema, pero las escrituras se realizan automáticamente en su carpeta de inicio. esto, debe combinarse con hacer que todos los directorios de inicio tengan 700 permisos, de lo contrario, los usuarios podrían leer archivos de otros usuarios de todos modos.
Vality
11

He descubierto que las listas de control de acceso POSIX le permiten a usted, como administrador del sistema, proteger a sus usuarios de lo peor de su propia ignorancia, anulando el permiso regular del sistema de archivos de otro grupo de usuarios, sin mucha oportunidad de romper algo crucial .

Pueden ser especialmente útiles si, por ejemplo, (fi) necesita que los directorios principales sean accesibles mundialmente porque el contenido web debe ser accesible para apache ~/public_html/. (Aunque con las ACL ahora puede hacer lo contrario, eliminar el acceso para todos y usar una ACL efectiva específica para el usuario de apache).

Sí, un usuario bien informado puede eliminarlos / anularlos nuevamente, son lo suficientemente poco comunes como para que sea poco probable, y aquellos usuarios que generalmente no son los que convenientemente pueden hacerlo chmod -R 777 ~/, ¿verdad?

Necesita montar el sistema de archivos con la aclopción de montaje:

 mount -o remount,acl /home

En muchas distribuciones, el valor predeterminado es crear grupos de usuarios, cada usuario tiene su grupo primario y he configurado a todos los usuarios en un grupo secundario con el nombre poco imaginativo de users.

Usar ACL ahora es trivial para evitar que otros usuarios accedan a los directorios de inicio:

Antes de:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

Ahora configure los permisos de directorio efectivos para los miembros del usersgrupo para 0no leer, escribir o acceder:

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

El +signo denota la presencia de configuraciones de ACL allí. Y el getfaclpuede confirmar que:

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

El group:users:---programa muestra que ese grupo efectivamente no tiene derecho de acceso, a pesar de los permisos regulares para otro serother::rwx

Y probando como usuario1:

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

Una segunda solución común en sistemas compartidos es hacer que el automontador monte los directorios de inicio a pedido en un servidor dedicado al acceso de shell. Eso está lejos de ser una prueba infalible, pero generalmente solo unos pocos usuarios iniciarán sesión simultáneamente, lo que significa que solo los directorios principales de esos usuarios son visibles y accesibles.

HBruijn
fuente
55
¿Qué es "fi" ? No recomendaría el uso de siglas o abreviaturas a menos que sean clásicas como "eg", "ie", "etc" y quizás OP.
Cristian Ciupitu
3

Linux Containers (LXC) podría ser la mejor combinación de chroot y sistema separado.

  1. Se parecen más a un chroot avanzado, no a la virtualización, pero podría combinar diferentes sistemas operativos en un servidor.

  2. Puede proporcionarle a un usuario un sistema operativo completo y hacerlo allí, de modo que cuando el usuario inicia sesión, vaya a su contenedor. Y también puede limitar el uso del procesador y la memoria allí.

Stéphane Graber, el autor de LXC, tiene un buen tutorial para ayudarlo a comenzar.

maniaco
fuente
Realmente no puedes combinar diferentes sistemas operativos, porque todos ellos necesitan usar el kernel de Linux , pero puedes usar diferentes distribuciones .
Cristian Ciupitu
1
Gracias :) Sí, diferentes sistemas operativos basados ​​en kernel de Linux.
maniaque
@CristianCiupitu ¿te refieres al mismo kernel de Linux idéntico? ¿O quiere decir que cada contenedor puede tener una versión diferente del núcleo?
agks mehx
@agksmehx, todos los contenedores LXC comparten el núcleo del host . Solo se utilizan sus aplicaciones y bibliotecas. Entonces, por ejemplo, si tiene un host RHEL 7 con un contenedor Ubuntu 14.04, se usará el kernel RHEL (3.10.0-123), mientras que el Ubuntu (3.13.0-24.46) no se usará; lea también este comentario del tutorial. Por cierto, dado que los núcleos de los contenedores no se utilizan, puede ser una buena idea eliminarlos para ahorrar espacio en el disco.
Cristian Ciupitu
@CristianCiupitu eso es lo que pensé. no estaba claro por la respuesta o comentario, así que quería aclarar.
agks mehx
3

Por ejemplo, si desea que el usuario tenga acceso solo a su propio homedirectorio, debe hacer lo siguiente:

cd /home
sudo chmod 700 *

Ahora /home/usernamesolo es visible para su propietario. Para que sea el valor predeterminado para todos los usuarios nuevos, edite /etc/adduser.confy establezca DIR_MODEen 0700lugar del 0755valor predeterminado.

Por supuesto, si desea modificar el DIR_MODE predeterminado, depende de su distribución, la que publiqué funciona Ubuntu.

editar

Como @Dani_l mencionó correctamente, esta respuesta es correcta para que NO sean legibles en todo el mundo.

Marek
fuente
Se les llama "legibles por el mundo" por una razón.
Mark K Cowan
1
@DennisNolte En realidad, ayuda, incluso si los archivos son legibles en todo el mundo, si están en un directorio que no has leído ni ejecutado, no puedes leerlos de todos modos.
Vality
1
@ Realidad verdadera, eliminando mi comentario ya que es simplemente incorrecto.
Dennis Nolte
2

Solo para ser pedante - No, no lo hay.
@Marek dio una respuesta correcta , pero su pregunta es incorrecta: no puede evitar que nadie acceda a archivos "legibles en todo el mundo".
O son legibles por el mundo o no lo son. La respuesta de @ Marek es correcta al hacer que NO sean legibles para el mundo.

Dani_l
fuente
2
mal, chroot / encarcelar al usuario a una subcarpeta y no puede leer "normalmente" archivos legibles en todo el mundo.
Dennis Nolte
1
-1 Creo que estás siendo innecesariamente crítico con la pregunta del OP. Quiere dar a sus clientes una red de seguridad en caso de que no sean inteligentes con respecto a sus permisos. Pero no me parece que el OP no sepa cómo funcionan los permisos de archivos Unix o los principios básicos de seguridad.
Kevin - Restablece a Mónica el
Además, puede colocar los archivos en un directorio dentro de un directorio de 000 permisos, luego nadie puede acceder a ellos incluso si los archivos son legibles en todo el mundo.
Vality
¿nadie? ni siquiera root? ;-)
Dani_l
@Kevin estuvo de acuerdo en que mi comentario es crítico de cerca a innecesario. Sin embargo, Dani no debería decir que es pedante y que está mal. Sin decir que no estoy de acuerdo con el resto de su respuesta.
Dennis Nolte
0

No veo ninguna mención del 'caparazón restringido' en las respuestas dadas hasta ahora.

ln / bin / bash / bin / rbash

Establezca esto como su shell de inicio de sesión.

bbaassssiiee
fuente
0

Si el servidor web se ejecuta como el mismo usuario y grupo para cada dominio alojado, es difícil (si no imposible) hacer que la configuración sea segura.

Desea que ciertos archivos sean accesibles tanto para el usuario como para el servidor web, pero no para otros usuarios. Pero tan pronto como el servidor web pueda acceder a ellos, otro usuario podría leerlos poniendo un enlace simbólico al archivo dentro de su propio sitio web.

Si puede hacer que cada sitio web se ejecute como un usuario separado, entonces se vuelve bastante simple. Cada cliente ahora tendrá dos usuarios en el sistema, uno para el servidor web y otro para el acceso de shell.

Cree un grupo que contenga estos dos usuarios. Ahora cree un directorio con ese grupo y usuario root. Ese directorio debe tener permisos 750, lo que significa que la raíz tiene acceso completo y el grupo tiene acceso de lectura y ejecución. Dentro de ese directorio puede crear directorios de inicio para cada uno de los dos usuarios. Esto significa que el directorio de inicio del usuario ya no tendrá el formulario /home/username, sino algo con al menos un componente de directorio más. Esto no es un problema, nada requiere que los directorios principales se nombren de acuerdo con esa convención específica.

Hacer que los sitios web se ejecuten con diferentes usuarios y grupos puede ser complicado, si está utilizando vhosts basados ​​en nombres. Si resulta que solo puede hacer que la separación funcione con vhosts basados ​​en IP, y no tiene suficientes IP para cada sitio, puede alojar cada sitio web en una dirección IPv6 y colocar un proxy inverso para todos ellos en un Dirección IPv4

kasperd
fuente