sábado, 22 de septiembre de 2012

Compartir una carpeta con todos los privilegios


Todo esto empezó porque un buen día puse LMDE en el ordenador de casa y mi mujer me preguntó que donde estaban las fotos de las vacaciones. Como Linux es un sistema multiusuario cuando lo instalé configuré dos usuarios, así cada cual podría colocar sus archivos como quisiera y evitaba conflictos familiares por el desorden del escritorio.

Obviamente, aunque seamos distintos usuarios nos vamos juntos de vacaciones y tenemos una hija en común (cosas de la vida real), por lo que a la inmensa mayoría de las imágenes y vídeos que hay en el ordenador queremos tener acceso los dos, y claro, no es cuestión de tirar gigas de disco duro duplicando los archivos, además el acceso tiene que ser de verdad, es decir para poder hacer lo que queramos. Así que guardé los archivos de marras en las carpeta imágenes de mi usuario y en el de mi mujer cree un enlace a esa carpeta y ya está …. pues no, fue entonces cuando descubrí unas cosas llamadas permisos, propietarios, grupos, etc.

Un poco desbordado por el tema decidí recurrir a nuestro maestro Frannoe, pensaba yo que esto tenía que ser una cosa muy simple, a fin de cuentas existen muchas parejas en el mundo usando Linux. Lamentablemente para mi Frannoe no tenía la respuesta en el cajón y había que investigar un poco, y después de encontrar una manera de hacerlo, y a petición suya, me he puesto a escribir estas líneas.

No voy a contar nada que no se pueda encontrar en la red, pero voy a tratar de dejarlo claro, y sobre todo agrupado en un sólo lugar. Empezaré con un pequeño resumen sobre los permisos para no liarnos.

Cuando se crea un usuario en el sistema, automáticamente se crea un grupo con igual nombre y cuyo único miembro, de momento, es el usuario creado.

Cada documento (carpetas y archivos) tiene asociado un propietario y un grupo. Por defecto el propietario es el usuario que lo crea y el grupo es aquel definido para el propietario. El usuario root puede cambiar al propietario, y este puede cambiar el grupo.

Esto se puede hacer gráficamente (botón derecho del ratón-propiedades-permisos) o a través de la consola mediante los comandos chown (change owner: cambiar propietario) y chgrp (change group: cambiar grupo) la sintaxis es: “comando [opciones] usuario archivo(s)”. Una opción muy útil cuando modificamos una carpeta es hacer los cambios recursivamente para que estos se apliquen a todo el contenido de la carpeta original, para ello después del comando ponemos “-R”.

Todos los documentos tienen tres niveles de permisos, los correspondientes al propietario, al grupo y los establecidos al resto de los usuarios. Estos permisos definen lo que puede hacer un usuario y se reducen a tres: lectura (r), escritura (w) y ejecución (x).

PERMISO
ARCHIVO
CARPETA
Lectura
Ver el contenido del archivo
Ver el nombre de los archivos dentro del directorio (pero sin poder saber nada más sobre ellos como: el tipo de archivo, tamaño, propietario, permisos, etc. )
Escritura
Modificar o eliminar el archivo
Agregar, eliminar y renombrar archivos del directorio
Ejecución
Ejecutar el archivo
Recorrer su árbol para acceder archivos y subdirectorios, pero no ver los archivos dentro del directorio (excepto que se le de el permiso de lectura)

Se pueden cambiar los permisos de forma gráfica (botón derecho del ratón-propiedades-permisos) o a través de la consola mediante el comando chmod (change mode: cambiar modo [permiso]), la sintaxis es: “comando [opciones] permisos archivo(s)”. Al igual que antes podemos hacer los cambios recursivamente para que estos se apliquen a todo el contenido de la carpeta original añadiendo después del comando “-R”.

Los permisos se establecen para el propietario, para el grupo y para los otros, se puede usar el modo octal (en base ocho) o simbólico. En el cuadro de abajo se ven las equivalencias de uno y otro.

