Permisos de Archivos / Directorios en Linux

Permisos

Un archivo cualquiera de Linux/Unix genera con sus permisos una partición sobre los usuarios, está partición consta de: un usuario dueño del archivo, los usuarios pertenecientes al grupo del archivo y todos los demás usuarios. Esta clasificación se conoce a veces como UGO, por User, Group, Others.

Cuando un archivo se crea, el archivo tiene como dueño al usuario que lo creó y como grupo, el grupo principal al cual pertenece el usuario.

      $whoami
      santi
      $touch f1
      $ls -l f1
      -rw-r--r-- 1 santi staff 0 2008-03-16 19:48 f1
    

El dueño del archivo f1, es santi, y el archivo pertenece al grupo staff. A cada uno de los tres grupos podemos darle o quitarle permisos de: lectura (r), escritura (w) o ejecución (x). Estos permisos se asignan de manera discreta por lo que necesitamos 9 bits para asignarlos (3 clases de usuarios User, Group, Others, y 3 tipos de permisos Read, Write, eXecution).

      rwx         rwx         rwx
      ---         ---         ---
      Usuario     Grupo       Otros
    

El sistema octal de bits permite representar los 8 estados que pueden tomar cada una de las clases. Esto se ve en la tabla siguiente:

      Bin  Oct          Permisos
      000  0       ---   Ningún permiso
      001  1       --x   Sólo ejecución
      010  2       -w-   Sólo escritura
      011  3       -wx   Escritura y ejecución
      100  4       r--   Sólo lectura
      101  5       r-x   Lectura y ejecución
      110  6       rw-   Lectura y escritura
      111  7       rwx   Los tres permisos
    

Por este motivo es común que los permisos se suelan representar como una secuencia de tres números octales que designen los permisos para Usuario, Grupo y Otros.

Algunos ejemplos serían:

      000 Ningún permiso
      444 Lectura para todos.
      400 Lectura sólo para el dueño.
      644 Lectura y escritura para el dueño y sólo lectura a los
          demás.
      777 Todos los permisos a todo el mundo.
    

Muchas veces la gente no recuerda esa tabla, por lo que se asignan permisos directamente utilizando las clases de usuarios y las letras de los permisos. El comando para la asignación de permisos es chmod:

      $chmod 644 f1
      # Es equivalente a:
      $chmod ugo+r  f1  # lectura para todos
      $chmod go-wx  f1  # quitamos escritura y ejecución
      $chmod u+wr   f1  # escritura y ejecución a dueño
      $ls -l f1
      -rw-r--r-- 1 santi staff 0 2008-03-16 20:19 f1
    

El comando ls -l que nos mostró los permisos tiene un menos adelante para indicar que es un archivo y no un directorio. En el caso de un directorio tendríamos una d en lugar de un menos:

      $mkdir borrar
      $ls -l | grep borrar
      drwxr-xr-x 2 santi staff 4096 2008-03-16 20:27 borrar
    

Sticky bit (pegajoso)

Los unix tienen un permiso especial llamado Sticky bit que tenía el propósito de alertar al kernel para que deje el archivo en memoria luego de terminar el programa. Esto era conveniente para archivos utilizados muy frecuentemente, hoy día en casi todos los kernels modernos este permiso ya no hace falta debido a los nuevos sistemas de paginación de memoria que se implementan por lo que el uso del permiso sticky con este fin está obsoleto.

SUID y SGID

SUID y SGID son acrónimos de Set User Id y Set Group Id. Cuando un usuario ejecuta un archivo sin estos permisos, el programa corre con los permisos de ejecución del usuario que lo ejecuta. Es decir que si el usuario no tiene permisos de escribir el directorio /bk/ los programas que ejecute tampoco lo tendrán, a menos que alguno de estos programas tengan permisos SUID o SGID con lo cual el programa corre con los permisos del dueño del archivo o del grupo del archivo.

Programas como ping que requieren permisos de root para ejecutarse por lo que suelen tener este permiso asignado.

      $ls -l /bin/ping
       -rwsr-xr-x 1 root root 30856 2007-07-06 04:40 /bin/ping
    

Es conveniente verificar nuestro sistema en busca de programas con este tipo de permisos, ya que pueden ser utilizados con fines maliciosos. Es común que un atacante que ganó en algún momento privilegios de root, deje para su uso posterior una copia de un shell como bash con permisos SUID.

Directorios

Para entender el significado de los permisos asignados a los directorios, hay que entender que un directorio es una lista de los archivos que contiene. Es decir que si nosotros tenemos permiso de lectura en ese directorio podremos leer la lista por lo que podremos listar los archivos del directorio. Pero si no tenemos permisos de lectura aún podremos modificar archivos del directorio suponiendo que conozcamos su nombre y tengamos los permisos sobre el archivo para hacerlo.

La misma lógica se sigue con el resto de los permisos, si queremos borrar un archivo de un directorio deberíamos tener permisos para modificar la lista, es decir permisos de escritura en el directorio

      $mkdir borrar/
      $touch borrar/archivo
      $chmod u-rw borrar/
      $ls borrar/
      ls: borrar/: Permission denied
      $echo "saludos" > borrar/archivo
      $cat borrar/archivo
      saludos
      $rm borrar/archivo
      rm: cannot remove `borrar/archivo': Permission denied
    

Pero todavía queda un permiso que no sabemos como actua y es el de ejecución, y si este permiso se quita se prohiben todas las acciones dentro del directorio, sus archivos y subdirectorios. Es decir si quitamos los permisos de ejecución para alguna de las clases, no se podrá hacer a nada dentro del directorio ni siquiera cambiar a él con cd.

      $cd borrar/
      $pwd
      /home/santi/tmp/unix/borrar
      $cd ..
      $chmod u-x borrar/
      $cd borrar
      bash: cd: borrar/: Permission denied
 
Mas información: Guía-Ubuntu
Fuente: http://codigomaldito.blogspot.com

¿Disfrutaste esta entrada? Por qué no dejas un comentario abajo y continúas la conversación, o te suscribes a mi feed y obtienes artículos como este enviados a tu lector de feeds.

Comentarios

No hay comentarios todavía.

Deja un Comentario

(requerido)

(requerido)