Esta página puede ser redistribuida libremente bajo los términos de la licencia GPL. Vease ( GPL texto original ) o si lo prefiere (Traducción española no oficial de la GPL) Al margen de las obligaciones legales que se derivan del uso de esta licencia rogamos sea respetada la referencia a su lugar de publicación original www.ciberdroide.com. y a su autor original Antonio Castro Snurmacher (Madrid 01/01/2000).

Ausencia de Garantía

Esta ausencia de garantía se hace extensa a cualquier tipo de uso de este material y muy especialmente a las prácticas, ejercicios, y de ejemplos que encuentre en estas páginas. Deberá trabajar siempre salvo indicación contraria con un SO Linux y con un usario distinto de 'root' sin privilegios especiales. Como directorio de trabajo se procurará usar el directorio '/tmp' o algún otro que no contenga información valiosa. Tampoco se considera buena idea practicar en una máquina que contenga información valiosa.

Todo esto son recomendaciones de prudencia. En cualquier caso si algo sale mal toda la responsabilidad será únicamente suya. En ningún caso podrá reclamar a nadie por daños y perjuicios derivados del uso de este material. Para más información lea el contenido de la licencia GPL y abstengase de hacer prácticas si no está dispuesto a asumir toda la responsabilidad.

...
..

SISTEMA DE FICHEROS Segunda parte

Permisos de ficheros
Usaremos el término fichero en su sentido más amplio. Es decir que el tema de permisos es aplicable a distintos tipos de ficheros con algunas matizaciones que explicaremos más adelante. Los ficheros tienen muchos atributos además de su nombre. Para ver los más significativos haremos:

$ ls -l /

Supongamos que tenemos el siguiente fichero llamado 'kkkkk'

-rwxrwxrwx  1 root root  14740 abr 15 12:05 kkkkk
^^^^^^^^^^  ^  ^    ^      ^    ^   ^  ^  ^  ^
||||||||||  |  |    |      |    |   |  |  |  |__nombre del fich.
||||||||||  |  |    |      |    |   |  |  |
||||||||||  |  |    |      |    |   |  |  |__minutos : Fecha y 
||||||||||  |  |    |      |    |   |  |_____hora    : hora de la
||||||||||  |  |    |      |    |   |____día del més : última
||||||||||  |  |    |      |    |________més         : modificación
||||||||||  |  |    |      |
||||||||||  |  |    |      |___________ Tamaño en bytes
||||||||||  |  |    |         
||||||||||  |  |    |_______nombre del grupo
||||||||||  |  |____________nombre del propietario del fichero       
||||||||||  | 
||||||||||  |_______________número de enlaces rígidos (hard links)
||||||||||   
||||||||||___001____________ permiso de ejecución para : Un usuario 
|||||||||____002____________ permiso de escritura para : cualquiera
||||||||_____004____________ permiso de lectura para   :
|||||||     
|||||||______010____________ permiso de ejecución para : Un usuario 
||||||_______020____________ permiso de escritura para : pertene-
|||||________040____________ permiso de lectura para   : ciente al 
||||                                                    : grupo
||||         
||||_________100____________ permiso de ejecución para : El usuario
|||__________200____________ permiso de escritura para : propieta-
||___________400____________ permiso de lectura para   : rio
|            
|____________________________tipo de fichero
                               -  Fichero regular (fichero normal)
                               d  Directorio
                               l  Enlace simbólico
                               p  Fifo con nombre
                               b  Dispositivo de bloques
                               c  Dispositivo de caracteres
En inglés se usan los términos owner , group, y others para designar respectivamente al propietario, al grupo y a cualquier usuario.

Notación numérica para permisos
Recuerde que también tenemos que pensar en la posibilidad de que mi amigo David acostumbrado al uso del azadón decida hacer este curso y teníamos un compromiso de explicar las cosas partiendo de cero. Los permisos de los ficheros son almacenados en formato binario y se puede referenciar numéricamente. Vimos que a cada permiso individual le asociabamos un número de tres dígitos formado por dos ceros y un tercer número que podía ser unicamente 1, 2, o 4. Por ejemplo el permiso de escritura para un usuario cualquiera era 002. Con estos números se puede codificar los permisos de la forma que indicamos en el siguiente ejemplo:

r w x - - w x - r - x     Esto equivaldría a un permiso     735  
4 2 1 - 0 2 1 - 4 0 1     ( 4+2+1 ,  0+2+1 , 4+0+1  = 7,3,5 )

Los permisos también pueden representarse como una secuencia de bits. Un bit es un valor que solo puede valer 0 o 1. En el caso anterior podríamos representarlo de la forma 111 010 101 donde 1 indica que si hay permiso 0 que no lo hay y la posición de cada 0 y cada 1 representa a cada uno de los permisos.

Umask
Es un comando interno del bash. Se utiliza cuando se crean ficheros.

No podemos profundizar mucho en temas de matemática binaria porque nos saldriamos del tema pero la umask se aplica mediante una operación llamada AND NOT.

Consiste en tomar a umask como una máscara donde los bits a 1 especifican los bits de permisos que se pondrán a cero.

Por ejemplo si queremos abrir un fichero con permisos 664 y tenemos una umask de 022 obtendremos un fichero 644.

			 
     664   110 110 100
     022   000 010 010
     -----------------
     644   110 100 100

Esto tiene la utilidad de proteger el sistema frente a cierto tipo de descuidos durante la creacion de ficheros.

Por ejemplo supongamos que un administrador de un sistema considera que por defecto todos los ficheros que el crea deberían carecer de permisos de ejecucion y de escritura para todo el mundo y que para los usuarios de su mismo grupo de berían de carecer de permiso de ejecución. Para ello establecerá una 'umask = 023'. Es decir una umask que elimina los permisos - - - . - w - . - w x

Para un script que genere ficheros que solo deban ser accesibles para el usuario que los ha generado usaríamos. 'umask = 077'

Comando chmod
Este comando sirve para alterar una serie de atributos del fichero Existe dos formas de usarlo. Una indicando el tipo de acceso y a quien lo queremos conceder o eliminar. Existen una serie de atributos que se pueden modificar usando este comando.

 04000   Set uid on execute.
 02000   Set gid on execute.
 01000   Save text on image after execution. 
 00400 r Permiso de lectura para el propietario   (owner)
 00200 w Permiso de escritura para el propietario
 00100 x Permiso de ejecución para el propietario
 00040 r Permiso de lectura para el grupo         (group)
 00020 w Permiso de escritura para el grupo
 00010 x Permiso de ejecucion para el grupo
 00004 r Permiso de lectura para cualquiera       (others)
 00002 w Permiso de escritura para cualquiera
 00001 x Permiso de ejecucion para cualquiera

Los atributos Set uid, Set gid, y Save text no los explicaremos de momento.

Consulte las páginas del manual relativas a este comando. Como de costumbre el manual resulta imprescindible a la hora de recordar la utilización de un comando pero no a la hora de comprender conceptos nuevos. No se preocupe con los ejercicios que le proponemos a continuación comprenderá perfectamente:

$ cd /tmp
$ echo > kk
$ ##################################
$ chmod 777 kk
$ ls -l kk

-rwxrwxrwx  .... .... ......

$ ##################################
$ chmod 707 kk
$ ls -l kk

-rwx---rwx  .... .... ......

$ ##################################
$ chmod 421 kk
$ ls -l kk

-r---w---x  .... .... ......

$ ##################################
$ chmod 124 kk
$ ls -l kk

---x-w-r--  .... .... ......

$ ##################################
$ # 'chmod 0 kk'  equivale a 'chmod 000 kk'
$ chmod 0 kk
$ ls -l kk

----------  .... .... ......

$ ##################################
$ chmod +r kk
$ ls -l kk

-r--r--r--  .... .... ......

$ ##################################
$ chmod +x kk
$ ls -l kk

-r-xr-xr-x  .... .... ......

$ ##################################
$ chmod -r kk
$ ls -l kk

---x--x--x  .... .... ......

$ ##################################
$ chmod u+r kk
$ ls -l kk

-r-x--x--x  .... .... ......

$ ##################################
$ chmod a-x kk
$ ls -l kk

-r--------  .... .... ......

$ ##################################
$ chmod g+x kk
$ ls -l kk

-r----x---  .... .... ......

$ ##################################
$ chmod o+x kk
$ ls -l kk

-r----x--x  .... .... ......

$ ##################################
$ chmod a+rwx kk
$ ls -l kk

-rwxrwxrwx  .... .... ......

rm kk

Comando chown

El comando 'chown' sirve para cambiar el UID y el GID de un fichero. Esto solo se puede hacer si tenemos los permisos para ello. Normalmente su uso está reservado a 'root' y por ello no diremos nada más. Es muy posible que si usted usa Linux en un ordenador personal necesite algunos de estos conocimientos pero se sale de los propósitos de este curso. Le basta con saber que existe y para que sirve.

Concesión de acceso por parte del kernel
Explicaremos el funcionamiento de los permisos de la forma más precisa que nos sea posible.

Para ello usaremos unas abreviaturas que ya conocemos.

En realidad hablamos de propietario como el usuario que creo el fichero. El Kernel realizará el siguiente test para conceder a un proceso el acceso de cierto tipo a un fichero.

  1. Si el EUID del proceso es 0 se da acceso. (root puede hacer lo que sea)

  2. Si el EUID del proceso es igual al UID del owner (propietario del fichero) se concede el acceso si los permisos de usuario rwx son los adecuados.

  3. Si el EUID del proceso es distinto al UID del owner, y si el EGID del proceso es igual al GID del owner, se concede el acceso si los permisos de grupo rwx son los adecuados.

  4. Si el EUID del proceso es distinto al UID del owner, y si el EGID del proceso es distinto al GID del owner, se concede el acceso si los permisos de others rwx son los adecuados.

NOTA el comando rm permite borrar cualquier fichero sea cual sean los permisos cuando el proceso tiene un EUID coincidente con el propietario del fichero. Unicamente ocurre que si el fichero esta protegido contra escritura suele pedir (dependiendo de la configuración) confirmacion antes de borrarlo. El permiso para borrar un fichero no se guarda como atributo del fichero. Esto se hace a nivel de directorio y pasamos a explicarlo inmediatamente.

Significado de los permisos en directorios
Para entender como funcionan los permisos aplicados a un directorio hay que imaginar que un directorio es un fichero normal que solo contiene una tabla en la que se relacionan los ficheros presentes en ese directorio. En todos los directorios existen siempre un par de entradas obligadas que son '.' y '..' para el directorio actual y para el directorio padre respectivamente. Vamos a explicarlo sobre la marcha a la vez que hacemos el ejercicio. Recuerde usar un usuario normal (distinto de root) para realizar los ejercicios.

$ cd /tmp
$ mkdir kk
$ cd kk
$ echo > k1
$ echo > k2
$ cd /tmp
$ chmod 777 kk
$ ## Para ver como ha quedado los permisos hacemos ...
$ ls -ld kk

drwxrwxrwx   2 ..... ...... kk

$ ## Para ver que ficheros contiene el directorio kk hacemos ...
$ ls  kk

k1 k2

Si un directorio no tiene permiso de lectura, resultara imposible para cualquier comando incluido ls averiguar cual es su contenido.

Sin abandonar la sesión anterior continuamos el ejercicio

$ ###(1)###
$ ## Eliminamos los premisos de lectura del directorio kk
$ chmod -r kk
$ ls -ld kk

d-wx-wx-wx   2 ..... ...... kk

$ ls -l kk

ls: kk: Permiso denegado
$ ## En este intante podemos entrar dentro del directorio
$ ## Incluso podemos crear un nuevo fichero pero ya no podemos
$ ## Saber cual es el contenido del directorio. 
$ cd kk
$ pwd

/tmp/kk

$ echo > k3
$ ls -l

ls: .: Permiso denegado

$ ## Hemos podido meternos dentro del directorio kk porque aun
$ ## Tenemos permiso para ello pero seguimos sin poder saber
$ ## cual es su contenido.
$ cd /tmp

Si no se tiene permiso de ejecucion en un directorio no se podra hacer cd a ese directorio, ni a ninguno de los directorios que cuelgan de el. Esto imposibilita todas las operaciones que utilicen ese directorio como parte del camino

Sin abandonar la sesión anterior continuamos el ejercicio

$ ###(2)###
$ ## Ahora eliminamos permiso de ejecución
$ chmod -x kk
$ ls -ld kk

d-w--w--w-   2 ..... ...... kk

$ ## Intentamos entrar
$ cd kk

bash: cd: kk: Permiso denegado

$ ## No hemos podido entrar
$ rm kk/k2

bash: cd: kk: Permiso denegado

$ ## Tampoco nos deja borrar el fichero desde fuera
$ #
$ ## Recuperamos permiso de ejecución
$ chmod +x kk
$ ls -ld kk

d-wx-wx-wx   2 ..... ...... kk

$ rm kk/k2
$ ls kk

k1

Si no tiene permiso de escritura no se podra dar altas, baja o modificaciones en la tabla lo que se traduce en que no se pueden borrar sus ficheros ni crear otros nuevos, ni renombrar ficheros.

Sin abandonar la sesión anterior continuamos el ejercicio

$ ###(3)###
$ ## Ahora eliminaremos permisos de escritura
$ chmod 666 kk
$ ls -ld kk

dr-xr-xr-x   2 ..... ...... kk

$ ## Ahora no tenemos permiso de escritura
$ cd kk
$ ls 

rm: ¿borrar `k1'? (s/n)  s 
rm: k1: Permiso denegado

$ echo > k3

bash: k3: Permiso denegado

$ touch k3

touch: k3: Permiso denegado

$ ## Sin permiso de escritura en el directorio no se pueden
$ ## Crear ficheros nuevos dentro de el ni borrar ficheros
$ ## Pero los ficheros son perfectamente accesibles
$ echo "Mensaje de prueba" > k1
$ cat k1

Mensaje de prueba

$ ## Vamos a limpiar
$ chmod 777 /tmp/kk
$ rm /tmp/kk/*
$ rmdir /tmp/kk

Setuid y Setgid
Cada proceso tiene un (R)UID, (R)GID, EUID, y EGUID. Cada fichero tiene un UID y un GID owner.

El comando 'chmod 4000' pone el bit setuid . Esto hace que el proceso que ejecuta este comando temporalmente cambie su EUID tomando el valor UID del fichero. Es decir el proceso sufre un cambio de personalidad y se convierte en la persona que figura como propietaria de ese fichero. Para ello lógicamente ese fichero deberá ser un ejecutable. El comando passwd sirve para cambiar la clave. Se trata de un comando propiedad de root con setuid. Por lo tanto mientras estamos ejecutando este comando adoptamos la personalidad de 'root'. Gracias a ello se nos permite acceder a la clave para modificarla y gracias a que ese comando no permite hacer nada más que eso se evita que este proceso con personalidad de 'root' pueda hacer otras cosas.

Busque el comando 'passwd' en su sistema. Podría estar en '/usr/bin/passwd' pero si no se encuentra en ese sitio puede localizarlo con 'which passwd'

Haga un ll para comprobar sus permisos y verá que es propiedad de 'root' y que tiene una 's' en lugar de una 'x' en la parte de los permisos para el propietario.

-rwsr-xr-x   1 root     root        28896 jul 17  1998 /usr/bin/passwd

El comando 'chmod 2000' pone el bit setgid on execute. Hace algo parecido al anterior pero a nivel de grupo. Es decir el proceso que ejecuta este comando temporalmente cambie su EGID tomando el valor GID del fichero. Por ejemplo el comado lpr no solo nos convierte en 'root' cuando lo ejecutamos sino que nos cambia el grupo por el grupo de impresión.

-rwsr-sr-x   1 root     lp          14844 feb  7  1999 /usr/bin/lpr
El comando 'chmod 1000' pone el bit sticky. Se usa poco y tenía más utilidad en sistemas Unix más antigüos. Sirve para que el proceso permanezca en memoria RAM todo el rato mientras se esté ejecutando. Normalmente cuando muchos procesos usan la memoria RAM se van turnando en su uso y se descargan a disco para ceder su espacio en memoria RAM a otros procesos. Con el uso de este bit se evita la descarga a disco. Es una forma de aumentar la velocidad de ese proceso.

Para ver el aspecto de estos permisos realice el siguiente ejercicio. Realice siempre los ejercicios desde un usuario normal distinto de root.

$ cd /tmp
$ echo  > kk
$ chmod 4000 kk
$ ll kk

---S------   1 ..... ..... kk

$ chmod 4100 kk

---s------   1 ..... ..... kk

$ chmod 2000 kk

------S---   1 ..... ..... kk

$ chmod 2010 kk

------s---   1 ..... ..... kk

$ chmod 1000 kk

---------T   1 ..... ..... kk

$ chmod 1001 kk

---------t   1 ..... ..... kk

Test
Puede comprobar sus conocimientos respondiendo el siguiente test.
Para ello seleccione las opciones que se ajusten a la verdad y luego pulse el boton para ver el resultado de su test.

1 'chmod 742 kk' pone los permisos -rwxr---w- al fichero 'kk' .
2 'chmod 777 kk ; chmod a-w kk' equivale a chmod 555 kk'.
3 Si un fichero no tiene permisos de lectura nadie podrá leerlo.
4 Si un directorio tiene permisos d-wx-wx-wx los usuarios normales
solo podrán acceder los ficheros que contiene si conocen sus nombres.
5 Para hacer cd /dir1/dir2/dir3/dir4 necesitamos
permisos de ejecucion para cada uno de los directorios .
6 Para hacer 'echo > fich1' necesitamos siempre permisos de escritura
en el directorio actual. Si fich1 existe también se requiere permiso de
escritura para fich1.
7 Si nuestra umask valiera 777 los ficheros se crearian siempre
con todos los permisos.

Resultado del test

Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos
contacto

.
....
...

Volver a la página anterior
Volver a la página principal de la tienda