Número
Simbólico (Binario)
Lectura
Escritura
Ejecución
0
--- (000)
NO
NO
NO
1
--x (001)
NO
NO
SI
2
-w- (010)
NO
SI
NO
3
-wx (011)
NO
SI
SI
4
r-- (100)
SI
NO
NO
5
r-x (101)
SI
NO
SI
6
rw- (110)
SI
SI
NO
7
rwx (111)
SI
SI
SI

Bueno, vamos a dejarnos de rollo y nos centramos en lo que queremos: tener una carpeta en el ordenador al que puedan acceder los usuarios que definamos con todos los privilegios.

Primero creamos el grupo "compartir" al que vamos a añadir todos los usuarios que vayan a compartir la carpeta. Obviamente al grupo le podemos llamar como queramos. Después, la carpeta seleccionada para compartir entre los usuarios la asignamos al grupo "compartir" antes creado.

Modificamos los privilegios de la carpeta asignando los que consideremos necesarios, en nuestro caso hemos decidido que todos los usuarios seleccionados deben acceder con privilegios totales por lo que hacemos "sudo chmod -R 775" en la carpeta. De esta forma conseguimos que todos los usuarios del grupo tengan acceso con permisos de lectura y escritura a los archivos ya existentes. El resto de usuarios sólo tendrán acceso de lectura.

Ahora ya puedo compartir la fotos de las vacaciones con mi mujer …. pues no, las de las pasadas vacaciones si, pero como nos vayamos a la playa y queramos añadir las fotos de los nuevos chapoteos estos archivos serán propiedad del usuario que los descargue de la cámara de fotos y pertenecerán a su grupo, y aunque los guarde en la carpeta “compartir” no vamos a poder acceder a ellos a menos que les cambiemos los permisos como hemos hecho antes, y eso claro está, no es lo que queremos.

Permisos especiales: Los bits SUID, SGID y sticky.

Los permisos de los archivos en Unix se corresponden con un número en octal que varía entre 000 y 777; sin embargo, existen unos permisos especiales que hacen variar ese número entre 0000 y 7777: se trata de los bits de permanencia (1000), SGID (2000) y SUID (4000).
El sticky bit o bit de permanencia se activa sumándole 1000 a la representación octal de los permisos de un determinado archivo y otorgándole además permiso de ejecución. Si el bit de permanencia de un fichero está activado le estamos indicando al sistema operativo que se trata de un archivo muy utilizado, por lo que es conveniente que permanezca en memoria principal el mayor tiempo posible; esta opción se utilizaba en sistemas antiguos que disponían de muy poca RAM, pero hoy en día prácticamente no se utiliza. Lo que si que sigue vigente es el efecto del sticky bitactivado sobre un directorio: en este caso se indica al sistema operativo que, aunque los permisos normales digan que cualquier usuario pueda crear y eliminar ficheros (por ejemplo, un 777 octal), sólo el propietario de cierto archivo y el administrador pueden borrar un archivo guardado en un directorio con estas características.

El bit de SUID o
setuidse activa sobre un fichero añadiéndole 4000 a la representación octal de los permisos del archivo y otorgándole además permiso de ejecución al propietario del mismo. El bit SUIDactivado sobre un fichero indica que todo aquél que ejecute el archivo va a tener durante la ejecución los mismos privilegios que quién lo creó; dicho de otra forma, si el administrador crea un fichero y lo setuida, todo aquel usuario que lo ejecute va a disponer, hasta que el programa finalice, de un nivel de privilegio total en el sistema.

El bit
setgid hace lo mismo pero a nivel de grupo del fichero en lugar de propietario: todo usuario que ejecute un programa setgidadotendrá los privilegios del grupo al que pertenece el archivo. Para activar el bit de setgidsumaremos 2000 a la representación octal del permiso del fichero y además habremos de darle permiso de ejecución a la terna de grupo. Si el fichero es un directorio y no un archivo plano, el bit setgidafecta a los ficheros y subdirectorios que se creen en él: estos tendrán como grupo propietario al mismo que el directorio setgidado, siempre que el proceso que los cree pertenezca a dicho grupo.

