Permisos de Linux

De Mendoza CONICET

Permisos

Cada uno de los elementos del sistema de ficheros de Linux posee permisos de acceso de acuerdo a tres tipos de usuarios:

1. Su dueño (casi siempre el creador) representado por la letra "u" (user)

2. Su grupo representado por la letra "g" (group)

3.El resto de los usuarios que no son el dueño ni pertenecen al grupo. Se representan con "o" (other).

Nota: Para representar a todos los tipos de usuarios se utiliza la letra "a" (all).

Para cada uno de estos tres grupos de usuarios existen tres tipos de permisos fundamentales:

1. "r": read (lectura). El usuario que tenga este permiso podrá si es un directorio, listar los recursos almacenados en él, y si es culaquier otro tipo de fichero podrá leer su contenido.

2. "w" write (escritura). Todo usuario que posea este permiso para un fichero podrá modificarlo. Si se posee para un directorio se podrán crear y borrar ficheros en su interior.

3. "x" executive (ejecución). Este permiso para el caso de los ficheros permitirá ejecutarlos desde la línea de comandos y para los directorios, el usuario que lo posea tendrá acceso para realizar el resto de las funciones permitidas mediante los otros permisos (lecura y/o escritura).


Para determinar los permisos finales siempre se deben tener en cuenta los siguientes aspectos:

  • Para poder realizar operaciones sobre cualquier directorio (leer o escribir) será necesario siempre, tener otorgado además el permiso de ejecución.
  • Para acceder a un recurso de cualquier forma (ejecución, lectura o escritura) se deben tener permisos de ejecución para todos los directorios que contienen al recurso directa o indirectamente.

Los tres tipos de permisos mencionados poseen una representación numérica basada en el sistema octal que parte de representar como "1" los bits de los permisos otorgados y "0" para los negados. Luego se transforma la representación binaria así obtenida en octal. De esta forma se obtiene para cada tipo de permiso los siguientes valores:

r - - = 100 (4 en octal)

- w - = 010 (2 en octal)

- - x = 001 (1 en octal)

La combinación de los tres tipos de permisos para un tipo de usuario oscila desde cero (ningún permiso) hasta siete (todos los permisos)

Ejemplos:

r w - = 110 (6 en octal)

r w x = 111 (7 en octal)

r - x = 101 (5 en octal)

Los permisos "totales" de un recurso consta de nueve indicadores, donde los tres primeros indican los permisos asociados al dueño, los otros tres, al grupo y los últimos, al resto de los usuarios.

Ejemplos:

r w x r - x - - - = 111 101 000 (750 en octal)
r w - r - - r - - = 110 100 100 (644 en octal)

Sólo el dueño de un recurso siempre tendrá derecho a cambiar sus permisos, además de root.

Existen otros tipos de permisos más complejos:

  • s y S: es un permiso que de no administrarse correctamente puede provocar problemas de seguridad. Para su representación a través de caracteres se utiliza el lugar del permiso de ejecución y de ahí la diferencia entre s y S: si es s (minúscula) significa que incluye además el permiso de ejecución a diferencia de S (mayúscula). Este permiso se puede asociar al dueño o al grupo del recurso. Si se asocia a un fichero significa que cuando este se ejecute por un usuario que tenga permisos para ello adquirirá los permisos de su dueño o grupo en dependenciade la cual de los dos está asociado el permiso. Un ejemplo de fichero con este permiso es el comando "passwd", el cual adquiere los permisos de root al ser ejecutado por los usuarios (sin argumentos) para poder modificar el fichero "/etc/shadow" que es donde se guardan las contraseñas de los usuarios. Para el caso de un directorio este permiso sólo tiene validez para el grupo del mismo permitiendo a los ficheros y a los subdirectorios que se creen en él heredar el grupo, los subdirectorios heredarán también el permiso "s". Un ejemplode directorio con este permiso es aquel donde se guardan los documentos de un sitio FTP anónimo. Este permiso se conoce como setuid bit o setgid bit, para el usuario y el grupo, respectivamente.
  • t y T: cuando está asociado a un directorio junto al permiso de escritura para un grupo de usuarios, indica que estos usuarios pueden escribir nuevos ficheros en el directorio pero estos sólo podrán ser borrados por sus dueños o por root. Para un fichero el permiso expresa que el texto de este se almacena en memoria swap para ser accedido con mayor rapidez. Este permiso solo se asocia al resto de los usuarios y para su representación se emplea el bit correspondiente al permiso de ejecución: si es t (minúscula) significa que incluye además el permiso de ejecución y T (mayúscula) no lo incluye. Ejemplo de un directorio con este permiso es "/tmp" donde todos los usuarios pueden escribir pero sólo los dueños pueden borrar sus ficheros, además de root. Este permiso se conoce también como sticky bit.

Para representar los permisos t y s en el sistema binario se utilizan tres bits adicionales: el primero par s en el dueño, el segundo para s en el grupo y el tercero para t. Estos se colocan al inicio de la cadena numérica de nuevebits vista anteriormente. En la cadena de carcterres se mezclan con el permiso de ejecución y de ahí la necesidad de emplear las mayúsculas y minúsculas.

Ejemplos

r w s r w S r - - = 110 111 110 100 (6764 en octal)
r w x r w s - w T = 011 111 111 010 (3772 en octal)

Despues de toda esta introducción teórica a los permisos de Linux veamos cómo se muestran, modifican y se les asigna un valos por defecto.

Posiblemente el comando más empleado en Linux es aquel que muestra el contenido de un directorio, llamado ls. Este comando con la opción -l permite observar los permisos que tienen los asociados, los recursos listados, además de otras características. Los permisos se muestran a través de una cadena de 10 caracteres donde el primero indica el tipo de recurso que es:

  • d: directorio
  • l: enlace simbólico (ver sección **)
  • b: dispositivo de bloque
  • c: dispositivo de caracteres
  • s: socker
  • p: tubería (pippe)
  • -: fichero regular

Los otros nueve caracteres representan propiamente a los permisos del recurso. El resto de las columnas de la salida representan para cada elemento:

  • El número de enlaces duros que posee (ver sección **). En el caso de un directorio, indica la cantidad de subdirectorios que contiene contando a los directorios especiales "" y "".
  • El identificador del dueño.
  • El identificador del grupo.
  • El tamaño en bytes si es un fichero y si es un directorio el tamaño en bloques que ocupan los ficheros contenidos en él.
  • La fecha y hora de la última modificación. Si la fecha es seis meses antes o una hora después de la fecha del sistema se coloca el año en lugar de la hora.
  • El nombre del recurso.

Ejemplos:

drwx---r-x 3 alina alina 4096 Oct 11 12:52 doc
-rw-w--w-- 1 alina alina 330106 Sep 7 08:39 tesis.tgz
drwxrwxrwt 5 root root 1024 Nov 15 10:40 tmp
lrwxrwxrwx 1 alina alina 21 Oct 1 09:46 curso → ../documentación
brw-rw---- 1 root disk 3,1 Mar 23 20:01 /dev/hdal

En la sección ** se mencionana otras opciones del comando ls.


Para cambiar los permisos de un recurso se utiliza el comando chmod.

Sintaxis: chmod [opciones] <permisos> <ficheros>

Las formas de expresar los nuevos permisos son diversas, se puede emplear la representación numérica o utilizando caracteres.

Ejemplo:

$ chmod u+x clase.txt # añade el permiso de ejecución al dueño
$ chmod g=rx program.sh # asigna exactamente los permisos de lectura y ejecución al grupo
$ chmod go-w profile # elimina el permiso de escritura en el grupo y en otros
$ chmod a+r,o-x *.ts # adiciona el permiso de lectura para todos los usuarios y elimina el de ejecución para otros
$ chmod +t tmp/ # adiciona el permiso especial t
$ chmod 755 /home/pepe/doc/ # asigna los permisos con representación octal 755 (rwxr-xr-x)
$ chmod -R o+r apps/ # adiciona el permiso de lectura a otros para un directorio de forma recursiva (incluyendo todo su contenido)
$ chmod +x ./bin/* # adiciona el permiso de ejecución a todos los usuarios que les corresponde por defecto
# chmod 4511 /usr/bin/passwd # asigna los permisos con representación octal 4511 (r-s--x--x)

Para determinar cuales permisos se asocian por defecto a los ficheros o directorios creados, cada usuario posee una máscara de permisos. Ésta se expresa en el formato numérico octal o sea posee tres dígitos entre cero y siete (Ej. 166). La máscara indica qué permisos no se dese que tenga el recurso creado. Por defecto esta máscara es 002 para los usuarios comunes y 022 para root [2.5]. La máscara realmente se asocia al shell y se hereda por los subshell [2.6].

Para calcular los permisos finales dado que se tiene la máscara 022 se hace la siguiente operación por parte del sistema:

Ficheros= totales_para_ficheros - máscara = 666 - 022 = 644 = -rw-r--r--

Directorios= totales_para_directorios - máscara = 777 - 022 = 755 =drwxr-xr-x

Para colocar u observar la máscara se puede emplear el comando umask. Sintaxis: umask [-S] [máscara]

Ejemplos:

$ umask # sin argumentos muestra actual formato numérico
$ umask -S u=rwx, g=r, o=r # muestra el complemento de la máscara en formato de caracteres
$ umask -S 037 u=rwx, g=r, o= # asigna la máscara 037 (niega permisos de ejecución y de escritura para el grupo, y todos los permisos para el resto de los usuarios). Se muestra el resultado en formato de caracteres
$ umask g=rx, o= # especifica el complemento la máscara utilizando el formato de caracteres

Para ser bien restrictivos se recomienda hacer: $ umask 077

Los nuevos directorios tendrán el permiso: 700 = drwx------

Los nuevos ficheros tendrán permiso: 600 = -rw-------

Más adelante se explicará como se puede hacer esto automáticamente en todos los shells que se utilicen.

Herramientas personales