Nota de copyright:
© 2004, Redy Rodríguez. Se permite la utilización reproducción, modificación y redistribución o difusión en cualquier medio siempre que se mantenga esta nota de copyright.
Agradecimientos a: Jose Blanco, Kandy, Carlos González, Tanke, Emeteo... y a toda la gente de www.galpon.org
- En un sistema Linux existen usuarios y grupos de usuarios.
- Los usuarios se identifican por un número entre 0 y 65535 que denominaremos UID, cada número puede tener una correspondencia con un nombre de login que se definirá en el fichero /etc/passwd
- El usuario con UID=0 tiene casi siempre el nombre de root, y es el superusuario, puede hacerlo todo sin limitaciones, el resto de usuarios tienen limitaciones definidas por los permisos según veremos más adelante.
- Los grupos se identifican por un número entre 0 y 65535 que denominaremos GID, cada numero de GID puede tener una correspondencia con un nombre de grupo que se definirá en el fichero /etc/groups
- Tanto los usuarios como los grupos pueden tener password.
- Todo usuario de un sistema Linux ha de tener un numero de usuario (UID), y pertenecer a uno o más grupos (GID)
- En el fichero /etc/groups se establece que usuarios pertenecen a cada grupo, además de a su grupo principal definido para cada usuario en /etc/passwd
- Cuando un usuario hace login en el sistema con su nombre se desencadenan una serie de procesos que pertenecen a ese usuario (UID) y al grupo principal (GID) de dicho usuario. El grupo principal en principio es el definido en el fichero /etc/passwd para dicho usuario.
- Todo proceso ha de pertenecer siempre a un usuario y a un grupo, los procesos hijos normalmente heredan el usuario y el grupo del padre.
- El usuario puede consultar la lista de grupos a los que pertenece con el comando:
groups
El primero de la lista es el que será considerado como grupo principal.
- El usuario puede establecer como grupo principal cualquiera de los de su lista con el comando:
newgrp <nombre_de_grupo>
Si se cambia el grupo principal con el comando newgrp este cambio permanecerá hasta que se vuelva a cambiar o finalicemos la sesión, los procesos hijos heredan los cambios.
- Si existen grupos con password en el sistema, el usuario que conozca dicha contraseña puede establecer como grupo principal cualquiera de esos grupos con el comando newgrp, incluso aunque no pertenezca a ellos.
- Todo elemento de un sistema de ficheros en Linux tiene siempre un propietario y un grupo. (Entendemos por elemento: un fichero, un directorio, una tubería con nombre, un dispositivo de bloques o de caracteres, un enlace... en general en los sucesivo salvo que se indique lo contrario cuando hablemos de fichero nos referiremos tanto a ficheros normales como a cualquier otro elemento excepto los directorios)
- Normalmente, al crear un elemento nuevo, éste tomará como propietario el UID del proceso que lo ha creado y como grupo el GID del grupo principal establecido para dicho proceso.
- Para cambiar el propietario de un elemento se utiliza el comando chown. Solo el root puede cambiar un elemento de propietario.
chown <usuario> <lista de elementos>
- Para cambiar el grupo de un elemento se utiliza el comando chgrp. Además del root, un usuario puede cambiar un elemento de grupo siempre que sea su propietario y lo cambie a uno de los grupos a los que dicho usuario pertenece.
chgrp <grupo> <lista de elementos>
- Se puede cambiar al mismo tiempo usuario y grupo con chown de esta forma (teniendo en
cuenta que solo el root puede cambiar el propietario).
chown <usuario>:<grupo> <lista de elementos>
- Todo elemento tiene unos permisos divididos en 3 grupos:
Permisos para el propietario: Establecen que es lo que puede hacer con el elemento en cuestión el usuario cuyo UID coincida con el UID del propietario del elemento.
Permisos para el grupo: Establecen que es lo que puede hacer con el elemento cualquier usuario que pertenezca al grupo cuyo GID coincide con el del elemento.
Permisos para el resto: Establecen que es lo que puede hacer el resto de usuarios con el elemento.
- Los enlaces simbólicos no tienen permisos en si mismos se aplicarán los del elemento apuntado, en los listados salen siempre con todos los permisos activos.
- Los permisos normales son tres: Lectura, escritura y ejecución.
- En un fichero los permisos normales tienen un significado obvio. El permiso de lectura indica que se puede leer el fichero, el de escritura que se puede modificar y el de ejecución que se puede ejecutar (si se trata de un programa binario o un script, evidentemente)
- En un directorio la cosa cambia un poco: El permiso de lectura sigue siendo obvio, da permiso para listar el contenido del directorio. El permiso de ejecución nos permite situarnos en dicho directorio y acceder a su contenido, si un directorio no tiene permiso de ejecución no podremos acceder a su contenido de ninguna forma. En cambio un directorio que tenga permiso de ejecución y no de lectura, no nos dejará listar su contenido pero si ejecutar, leer o escribir en un fichero que esté dentro de él si sabemos el nombre del fichero (y dicho fichero tiene permiso para ello claro). El permiso de escritura en un directorio permite crear nuevos ficheros en su interior o borrar los existentes (incluso aunque estos sean de otro propietario y no tengan permiso de escritura). Esto no es un fallo, funciona así, si un usuario crea un fichero en un directorio con permisos de escritura para otros usuarios otros usuarios podrán eliminarle ese fichero (puede que no sean capaces de modificarlo, pero si de borrarlo). Evidentemente podrían borrarlo y crearlo de nuevo, pero se notaría porque el nuevo fichero pertenecerá al usuario que lo creó.
- Los permisos normales se codifican con 9 bits, y se expresan normalmente con tres cifras octales (cada cifra octal son tres bits). De tal forma que el bit 0 (menos significativo) es el permiso de ejecución, el bit 1 el de escritura y el bit 2 (más significativo) el de lectura. Podemos decir que los bits tienen los siguientes pesos:
Bit de ejecución = 20 = 1
Bit de escritura = 21 = 2
Bit de lectura = 22 = 4
Sumando los pesos de los bits activados podemos obtener la cifra octal equivalente.
- Cada grupo de permisos corresponde a una de esas cifras octales siendo de mayor a menor peso: Permisos para el propietario, para el grupo y para el resto.
- El comado umask permite establecer o consultar la mascara de permisos. Cuando se crea un nuevo elemento sin especificar los permisos se le dan los permisos de lectura y escritura en todos los grupos excepto en aquellos que umask enmascara. En umask definimos una máscara de bits de tal forma que aquellos bits que estén a 1 en umask se establecerán a 0 cuando creamos un elemento nuevo. (Nunca se dan por defecto permisos de ejecución a los ficheros). Por ejemplo si nuestro umask vale 027 al crea un nuevo fichero tomaríamos el valor octal 777 (permisos para todos para todo) le quitaríamos primero los bits de ejecución, con lo que nos quedaría en 666 (lectura y escritura para todos) ahora lo compararíamos con umask que al tener un 0 en la primera cifra nos dice que los permisos para el usuario quedan tal cual, en la segunda cifra tiene un 2 o sea que hemos de limpiar el bit de peso 2 (permiso de escritura para el grupo), y la tercera cifra tiene un 7 (1+2+4) o sea que hemos de limpiar todos los bits de los permisos para el resto. El fichero se creará entonces con los permisos 640 o lo que es lo mismo rw- r-- ---.
A diferencia de los ficheros, los directorios se crean por defecto con el permiso de ejecución salvo que umask indique lo contrario, en el ejemplo anterior si en lugar de un fichero se tratase de un directorio el permiso final sería 750 (a 777 le quitamos el 2 de la segunda cifra y todos los de la tercera)
- Si se cambia la máscara de creación de ficheros con el comando umask este cambio durará hasta que finalice la sesión o se cambie de nuevo, los procesos hijos heredan los cambios.
- Además de la representación octal de los bits de permisos tenemos la representación simbólica mediante letras: x para ejecución, w para escritura y r para lectura, y se suelen poner en el mismo orden que los bits (de mayor a menor peso) o sea rwx, y así es como se muestran cuando hacemos un listado con el comando ls -l
- Para cambiar los permisos de un elemento usaremos el comando chmod, bien entendido que a menos que seamos root solo podremos cambiar los permisos de aquellos elementos de los que somos propietarios.
chmod <permisos> <lista de elementos>
Los permisos los expresaremos como un número octal de 3 cifras o como una expresión simbólica:
Las expresiones simbólicas podrán llevar uno o más de los prefijos 'u', 'g', 'o' ó 'a' para indicar que la modificación que vamos a hacer afectará al grupo de permisos del propietario (u de user), al grupo de permisos del grupo (g de group), al grupo de permisos del resto (o de others) o a todos (a de all), luego poner como prefijo 'a' equivale a poner 'ugo'. Si no se pone prefijo se supondrá el prefijo 'a' pero aplicándole el valor de umask.
A continuación del prefijo (si lo hubiese) debemos poner un de los símbolos +, - ó = para indicar que se activa, que se desactiva o que se establece exactamente igual al permiso que le digamos. Por ejemplo si partimos de los tres ficheros siguientes con estos permisos:
ls -l
-rw-rw-r-- 1 redy redy 132 jul 23 09:02 ficherito
-rw-rw-r-- 1 redy redy 22 jul 23 09:02 pepe
-rw-rw-rw- 1 redy redy 66 jul 23 09:02 perico
chmod ug+x pepe (Activará el permiso de ejecución para el propietario y el grupo del fichero pepe)
ls -l pepe
-rwxrwxr-- 1 redy redy 22 jul 23 09:02 pepe*
chmod o-rw perico (Quitará los permisos de lectura y escritura para otros al fichero perico)
ls -l perico
-rw-rw---- 1 redy redy 66 jul 23 09:02 perico
chmod u=rx ficherito (Establecerá los permisos del propietario exactamente a lectura y ejecución pero no escritura del fichero ficherito)
ls -l ficherito
-r-xrw-r-- 1 redy redy 132 jul 23 09:02 ficherito*
- Fíjate que especificar los permisos en octal nos permite establecer exactamente esos permisos, mientras que hacerlo de modo simbólico nos permite activar o desactivar ciertos bits sin modificar el resto.
chmod 640 ficherito (Pondrá exactamente lectura y escritura [4+2] para el usuario, lectura [4] para el grupo y ningun permiso [0] para el resto en el fichero ficherito)
ls -l ficherito
-rw-r----- 1 redy redy 132 jul 23 09:02 ficherito*
- Además de los permisos normales existen unos permisos especiales que van en tres bits extra de más peso (más significativos) que los normales, por lo tanto la cifra octal será de 4 cifras en vez de 3 para indicarlos:
SETUID Si se ejecuta un fichero con dicho permiso activado, el proceso no pertenecerá al usuario que ejecuta el fichero sino al propietario del fichero. No tiene efecto en directorios. (Es el mas significativo de los 3 bits de la cifra, peso 4).
SETGID Si se ejecuta un fichero con este permiso activado, el proceso no pertenecerá al grupo principal del usuario que lo invoca sino al grupo al que pertenece el fichero. Si se crea un elemento dentro de un directorio con este permiso activado, el elemento creado heredará el grupo del directorio, en vez de coger el grupo principal del usuario creador (peso 2).
STICKY Se usaba para que el programa quedase en memoria tras su ejecución, hoy en día no se usa en ficheros. En directorios este permiso se usa para controlar el borrado, si un directorio tiene este bit activo un usuario solo podrá borrar elementos dentro de él si es el propietario del elemento o el propietario del directorio. (Es el menos significativo de los 3 bits de la cifra, peso 1).
- Simbólicamente los bits de setuid y setgid se representan por 's' y el sticky por una 't'. Cuando listamos con ls -l un fichero que tiene alguno de estos permisos especiales, la 's' o la 't' se muestran en la misma posición de la 'x' de ejecutable (La 's' en el lugar del permiso de ejecución para el propietario indica que el fichero tiene SETUID en la posición del permiso de ejecución para el grupo indica que tiene SETGID y la 't' en la posición del permiso de ejecución para el resto indica que el fichero tiene STICKY). Como esa letra ('s' ó 't') oculta la 'x' de ejecutable, si aparece en minúsculas indica que el permiso de ejecución está activo (habría una 'x' si no estuviese la 's' o la 't' en su lugar), pero si por el contrario la 'S' o la 'T' aparecen en mayúsculas indican que el correspondiente bit del permiso de ejecución no está activo.