Y aquí es donde quería llegar. Si modificamos los permisos de la carpeta “compartir” de la siguiente forma “sudo chmod -R 2775” forzamos a que los nuevos archivos y carpetas que cualquier usuario cree dentro de esa carpeta pertenezcan al grupo "compartir". Esto está muy bien, porque a partir de ahora los nuevos documentos creados dentro de esta carpeta serán accesibles a todos los usuarios que pertenezcan al grupo. Pero todavía no es lo que queremos, ya que el acceso que van a tener los usuarios que no sean los propietarios a los archivos de nueva creación será de sólo lectura.

Umask.

Las carpetas se pueden crear con permisos 777 y los archivos con permisos 666 ya que el sistema no permite que los archivos se creen con los permisos de ejecución activados. El que esto pueda ser así no significa que efectivamente lo sea.

Cuando creamos un archivo en nuestro sistema por defecto se le asignan permisos de lectura y escritura tanto para el propietario como para todos los demás, los permisos pueden ser modificados para que se asignen otros permisos distintos a los que vienen por defecto en la distribución, ésto lo logramos mediante el comando umask.

Hay dos formas de cambiar el valor de los permisos por defecto, una temporal que es ejecutando el comando desde la consola, y que durará mientras nos encontremos activos en esa consola y la otra es hacerla de manera permanente modificando el archivo .profile (esto lo deduje siguiendo el método de prueba y error, pero este archivo sólo lo vi en lmde, en la versión basada en ubuntu no existe, pero podemos crearlo y funciona igual) que se encuentra en nuestra carpeta home y que afectará solo a nuestro usuario, o modificando el archivo /etc/profile para que afecte a todos los usuarios del sistema.

Al abrir este archivo se puede leer lo siguiente:

# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.

Revisando /etc/login.defs podemos modificar umask, pero no he sido capaz de que funcione, aunque cambie el valor de umask los permisos no se modifican.

Para determinar los permisos de creación de archivos y de directorios restamos el valor que le hemos dado a umask a los permisos base, si creamos un archivo se lo restamos a los permisos base de los archivos que son 666 y en caso de ser un directorio lo que se hace es restárselo a los permisos base de los directorios que son 777. De esta forma si hacemos “umask 022” los permisos quedan 644 (lectura y escritura para el propietario y sólo lectura para el grupo y otros) para archivos y 755 (lectura, escritura y ejecución para el propietario, y lectura y ejecución para el grupo y otros) para carpetas.

Para lograr por fin nuestro objetivo de compartir una carpeta con plenos priviliegios para los usuarios seleccionados tenemos que modificar los permisos de creación de archivos de manera que estos usuarios creen los archivos con permisos de lectura y escritura para el grupo.

Para ello debemos editar el archivo /home/usuario/.profile de cada uno de los usuarios y donde dice:
# umask 022
cambiamos por:
umask 002

A modo de resumen:
  • He conseguido compartir una carpeta entre varios usuarios de LMDE dando permisos completos.
  • Sólo lo he podido hacer modificando el archivo .profile de cada usuario
  • Para hacerlo en Linux Mint Maya creamos un archivo en blanco llamado .profile en la carpeta del usuario y editándolo ponemos umask 002
  • Diversos métodos que he leído en la red que hacen referencia a los archivos .bashrc .bash_profile situados en la carpeta del usuario y a /etc/profile no he sido capaz de hacerlos funcionar
Fuentes:
Wikipedia

6 comentarios:

  1. Muchas gracias Luis por toda esta información. Muchos (por no encontrarse en el caso) no habrán ni tan siquiera caído en existencia de este problema.
    A priori parecería sencilla la posibilidad de compartir carpeta y archivos entre diferentes cuantas de Usuarios (no confundir con la compartición en RED), pero rápidamente uno se da cuenta de que no es tan sencillo como pueda parecer.

    Gracias nuevamente Luis por compartir en LMDE Cosillas toda esta gran información que quedará aquí para quien la pueda necesitar.
    Personalmente te estoy muy agradecido.

    ResponderEliminar
  2. Estimado Luis, excelente aporte.
    Muchas gracias !!
    Romina

    ResponderEliminar
  3. claudia (la despist'a...)22 de diciembre de 2012, 23:45

    ¡Y yo que me estaba volviendo loca porque a mi tampoco me funcionaba...!!! :-)
    De todos modos una pregunta...
    ¿por que todos los directorios tienen permiso → 40750
    Ese cuatro ¿No se puede sacar...?
    ¿Interpreto mal... o eso quiere decir que to'el mundo puede leer to'... COMO SI FUERA PROPIO...?
    A mi tanta generosidad en los permisos no me gusta na'...
    precisamente porque soy muy burra...

    Bueno... unos besotes navideños pa to's...

    ResponderEliminar
  4. claudia (la despist'a...)23 de diciembre de 2012, 1:07

    Otra pregunta Frann...
    ¿Donde creas la carpeta a compartir...?

    1) ¿Cuelga de la raiz del sistema... ?
    2) ¿cuelga de /home? como si fuera un usuario mas de home...?
    3) ¿esta dentro de la carpeta de algunos de los usuarios de /home...?

    Por ejemplo...
    Para este matrimonio del ejemplo de Luis...
    supongamos que la mujer se llama Maria
    por lo tanto su /home es:

    /home/luis
    /home/maria

    Bien...
    la carpeta a compartir...
    ¿esta
    - dentro del usuario /home/luis o
    - dentro del usuario /home/maria...?

    En ese caso:
    Cualquiera de ellos
    tiene que permitir el acceso
    a cualquier 'otro' ¿O no...?

    Lo que no creo que sea del todo recomendable...

    Este tema --al que le estoy hincando los dientes ahora...
    es mas sencillo en la libreta que en la practica...
    Y es uno de los mas basicos que hace a la seguridad...
    por eso me parece importante que le demos un lugar...

    Y como decia Luis: no hay manera de cambiar el Umask
    si se siguen los tutos de la red...

    NO se donde estaran las fuentes de LMDE...
    ni porque han decidido los desarrolladores
    hacer las cosas asi...
    (como el 4000 de los directorios y el 1000 de los archivos
    predefinidos...
    Me alucina o no entiendo bien...)

    Pero bueno... va quedando planteado el tema...
    y ya se vera (veras...? ;-) como enterarnos

    Y por supuesto... sin apuros ni na'...

    Simplemente queda registrado
    como una de las caracteristicas
    accesibles a los usuarios
    que nos genera una pregunta...

    Como siempre... unos besotes...
    sólo que estos...
    un poco mas apretujados y ruidosos...

    (que el ruido de los besos
    esta vez...
    tiene que llenar el espacio interestelar...:-)

    ResponderEliminar
  5. claudia (la perseverante... ;-)23 de diciembre de 2012, 3:10

    Frann
    ayer... ante la imposibilidad de cambiar los permisos de umask
    por donde decian los tutos...
    le dije al buscador de archivos
    que me diera todos los archivos que tuvieran escrita la palabra umask...

    Ahi encontraría alguno
    que fuera el que lo definía...

    Entre los tantos que me dio...
    (muchisimos mas de los que me imaginaba)
    aparecio este:

    etc/syslog.conf

    Y ahi estas lineas:

    #
    # Set the default permissions for all log files.
    #
    $FileOwner root
    $FileGroup adm
    $FileCreateMode 0640
    $DirCreateMode 0755
    $Umask 0022

    #

    ¿No sera eso lo que estamos buscando...?
    Suena raro donde aparece...
    Pero es que tiene que estar en algun lugar raro...
    porque sino...
    apareceria en los lugares que se nombran en los tutos... ¿no...?

    Bss...
    cl

    ResponderEliminar
  6. claudia (agradeciendo... ;)24 de diciembre de 2012, 0:11

    bon dia als dos i a tots també ... clar ;-)

    Muchas gracias por las explicaciones y el enlace...
    Ya lo anexe.... pa' dentro de unos dias...

    En cuanto al nombre del archivo... tenes razón... Luis...
    sí que es rsyslog...
    pero me da la impresion de que en el encabezado (del mismo archivo) se quita la r...
    porque lo que copie y pegue... es su texto...

    Por lo demas... el umask que indica ahi... ¿no es el que le cambia los permisos a to'el sistema...?

    Bueno... unos besotes
    y a preparar el alma y la mesa
    para esta navidad tan... pero tan especial
    para tantos...

    ResponderEliminar