Permisos en Linux

Resumen de conceptos y comandos.

Un concepto fundamental en Linux es el manejo de permisos. Podemos controlar exactamente quién tiene acceso a un archivo o carpeta, y qué tipo de operaciones puede ejecutar (sólo lectura, o lectura/escritura, por ejemplo). Para poder entender los permisos, primero tenemos que hablar de usuarios y grupos.

Usuarios y grupos #

Puedes obtener tu usuario con el comando whoami.

El archivo /etc/passwd contiene información sobre todos los usuarios del sistema. Contrario a lo que su nombre sugiere, no contiene las contraseñas de los usuarios. En el pasado sí era así, pero no las contraseñas en plano, sino sus hashes. Actualmente los hashes de las contraseñas se almacenan en el archivo /etc/shadow.

Un usuario puede pertenecer a múltiples grupos. Podemos ver la lista de grupos del sistema con sus respectivos integrantes en el archivo /etc/group. Para ver a qué grupos pertenece un usuario podemos usar el comando groups:

groups # Los grupos a los que pertenezco
groups <usuario> # Los grupos a los que pertenece <usuario>

Tanto los usuarios como los grupos tienen un ID (uid y gid, respectivamente). Para obtenerlos podemos usar el comando id:

id # uid y gid de todos los grupos a los que pertenezco
id -u # uid
id -g # gid de mi grupo principal
id -G # gid de todos mis grupos

Otros comandos útiles #

  • Crear un usuario: adduser. Esto es en Ubuntu, en otras distribuciones puede ser diferente.
  • Crear un grupo: groupadd <nombre>
  • Agregar un usuario a un grupo: usermod -a -G <grupo> <usuario>. Sólo puede hacerlo el usuario root o usuarios con acceso a sudo.
  • Cambiar de usuario: su <usuario>

Permisos #

Si vamos a una carpeta no-vacía y ejecutamos ls -l veremos una lista de los archivos y carpetas que se encuentran allí. Cada una de las filas de esta lista tiene la siguiente estructura:

ls

Detengámonos en los permisos. Hay 10 símbolos. El primero indica qué tipo de archivo es. Algunas posibilidades son:

  • -: archivo
  • d: carpeta
  • l: enlace simbólico

Los otros 9 símbolos se dividen en 3 bloques de 3. El primer bloque se refiere al usuario dueño del archivo, el segundo al grupo y el tercero a los “otros”, es decir, los usuarios que no son el dueño ni están en el grupo.

Permisos

El primer símbolo de cada triada corresponde a lectura (r - read), el segundo a escritura (w - write) y el tercero a ejecución (x - execute). Un detalle importante: para las carpetas, el permiso de ejecución significa poder entrar a la carpeta (hacer cd).

Algunos ejemplos:

  • rw-r-----: El dueño puede leer y ejecutar. El grupo sólo puede leer, los otros no pueden hacer nada.
  • rwxr-xr-x: El dueño puede leer, escribir y ejecutar. El grupo y los otros pueden leer y ejecutar.
  • rwx------: El dueño puede leer, escribir y ejecutar. El grupo y los otros no pueden hacer ninguna de las tres cosas.

Manipulando los permisos #

Sólo el dueño de un archivo (o carpeta) y el usuario root pueden cambiar los permisos de un archivo. El dueño puede cambiar el grupo del archivo, pero sólo por algún otro grupo al cual él pertenezca. Y ojo: root puede cambiar al dueño y al grupo también.

Para cambiar el dueño y/o grupo de un archivo (siendo root) usamos el comando chown. Para una carpeta es lo mismo, pero adicionalmente podemos pasar la opción -R para modificar recursivamente los contenidos de la misma.

chown <usuario> <archivo> # Cambia el usuario
chown <usuario>:<grupo> <archivo> # Cambia el usuario y el grupo
chown <usuario> <carpeta> # Solo la carpeta
chown -R <usuario> <carpeta> # También los contenidos de la carpeta
chown -R <usuario>:<grupo> <carpeta>

Para cambiar el grupo (siendo el dueño o root):

chgrp [-R] <grupo> <archivo o carpeta>
chown [-R] :<grupo> <archivo o carpeta>

Ahora miremos cómo cambiar los permisos. Esto se hace con el comando chmod, pero hay varias formas diferentes de usar este comando.

Con letras #

Esta es la forma más amigable de hacerlo. Funciona combinando “sujetos” (u - usuario, g - grupo, o - otros), con un símbolo (+ para agregar, - para quitar, y = para asignar) y permisos (r, w, x).

Veamos algunos ejemplos:

  • Partimos de rwxr-xr-x → Hacemos chmod g+w <archivo> → Nos queda rwxrwxr-x
  • rwxrwxrwxchmod o-wx <archivo>rwxrwxr--
  • rwxr--r--chmod go+x <archivo>rwxr-xr-x
  • rwxrwx---chmod g=rw <archivo>rwxrw----

Adicionalmente podemos usar el sujeto a para modificar los tres bloques al tiempo. Es decir:

  • rwx------chmod a=rw <archivo>rw-rw-rw-
  • r-xr-xr-xchmod a+w <archivo>rwxrwxrwx

Si omitimos el sujeto, es como si usáramos a:

  • rwxrwxrwxchmod -w <archivo>r-xr-xr-x

Con números #

En este modo, debemos pensar en un bloque de permisos como un número de 3 bits. Si el permiso está, el bit sería un 1. Es decir que:

  • rwx es 111
  • r-x es 101
  • r-- es 100
  • --- es 000
  • etc.

Luego, estos números binarios los representamos como decimales:

  • 111 es 7
  • 101 es 5
  • 100 es 4
  • etc.

Estos números los usamos para indicarle a chmod los permisos de cada sujeto: usuario, grupo y otros. Algunos ejemplos:

  • chmod 777 <archivo>rwxrwxrwx
  • chmod 755 <archivo>rwxr-xr-x
  • chmod 744 <archivo>rwxr--r--
  • chmod 700 <archivo>rwx------

Ya podemos entender de dónde sale el famoso chmod 777!