Vista de ficheros mostrando usuarios propietarios, grupos y permisos en Linux

Permisos, usuarios y grupos en Linux

A lo largo de la andadura de PItando, el contenido del blog se ha centrado casi por entero en experimentos tanto a nivel de programación, como con unos primeros prototipos electrónicos sencillos. Hemos entrado lo básico en el uso del sistema operativo de referencia de la Raspberry Pi para poder cubrir nuestros objetivos: localizar y abrir programas, movernos un poquito por el Terminal, examinar el contenido de los directorios, editar un fichero de texto. Sin embargo, profundizar en los aspectos que el sistema operativo impone a los usuarios es necesario muchas veces para entender cómo van a afectar a nuestros programas.

Por el momento, de todas formas, hemos entrevisto ya tres de estos aspectos a la hora de hacer que un programa en Python sea ejecutable y a la hora de integrar nuestro fotomatón con una impresora a través de CUPS: los usuarios, los grupos y sus permisos sobre los ficheros. Tenéis que saber que en UNIX, y por lo tanto en todos los Linux y en Mac OS X, todo toma la forma de ficheros. Todo es todo: la pantalla, el teclado e incluso procesos del sistema, en ejecución, tienen una representación en forma de fichero donde se pueden aplicar permisos y privilegios de una forma muy poderosa.

Vista de ficheros mostrando usuarios propietarios, grupos y permisos en Linux
Vista de ficheros mostrando usuarios propietarios, grupos y permisos en Linux

Manejar correctamente estos tres aspectos harán nuestros programas más seguros y saludables: tanto para el resto del sistema operativo al ejecutarlos como debe ser, como ante otros programas y usuarios no demasiado bien intencionados.

Y, por supuesto, nos ayudarán a empezar a pensar en estos términos para entender conceptos más abstractos como la privacidad y la seguridad, desde un punto de vista práctico.

Un usuario en Linux representa a una “persona” que utiliza el sistema para ejecutar algún trabajo, ya sea interactivo a través del terminal (si soy yo, por ejemplo), o basado por entero en la ejecución de un programa. Entrecomillo “persona” porque no tiene que ser humana, sino es más bien una identidad responsable de algo: yo puedo crear un usuario en el sistema que sólo sirva para ejecutar un programa que, todos los viernes, me envíe a mí mismo un correo electrónico recordándome que el sábado no tengo que ir a trabajar. De hecho en su momento veremos cómo automatizar tareas en Linux y para eso volveremos sobre los usuarios.

Los usuarios se agrupan en grupos, para poder tratarlos en bloque cuando se trata de facilitarles permisos para realizar determinadas tareas sobre los ficheros del sistema.

Los ficheros tienen asociados permisos que, según “quien sea” el usuario que esté trabajando en el sistema, le permitirán hacer unas cosas u otras. Por ejemplo, hay ficheros que el usuario pi no va a poder modificar dentro de una instalación de Raspbian, pero sí leer. Y, como hemos visto muchas veces, no basta con escribir código Python dentro de un fichero de texto llamado “hola_mundo.py” para poderlo ejecutar desde el terminal: debemos darle permisos de ejecución escribiendo en el terminal chmod +x hola_mundo.py. Ningún programa, esté escrito como esté escrito, podrá ser ejecutado por un usuario si dicho fichero no tiene configurados permisos de ejecución para dicho usuario.

Usuarios y creación de usuarios

Hay fundamentalmente dos tipos de usuarios en un sistema UNIX como es Linux: los administradores, o súper usuarios, y los usuarios normales (regular user en inglés). Los administradores están liderados por un usuario llamado root, presente siempre en todos los sistemas Unix, que tiene permisos de escritura y facultad de cambiar absolutamente todo, ya sea para arreglarlo o para destrozarlo sin remedio ni vuelta atrás. Puede acceder a todos los documentos de todos los usuarios del sistema, a los archivos donde se almacenan los correos electrónicos, pueden escribirlos, borrarlos, borrar cualquier directorio… es, literalmente, omnipotente. La contraseña de este usuario es algo que debe mantenerse bajo el más estricto secreto y sólo al alcance de gente solvente tanto técnica como ética y moralmente.

Bajo la omnipotencia del usuario root hay dos clases más (al menos) de administradores: los sudoers y los administradores especializados en un tema específico sobre el cual son omnipotentes: impresoras, red, tal o cual servidor,…

Los sudoers son usuarios que pueden adquirir privilegios de administración personalmente: pertenecen a un grupo que puede ejecutar el comando sudo para activar aquellos privilegios que el usuario root les haya delegado. La orden sudo está protegida por la contraseña del usuario que es sudoer, para que nadie que se encuentre un terminal abierto pueda cometer tropelías.

Los privilegios que obtienen los sudoers al ejecutar una orden bajo el amparo de sudo pueden ser desde todos los privilegios (es lo más común en sistemas domésticos o personales), a sólo algunos pocos para una tarea concreta. La forma de configurar todo ésto e “hilar fino” en este sentido cae fuera de mis ambiciones para este artículo.

Os enlazo una lectura muy antigua que forma parte de los anales de la cultura UNIX y que todo el mundo que se acerque a esta familia de sistemas operativos debe leer tarde o temprano. Tiene más de 20 años y sigue vigente como el primer día: Administración del sistema. Especial atención al apartado “Sobre raíces, sombreros y la sensación de poder“, que llama la atención al usuario que ha obtenido recientemente privilegios de súper usuario acerca de ciertos principios morales y conservadores que debe tener muy claros. Incluyendo en esto último, por supuesto, al dueño de un Macintosh compartido. Mac OS X es, a todos los efectos, un sistema operativo de la familia UNIX (sea su parentesco lo lejano que sea).

Este señor ejemplifica bastante bien lo que sería un usuario root de un sistema (Matrix en este caso) © Warner Bros.
Este señor ejemplifica bastante bien lo que sería el usuario root de un sistema, además de su creador, aunque eso sea otra historia (The Matrix  © Warner Bros.)

Creación y destrucción de usuarios

Existen, que yo sepa, tres formas de crear un usuario en Linux. A saber:

  • Mediante la herramienta gráfica de turno de gestión de usuarios. Varía con cada distribución o, mejor dicho, con cada entorno de ventanas. Generalmente está orientada a crear usuarios humanos solamente. Por estas dos razones no profundizaré más en ella, y queda descartada para este artículo.
  • Mediante la orden de terminal adduser [identificador de usuario] . Esta orden está destinada a la creación de usuarios humanos, y por ello:
    • Crea un directorio personal bajo /home: /home/[identificador de usuario]
    • Copia a dicho directorio los ficheros y directorios básicos, o “plantilla”, desde el directorio /etc/skel (de skeleton, esqueleto).
    • Solicita, de forma interactiva, una contraseña para este usuario (contraseña UNIX) que habrá que repetir.
    • Pide también interactivamente los datos personales básicos para saber quién es: nombre, teléfono,… Este paso es opcional.
  • Mediante la orden de terminal useradd [identificador de usuario] . Esta herramienta está destinada a la creación de usuarios automáticos, o usuarios lógicos: no son humanos y se usan exclusivamente para ejecutar programas bajo su identidad. Por ejemplo, el servidor web apache se ejecuta por defecto con un usuario lógico llamado www-data .
    • Esta herramienta no es interactiva: no solicita nada.
    • El usuario así creado no tiene contraseña, habría que asignársela automáticamente con la orden passwd [identificador de usuario]  si fuese necesario.
    • No tiene directorio personal, ni nada parecido, porque no está pensado para que sea una persona que use el ordenador en su trabajo.

Por defecto, cada usuario tiene un grupo individual y exclusivo llamado de la misma forma que él. Su utilidad básica es compartir ficheros: si incluyo a otros usuarios en mi grupo puedo controlar su acceso a mis carpetas de documentos, como veremos en el siguiente apartado.

Los usuarios se borran con la orden deluser [identificador de usuario]. Hay que tener precaución antes de usarla porque no pide confirmación.

Todas estas herramientas se deben ejecutar con permisos de superusuario: o bien conectándonos como el usuario root, o bien ejecutando el comando sudo si está disponible en el sistema y tenemos permisos para utilizarlo. No dudes en utilizar el manual de Linux, como veíamos en el artículo de uso básico del terminal, para saber más sobre todos estos comandos.

Grupos y asignaciones a grupos

Un grupo en UNIX es, como era esperable, un conjunto de usuarios relacionados entre sí. Los grupos se pueden crear, poblar (asignándole usuarios) y borrar, y sirven para otorgar facultades sobre el sistema o partes del mismo a todos los usuarios que estén dentro del grupo. Más adelante veremos cuáles; de momento vamos a ver cómo crear y borrar grupos, y las asignaciones que podemos hacer.

Para crear un grupo ejecutaremos la orden groupadd [nombre del grupo], mientras que para borrarlo haremos groupdel [nombre del grupo]. Ambas órdenes deben ejecutarse como root o mediante sudo.

Ninguna de las dos órdenes va a pedir confirmación, sin importar el número de usuarios que hubiera asociados al grupo en el caso del borrado. Por eso, es vital pensar mucho antes de ejecutar un borrado de grupo del sistema: sus integrantes pueden sufrir consecuencias inesperadas como la imposibilidad de acceder a discos duros externos, a dispositivos de vídeo, a ficheros… como veremos a continuación.

Asignar un usuario a un grupo

Para añadir un usuario a un grupo lo haremos mediante la orden usermod. Esta orden tiene muchas opciones que os dejo para consultar en el manual: la que nos interesa para la inmensa mayoría de los casos es usermod -aG [nombre del grupo] [nombre del usuario]. Con ella, añadimos un usuario al grupo sin importar (ni eliminarle de) los grupos a los que ya perteneciese anteriormente.

Para consultar los grupos a los que pertenece un usuario podemos usar la orden groups.

Para eliminar un usuario de un grupo ejecutaremos, también como súper usuarios, deluser [nombre de usuario] [nombre de grupo]. Ojo con esta orden pues es la misma que se usa para borrar totalmente un usuario, sólo que con otra opción más como es el nombre del grupo del que retirar al usuario. Si os confundís, le liáis la del pulpo al usuario víctima de vuestra confusión, porque esta orden no pide confirmación.

Asignar un fichero (o un directorio) a un grupo

Aquí empieza la potencia de los grupos. Podemos definir que ficheros o directorios pertenezcan a un grupo de usuarios: todo lo que existe en un sistema UNIX es propiedad de un grupo. Dicho de otra forma, a un grupo se le puede asociar un usuario mediante una relación de pertenencia (el usuario forma parte del grupo) pero también se le pueden asociar ficheros mediante una relación de propiedad (un fichero es propiedad de un grupo de usuarios).

Así, todo ese grupo de usuarios tendrán las mismas facultades sobre un fichero.

Para asociar un fichero a un grupo se ejecuta la ordenchgrp [nombre de usuario] /ruta/de/ficheros/o/directorios, o bien anteponiendo sudo, o bien como el usuario  root. Para consultar los permisos, propietarios y grupos (co-)propietarios de los ficheros, tenemos modificadores en la orden ls que nos ayudan, como es el modificador -l (ls -l)

NOTA: a diferencia de un usuario, que puede pertenecer a muchos grupos, un fichero sólo puede ser propiedad de un grupo. Lo mismo con un directorio, pero sin embargo podemos hacer que un directorio pertenezca a un grupo pero su contenido (directorios o ficheros) a otros. No confundáis un directorio y los permisos sobre éste, con su contenido y los permisos sobre su contenido.

El usuario propietario de un fichero

Cuando un usuario crea un fichero, tanto desde el terminal como a través de haber ejecutado un programa, es su propietario por pleno derecho. El propietario de un fichero, siempre y cuando pueda acceder al mismo, está siempre facultado a cambiarle los permisos. Ahora llegamos a los permisos 🙂

Sin embargo, un fichero puede llegar a ser propiedad de un usuario y al, mismo tiempo, propiedad de un grupo, pertenezca el usuario propietario del fichero a él, o no. En este caso, siempre prevalece la propiedad del usuario sobre la del grupo. Cuando el usuario pertenece al mismo grupo al que pertenece el fichero, el grupo es tratado como “el resto de usuarios que pertenecen al grupo aparte del propietario”.

El propietario de un fichero no puede cambiar el grupo al que pertenece un fichero, pero el usuario root sí, mediante la orden chown (cuyo modo de uso te dejo que consultes tú en el manual).

Para consultar los permisos, propietarios y grupos (co-)propietarios de los ficheros, tenemos modificadores en la orden ls que nos ayudan, como es el modificador -l (ls -l)

El fondo de la cuestión: los permisos

A todo fichero o directorio en un sistema Linux se le asocian permisos en tres aspectos:

  • Permisos de lectura: para acceder al contenido y verlo, leerlo o procesarlo.
  • Permisos de escritura: para modificarlo.
  • Permisos de ejecución: para ejecutar el contenido de un fichero, si es un programa.

Cuando se trata de directorios, los permisos de lectura permiten al usuario listar su contenido, los de escritura crear archivos dentro, y los de ejecución atravesarlo, por ejemplo haciendo cd, o por otro lado escribiendo una ruta que lo atraviese: /esta/ruta/por/ejemplo atraviesa el directorio “por”.

Estos permisos se asocian en tres niveles:

  • Usuario propietario del fichero
  • Grupo co-propietario del fichero
  • El resto de usuarios del sistema

La prioridad va de arriba a abajo en el sentido de que el propietario de un fichero es quien tiene más poder, y por lo tanto sus permisos prevalecen, el grupo co-propietario es el siguiente, y el resto es el menos prioritario.

Los permisos se representan de dos formas: mediante una cadena de 10 letras, en la cual la primera que pueden ser d (o nada) y cada una de las otras 9 r, w o x.

  • d  significa que el elemento cuyos permisos estamos viendo es un directorio, y por lo tanto aplica lo que he discutido arriba. Si no hay d, es que es un archivo.

Para el resto de permisos, la ausencia indica que no se concede el permiso, la presencia indica que sí se concede el permiso.

  • r significa lectura.
  • w significa escritura
  • x significa ejecución

Del orden de las letras obtenemos el nivel del permiso: las tres primeras a la izquierda aplican al usuario propietario del fichero o del directorio, las tres siguientes al grupo propietario, y las tres últimas, a la derecha, al resto de usuarios del sistema. Como hemos discutido, los permisos se aplican en orden de prioridad en el mismo sentido en que se leen de izquierda a derecha; primero el propietario, luego el grupo y luego el resto de usuarios del sistema.

Un ejemplo sería el siguiente:

-r-xr--r--

En este caso estamos ante un fichero cuyo propietario puede leer y ejecutar, los usuarios del grupo propietario pueden leer solamente (excepto si el propietario es también parte del grupo, caso en el que lo podría ejecutar porque sus permisos tienen más peso), y el resto de usuarios del sistema también.

Otro ejemplo:

drwxr-x---

Ahora estamos viendo un directorio cuyo propietario puede listar su contenido (con ls), crear ficheros dentro y atravesarlo; el grupo al que pertenece el directorio puede examinarlo y atravesarlo, pero no crear ficheros dentro. Por último, el resto de usuarios del sistema no puede hacer nada… excepto root, claro.

¡Nada de esto puede detener al usuario root!

Para consultar los permisos, propietarios y grupos (co-)propietarios de los ficheros, tenemos modificadores en la orden ls que nos ayudan, como es el modificador -l (ls -l)

Los permisos se cambian con la orden chmod, a la que se puede especificar lo siguiente:

  • El nivel o niveles de aplicación:
    • u para el usuario propietario.
    • g para el grupo propietario
    • o, de otros para el resto de usuarios del sistema: otros.
    • a  engloba a los tres anteriores al mismo tiempo.
  • Un + para otorgar, o un – para quitar.
  • El permiso, recordemos:
    • r significa lectura.
    • w significa escritura
    • x significa ejecución

Serían construcciones válidas chmod a+x[fichero] , chmod a-x [fichero] , chmod u+rw [fichero] y chmod go-w [fichero] , es decir: podemos agrupar tanto niveles sobre los que actuar como permisos que otorgar.

Además puedo combinar separados por comas varias modificaciones en una misma orden, separándola por comas. Por ejemplo, chmod a+x,u+rw,go-w [fichero]  otorga permisos de ejecución a todos los usuarios, al propietario le garantiza permisos de lectura y escritura, y tanto al grupo como a otros usuarios les quita permisos de escritura.

Vamos a ver todo esto con un ejemplo práctico sencillo: planificar los permisos de un aula de informática.

Ejercicio: el aula de informática

En el aula de informática existen dos profesores que enseñan Python a un grupo de 6 alumnos. Tanto los profesores como los alumnos pueden entrar en todos los ordenadores del aula con sus nombres de usuario, que son pepe  y paco para los profesores y alba, alicia, marta, marcos, pedro y juan  para los alumnos. Cada uno tiene su contraseña y su directorio personal.

A ti, que eres el encargado de montar el aula de informática, te piden lo siguiente:

  • Los profesores deben poder leer y ejecutar los programas de los alumnos.
  • Los alumnos no pueden leer ni ejecutar los programas de los otros alumnos.
  • Todos los alumnos deben poder leer los archivos de los profesores, pero no ejecutarlos ni modificarlos.

Solución

Crearemos los usuarios con la orden adduser [usuario] , pues es la interactiva que permite crear usuarios humanos. Eso creará directorios de inicio bajo /home donde poder practicar.

Empezaremos restringiendo los permisos de los alumnos entre ellos, pero garantizando el acceso de lectura de los profesores a todos los ficheros de los alumnos. Me centraré en alba como alumna y en paco como profesor para el ejemplo, aunque habría que extenderlo a todos los demás.

  • Que los directorios raíz de los alumnos (por ejemplo, /home/alba) pertenezcan a un grupo ajeno a los alumnos, como puede ser profesores , y no otro grupo, ni siquiera al suyo propio aunque ellos sean los propietarios.
    • chgrp profesores /home/alba
  • Los profesores deben pertenecer también a ese grupo, profesores.
  • Los alumnos no pueden pertenecer al grupo de profesores.
  • El directorio raíz de  alba , en este ejemplo, debe tener los permisos drwxr-x---
    • chmod u+rwx,g+rx,g-w,o-rwx /home/alba
    • Es un directorio: d
    • Escritura, lectura y ejecución, para  albarwx
    • Lectura y ejecución para el grupo, que es  profesores:r-x
    • Ninguno para el resto de usuarios:---

De esta forma, sólo alba  y el grupo profesores podrán entrar en su directorio raíz y, por lo tanto, acceder a su información: da igual los permisos individuales que tengan los ficheros y los directorios bajo ~alba.: al no poder atravesarlo, no podrán leerlo ni aunque todos los usuarios tuvieran permisos totales. Pero es que, además, el grupo deprofesores no podrá escribir información en sus ficheros aunque sí leerlos y ejecutarlos para evaluarlos.

De la misma forma,  alba no podrá entrar en el directorio de  juan si le aplicamos los mismos permisos a su carpeta de inicio, ~juan.

Si alba no quita permisos a los ficheros que crea, los profesores podrán leerlos sin ningún problema ya que los ficheros se crean por defecto con el grupo de permisos -rw-r--r--, es decir: lectura y escritura para ella misma, lectura para el grupo (que al haberlo creado ella, será ella misma y no los profesores) y lectura para todos los demás, incluyendo a los profesores.

Sin embargo, alba tendrá que asegurarse personalmente que los profesores pueden ejecutar sus trabajos dándoles permisos de ejecución. Lo hará ejecutando chmod uo+x [fichero a convertir en ejecutable]en lugar de simplemente chmod +x [fichero a convertir en ejecutable]. De esa forma, el conjunto de permisos quedará como sigue:

-rwxr--r-x

El efecto que tiene esto es que podrán ejecutarlo solamente:

  • Ella misma.
  • Cualquier otro usuario con permiso de acceso a todos los directorios que conducen hasta el fichero ejecutable, incluyendo su directorio personal (al que el resto de los alumnos no pueden acceder)

Es decir, podrán ejecutarlo ella misma y los profesores, pero no el resto de los alumnos.

El acceso de los alumnos al programa de sus profesores es fácil: los profesores sólo tienen que dar permisos de lectura a “otros” sobre los ficheros que quieren que se puedan leer y, además, a todos los directorios que conduzcan hasta ellos, y no de escritura ni de ejecución. Por defecto, los ficheros se crean con acceso de lectura para todos los usuarios (el propietario, los del grupo al que pertenece y el resto) y de escritura para el dueño.

Así pues, lo que tienen que hacer los profesores es asegurarse de que cuando den permisos de ejecución sobre un fichero lo hagan exclusivamente para ellos, o para ellos y el resto de profesores: chmod u+x [fichero]  o chmod ug+x [fichero] , pero no al resto simplemente con el modificador +x. Si no han restringido ningún otro permiso, ya debería funcionar.

Conclusiones y recomendaciones

Podréis decir: “Vale, pero esto es para ficheros. No es tan potente, porque hay muchas otras cosas en un ordenador”. Lo bonito de todo esto es lo que os contaba al principio del artículo y es que, en UNIX, absolutamente todo en el sistema, desde el teclado a la pantalla, pasando por todas las unidades de almacenamiento conectadas, los joysticks, el sistema de sonido… toma forma de fichero para facilitar su gestión. Es decir, uno puede restringir el que un usuario use el DVD-ROM con tan sólo cambiar los permisos sobre un fichero especial que representa a un dispositivo físico.

Lo que hemos visto en este artículo es muchísimo más de lo que vais a necesitar en la mayoría de las ocasiones. Sin embargo, conviene tener algún “poso” de todos estos temas aunque sólo sea de pasada, por si en alguna ocasión tenéis que echar mano de algo de esto.

Mi recomendación es que, si no tenéis nada mejor que hacer, creéis unos cuantos usuarios y unos cuantos grupos para despejar cualquier incertidumbre, palpar bien todos estos temas y crearos vuestras propias sensaciones e inquietudes. Os propongo, por poner un ejemplo, provocar de varias formas que el usuario propietario de un fichero sea incapaz de acceder a él.

Si tenéis cualquier duda no dudéis en contactar por los canales habituales: comentarios y formulario de contacto, donde además encontraréis una dirección de correo electrónico para escribirme siempre que queráis.

Un comentario en “Permisos, usuarios y grupos en Linux

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *