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
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)
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
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