RE: (pero la seguridad?) Páginas web de mis usuarios en apache
> > ¿Que tengo que configurar para que un usuario pueda poner su
> > página web y que el apache lo ceda a internet?
>
> si tienes cargado el módulo user (creo que es así), basta con que el
> usuario tenga la carpeta public_html en el directorio raiz y con
> permisos 755 tanto su home como el public_html. Más gráfico:
>
> ls -l /home
> drwxr-xr-x 33 paco usuarios 4096 nov 20 14:23 paco
>
> ls -l /home/paco
> drwxr-xr-x 9 paco usuarios 4096 nov 14 19:09 public_html
>
> Pues sí que funciona y muy bien por cierto, pero esto genera un
> problema de seguridad, ya que cualquier usuario que tenga acceso al
> sistema puede ver las capetas personales de los demás usuarios.
>
> Así como por ejemplo, yo soy usuario del servidor y quiero tener
> una página web, pero eso implica que el resto de los usuarios pueden
> acceder a los archivos que guardo.
Simple.
Apache corre como el usuario www-data. Como puedes ver, el usuario
www-data pertenece al grupo www-data:
$ grep www /etc/passwd
www-data:x:33:33:www-data:/var/www:/bin/sh
$ grep 33 /etc/group
www-data:x:33:
----------------
Con esta información en mente, pasemos un poquito a hablar de los permisos
de tu directorio. Qué significan los permisos de lectura (r, valor octal
4) y ejecución (x, valor octal 1) en un directorio? El de lectura
significa que puedo pedir el listado de archivos. El de ejecución
significa que puedo entrar al directorio en cuestión, y trabajar en él
siempre que sepa el nombre del archivo que busco. Te pongo un ejemplo:
Primero que nada, creo un directorio y le pongo un archivo dentro:
/tmp$ mkdir prueba
/tmp$ cat > prueba/prueba.txt
Esta es una prueba.
/tmp$ ls -la prueba
total 12
drwxr-xr-x 2 gwolf gwolf 4096 Nov 21 09:56 .
drwxrwxrwt 6 root root 4096 Nov 21 09:55 ..
-rw-r--r-- 1 gwolf gwolf 20 Nov 21 09:56 prueba.txt
Ahora, lo pongo en un modo restrictivo, permitiéndome sólo la ejecución
del directorio:
/tmp$ chmod 100 prueba/
/tmp$ ls -la prueba
ls: prueba: Permission denied
/tmp$ cat prueba/prueba.txt
Esta es una prueba.
Como puedes ver, ejecutar el directorio no me permite ver el listado de
archivos, pero sí usarlos. Ahora, veamos si doy únicamente lectura:
/tmp$ chmod 400 prueba/
/tmp$ ls -la prueba
ls: prueba/.: Permission denied
ls: prueba/..: Permission denied
ls: prueba/prueba.txt: Permission denied
total 0
/tmp$ cat prueba/prueba.txt
cat: prueba/prueba.txt: Permission denied
Suena curioso, verdad? Pues no, es bastante lógico: Pude ver el contenido
del directorio, pero no pude tocar nada de lo que está dentro - El comando
ls hace un 'stat' a cada archivo para ver su modo, tamaño, fecha de
modificación y demás atributos. Con estos mismos permisos, puedo emular un
ls básico perfectamente (meto un poco de mano para que maneje los
archivos iniciados en '.':
/tmp$ for arch in prueba/.* prueba/*; do echo $arch; done
prueba/.
prueba/..
prueba/prueba.txt
----------------
Ahora, apliquemos esto a tu directorio: Quieres que ningún usuario pueda
entrar a tu directorio, y que el usuario www-data pueda entrar hasta tu
public_html. Para ello, yo te sugiero:
~$ su
Password:
/home/gwolf# ls -ld .
drwxr-xr-x 35 gwolf gwolf 4096 Nov 21 08:53 .
/home/gwolf# chgrp www-data .
/home/gwolf# chmod 710 .
/home/gwolf# ls -ld .
drwx--x--- 35 gwolf www-data 4096 Nov 21 08:53 .
/home/gwolf# ls -ld public_html/
drwxr-xr-x 7 gwolf gwolf 4096 Nov 21 09:11 public_html/
De este modo:
1. Ningún usuario que no pertenezca a www-data (o no seas tú) puede hacer
nada en tu home
2. Los miembros del grupo www-data pueden ejecutar tu home, pero no
listarlo.
3. Todo quien tenga derecho de llegar a tu public_html tiene acceso de
lectura y ejecución
Claro, podrías acá también limitar a tu public_html a www-data únicamente.
Podrías usar varios esquemas diferentes, se me ocurrieron ya varios, pero
es hora de que siga trabajando ;-)
Saludos,
--
Gunnar Wolf - gwolf@campus.iztacala.unam.mx - (+52-55)5623-1118
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
Reply to: