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). |
![]() |
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.
|
Permisos de ficheros
Supongamos que tenemos el siguiente fichero llamado 'kkkkk'
Notación numérica para permisos
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
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.
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
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:
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
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.
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
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
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
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
Setuid y Setgid
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.
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.
Para ver el aspecto de estos permisos realice el siguiente ejercicio.
Realice siempre los ejercicios desde un usuario normal distinto de root.
Test
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 /
-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.
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 )
Es un comando interno del bash. Se utiliza cuando se crean ficheros.
664 110 110 100
022 000 010 010
-----------------
644 110 100 100
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
$ 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
Explicaremos el funcionamiento de los permisos de la forma más precisa
que nos sea posible.
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
$ ###(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
$ ###(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
$ ###(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
Cada proceso tiene un (R)UID, (R)GID, EUID, y EGUID.
Cada fichero tiene un UID y un GID owner.
-rwsr-xr-x 1 root root 28896 jul 17 1998 /usr/bin/passwd
-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.
$ 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
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.
Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos