martes, 19 de enero de 2016

Permisos en Linux: uso de los comandos chmod y umask.


Desde que a GNU/Linux se accede con un rico interface gráfico, como Gnome o KDE, cuando necesitamos modificar los permisos de acceso a archivos o directorios lo hacemos generalmente a través de la hoja de propiedades del gestor de ficheros.

Pero, de vez en cuando, nos encontramos con que nos dan alguna instrucción del estilo; “cambia los permisos a 755″ o “ponle una máscara 022″ ¿ Pero qué es eso de 755 y 022 ? O bien quedamos algo desconcertados cuando, en Ubuntu, vemos que podemos leer los directorios home de otros usuarios ¿ Cómo es posible ?



Supongamos el siguiente directorio:

jdoe@ubuntu:~$ ls -l
drwxr-xr-x 2 jdoe migrupo 4096 2008-07-05 1:05 midirectorio
-rw-r--r-- 1 jdoe migrupo    12 2008-07-05 1:10 test



Tenemos un único fichero denominado “test” creado por nosotros al que se le han dado, por omisión, los permisos rw-r--r-- y un directorio “midirectorio” también con sus permisos por defecto rwxr-xr-x.

Observese que nos olvidamos de la primera letra o guión de la serie. En el caso del archivo, un guión “-”, y en el del directorio una “d”. Este primer carácter tiene un significado ajeno a los permisos, e indica el tipo de entrada.

Los tres primeros caracteres (-rw) representan los permisos del usuario propietario del archivo (jdoe), los tres siguientes (r- -) los del grupo al que pertenece el archivo (migrupo) y los tres últimos (r- -) al resto de los usuarios.

A su vez los permisos asignables son tres: lectura/read (r), escritura/write (w) y ejecución/execute (x). Como se intuye si aparece un guión en un lugar determinado significará que el usuario, o conjunto de usuarios afectados, no tiene ese permiso. Así los miembros del grupo “migrupo” (r - -) tienen solo permiso de lectura, pero no de escritura ni de ejecución, ya que aparece un guión en lugar de la “w” y de la “x”. 


Un poco de aritmética binaria

Tomemos los permisos y sustituyamos, por un “0″ los guiones y, por un “1″ cualquier letra que aparezca en su lugar y hagamos la conversión de binario a decimal octal (Con tres bits solo se puede representar del 0 al 7). Los permisos, para el archivo y directorio, nos quedarían de la siguiente forma:

Afecta
Permiso
Binario
Octal

usuario
rw-
110
22+21+0=6
644
grupo
r- -
100
22+0+0=4

resto
r- -
100
22+0+0=4


Afecta
Permiso
Binario
Octal

usuario
rwx
111
22+21+20=7
755
grupo
r-x
101
22+0+20=5

resto
r-x
101
22+0+20=5


Simplificando

Octal
Permisos
0
- - -
1
- - x
2
- w -
3
- w x
4
r - -
5
r - x
6
r w -
7
r w x


Realmente tampoco es necesario hacer este cálculo cada vez que necesitemos saber la representación numérica de los permisos.Es sencillo de recordar al adquirir mas experiencia con esto.

Otra manera de verlo más simple, si miramos la tabla adjunta, es tener solo en cuenta que 4 es el permiso de lectura, 2 el de escritura y 1 el de ejecución. Así si tenemos que conceder el permiso de lectura y escritura este sera: 4+2 = 6. Si, en vez, fuera conceder lectura y ejecución 4+1 = 5.

Los permisos más habituales son 755, 750, 644 y 640. El permiso 777 es “peligroso” ya que concedemos todos los permisos a todos.


Modificando los permisos

El comando para modificar los permisos es chmod. Como casi todos los comando *NIX , el mismo es muy flexible. Sin ánimo de hacer un tutorial exhaustivo, veamos algunos de sus usos:

Supongamos que el fichero test creado al principio, fuera un script en bash y queremos concederle permisos de ejecución al usuario y al grupo, y retirar el permiso de lectura a los otros usuarios.


Una manera sería redefinir totalmente los permisos al archivo: Es la forma “larga”, pero más intuitiva:

chmod u=rwx,g=rx,o= test

La variante es solo consignar las modificaciones sobre el estado original:

chmod ug+x,o-r test

Es decir que “sume” (+) el permiso de ejecución a usuario (u) y grupo (g), y que “reste” (-) el permiso de lectura a otros usuarios (o)


Ahora bien lo más rápido es esto:

chmod 750 test


En los tres casos el resultado será el mismo:

-rwxr-x--- 1 jdoe migrupo   12 2008-07-05 02:15 test


Como segundo ejemplo supongamos que queremos retirarle el permiso de lectura y ejecución al directorio midirectorio y también a todos los archivos y subdirectorios en él contenidos a los otros usuarios.

chmod -R o-rx midirectorio

La opción -R le indica a chmod que haga la operación recursivamente en todo su contenido.


La máscara de permisos

Al principio creamos un archivo test y un directorio midirectorio, pero al crearlos no necesitamos asignarles ningún permiso. El sistema mantiene un valor denominado umask que determina los permisos, por omisión, cada vez que creamos un archivo o directorio. Y que puede ser modificado en cualquier momento con el comando umask.

Cuando creamos el fichero test con el editor de textos este quiso asignarle, al grabarlo, unos permisos de 666. Es decir lectura/escritura para todos. Pero el valor de umask era de 022. Lo que dio como resultado unos permisos de 644 para el archivo.

De manera análoga cuando creamos el directorio con mkdir midirectorio el sistema quiso asignarle unos permisos de 777, es decir, lectura/escritura/ejecución para todos. Pero se topó con la máscara anterior (022) y dio como resultado unos permisos de 755 para midirectorio.

Un poco de lógica binaria

Este valor de umask actúa una máscara binaria, sobre los permisos máximos que intenta otorgarle el sistema:

umask 022                    000 010 010        000 010 010

complemento a 1 de umask     111 101 101        111 101 101
And (&&)                     110 110 110 (666)  111 111 111  (777)
                             ------------       ------------
                             110 100 100 (644)  111 101 101  (755)

O, mucho más sencillo, como una simple “resta” de permisos:

   666           777
   022 (-)       022 (-)
   ----          ----
   644           755


Ubuntu: umask en la práctica

La máscara 022 es la que trae preconfigurada Ubuntu para cuando se añade un usuario. Esta máscara, si es un sistema compartido, es demasiado liberal pues permite que cualquier usuario pueda leer y ejecutar los archivos de los directorios HOME de los otros usuarios.

Podemos cambiar este valor en cualquier momento. 
Para prohibir la lectura/escritura/ejecución a los otros usuarios, basta con ejecutar:

umask 027

Este valor se mantendrá activo durante la sesión del usuario, y será válido para los archivos y directorios de nueva creación, pero se restaurará a 022 la próxima vez que nos conectemos y no modificará los archivos y directorios del perfil del usuario ya creados.

Para “corregir” los perfiles existentes podríamos usar, por ejemplo en el caso del usuario “jdoe”:

chmod -R o-rwx /home/jdoe

Y editando el fichero /home/jdoe/.profile descomentar y modificar a umask 027 para hacer permanente el ajuste para el futuro. Aunque esta modificación afectaría solo al usuario “jdoe”.

Para que a partir de ahora todos los nuevos usuarios se creen sin permisos de lectura/escritura/ejecución para todos:

  • Editamos el perfil común /etc/profile y hacemos la misma modificación: umask 027
  • Editamos el /etc/adduser.conf y modficamos: DIR_MODE=0750. Este ajuste no es extrictamente necesario y lo que hará es que ni siquiera podamos entrar al directorio HOME del usuario con cd

Tener en cuenta que cuaquier usuario puede sobreescribir este valor de umask, ya sea desde la línea de comandos o modificándolo en su $HOME/.profile, sin el concurso del Administrador.

Puede ser que nos encontremos valores de chmod o umask con cuatro digitos. Por ejemplo umask 0022. El primer digito representa a tres bits de permisos especiales, que aquí no tratamos, y que se usan poco en la operativa normal.

No hay comentarios:

Publicar un comentario