Este artículo demuestra el uso de las diferentes herramientas de gestión de grupos de usuarios en un sistema GNU/Linux, así como su funcionamiento y utilidad.

Los grupos Unix son colecciones lógicas de usuarios del sistema. El uso principal de los grupos es para asignar permisos Unix sobre archivos y directorios a nivel grupo, tal como explica el artículo Usuarios, grupos, permisos y modos octales en sistemas Unix. Como resultado, esto permite que ciertos usuario del sistema puedan tener los mismos privilegios sobre un archivo o directorio.

Cada grupo es independiente de los demás y no hay una relación específica entre los grupos. Generalmente los sistemas GNU/Linux vienen con ciertos grupos predeterminados que cumplen funciones específicas. Por ejemplo el grupo "audio" hace que todos sus miembros sean capaces de utilizar dispositivos de sonido. De forma similar para los diferentes tipos de dispositivos de entrada/salida, diferentes tipos de servicios, tareas administrativas, etc.

En sistemas Unix, la información de grupos se mantiene en el archivo /etc/group, mientras que la información de contraseñas de grupos se mantiene en /etc/gshadow. Los grupos pueden tener contraseñas. Esto es utilizado cuando se desea cambiar el grupo principal por uno al que no se es miembro.

Diferencias entre grupo principal y grupo suplementario

El grupo principal determina cuál será el grupo dueño de los archivos creados por el usuario. Cabe recordar que los permisos Unix admiten una configuración de permisos para un único grupo.

Un usuario puede pertenecer a varios grupos pero al momento de crear un nuevo archivo, este será creado a nombre del grupo principal

Por ejemplo, los siguientes archivos (correspondientes a dispositivos de sonido) están a nombre del usuario "root" y grupo "audio":

emi@hal9000:~$ ll /dev/snd/
total 0
drwxr-xr-x  2 root root       60 Nov 12 07:20 by-path
crw-rw----+ 1 root audio 116, 13 Nov 12 07:20 controlC0
crw-rw----+ 1 root audio 116, 11 Nov 12 07:20 hwC0D0
crw-rw----+ 1 root audio 116, 12 Nov 12 07:20 hwC0D2
crw-rw----+ 1 root audio 116,  3 Nov 12 07:21 pcmC0D0c
crw-rw----+ 1 root audio 116,  2 Nov 12 10:00 pcmC0D0p
crw-rw----+ 1 root audio 116, 10 Nov 12 07:21 pcmC0D10p
crw-rw----+ 1 root audio 116,  4 Nov 12 07:21 pcmC0D1p
crw-rw----+ 1 root audio 116,  5 Nov 12 07:20 pcmC0D2c
crw-rw----+ 1 root audio 116,  6 Nov 12 07:21 pcmC0D3p
crw-rw----+ 1 root audio 116,  7 Nov 12 07:21 pcmC0D7p
crw-rw----+ 1 root audio 116,  8 Nov 12 07:21 pcmC0D8p
crw-rw----+ 1 root audio 116,  9 Nov 12 07:21 pcmC0D9p
crw-rw----+ 1 root audio 116,  1 Nov 12 07:19 seq
crw-rw----+ 1 root audio 116, 33 Nov 12 07:20 timer

Es necesario entender que el archivo /etc/group gestiona los grupos suplementarios. Por ejemplo, según el archivo /etc/group, ningún usuario pertenece al grupo "emi":

emi@hal9000:~$ grep "^emi" /etc/group
emi:x:1000:

Aunque tanto groups como id reportan que el usuario "emi" es miembro del mismo:

root@hal9000:~# groups emi
emi : emi cdrom floppy audio dip video plugdev netdev lpadmin scanner
root@hal9000:~# id emi
id=1000(emi) gid=1000(emi) groups=1000(emi),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner)

Esto se debe a que "emi" es el grupo principal del usuario "emi", lo cual se puede comprobar examinando la configuración del usuario en el archivo /etc/passwd:

root@hal9000:~# grep emi /etc/passwd
emi:x:1000:1000:Emiliano,,,:/home/emi:/bin/bash

El cuarto campo de la entrada del usuario es igual a "1000" el cual corresponde con el ID del grupo "emi".

La página de manual passwd de la sección 5 describe el formato y los diferentes campos dentro de la definición de usuarios del archivo /etc/passwd:

man 5 passwd

Listar grupos

Para listar todos los grupos existentes en el sistema, basta con volcar el contenido del archivo /etc/group con cat, less, more, o cualquier otra herramienta similar:

root@hal9000:~# head /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:

Para cada grupo se muestra su ID y lista de usuarios miembros del mismo:

emi@hal9000:~$ cat /etc/group | grep audio
audio:x:29:emi,pulse

Si en cambio se desea listar todos los grupos a los que pertenece un usuario específico, se puede recurrir a la herramienta groups:

emi@hal9000:~$ groups emi
emi : emi cdrom floppy audio dip video plugdev netdev lpadmin scanner
emi@hal9000:~$ groups pulse
pulse : pulse audio

También es posible recurrir a id, la cual muestra además los ID para cada grupo junto con los valores de "id" y "gid" por defecto para las sesiones del usuario pasado como parámetro.

Cambiar el grupo principal

La herramienta id permite listar los ID de usuario y grupo reales y efectivos. El grupo real es el grupo principal al cual el usuario pertenece, mientras que el grupo efectivo, es el grupo principal utilizado la sesión actual (valor de GID actual). El grupo efectivo coincide con el grupo real, salvo que durante la sesión actual se cambie con la herramienta nwegrp.

newgrp permite loguearse en una nueva sesión utilizando un grupo principal diferente. El usuario debe pertenecer al grupo que se desea cambiar (como grupo suplementario) de lo contrario se solicitará la contraseña del grupo.

Veamos un ejemplo. El grupo principal real y efectivo del usuario "emi" es "emi":

emi@hal9000:~$ id emi
uid=1000(emi) gid=1000(emi) groups=1000(emi),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner)
emi@hal9000:~$ id
uid=1000(emi) gid=1000(emi) groups=1000(emi),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner)

Cuando se crea un archivo, el grupo dueño es "emi", a pesar de que el usuario "emi" pertenece a varios grupos suplementarios (tal como era de esperarse, pues ese es el rol del grupo principal):

emi@hal9000:~$ touch /tmp/test1
emi@hal9000:~$ ll /tmp/test1
-rw-r--r-- 1 emi emi 0 Nov 12 11:19 /tmp/test1

Ahora, se inicia una nueva sesión con newgrp como "audio" como grupo principal:

emi@hal9000:~$ newgrp - audio

El grupo real sigue siendo "emi", sin embargo, el grupo efectivo ahora es "audio":

emi@hal9000:~$ id emi
uid=1000(emi) gid=1000(emi) groups=1000(emi),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner)
emi@hal9000:~$ id   
uid=1000(emi) gid=29(audio) groups=29(audio),24(cdrom),25(floppy),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner),1000(emi)

Veamos que pasa si se crea un nuevo archivo desde esta sesión:

emi@hal9000:~$ touch /tmp/test2
emi@hal9000:~$ ll /tmp/test2
-rw-r--r-- 1 emi audio 0 Nov 12 11:19 /tmp/test2
emi@hal9000:~$ exit
logout
emi@hal9000:~$

Crear un grupo

Para crear un nuevo grupo, se utiliza groupadd, pasando un nombre de grupo como parámetro:

root@hal9000:~# groupadd grupito
root@hal9000:~# grep grupito /etc/group
grupito:x:1001:

Agregar a un usuario a un grupo

La herramienta de gestión de usuarios usermod permite agregar a un usuario a un grupo suplementario, o también cambiar el grupo principal del usuario.

Agregar a "emi" al grupo "grupito" como grupo suplementario:

root@hal9000:~# usermod -a -G grupito emi
root@hal9000:~# groups emi
emi : emi cdrom floppy audio dip video plugdev netdev lpadmin scanner grupito
root@hal9000:~# id emi
uid=1000(emi) gid=1000(emi) groups=1000(emi),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner),1001(grupito)

La opción -a se utiliza para agregar, y hace que no sea necesario replicar toda la lista de grupos suplementarios en la opción -G.

Es posible comprobar la entrada en /etc/group luego de haber agregado al usuario:

root@hal9000:~# grep grupito /etc/group
grupito:x:1001:emi

Agregar a "emi" al grupo "grupito" como grupo principal:

root@hal9000:~# usermod -g grupito emi
root@hal9000:~# groups emi
emi : grupito cdrom floppy audio dip video plugdev netdev lpadmin scanner
root@hal9000:~# id emi
uid=1000(emi) gid=1001(grupito) groups=1001(grupito),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner)

Notar que se ha agregado el usuario "emi" al grupo "grupito" como grupo principal (opción -g), siendo que ya había sido agregado como grupo suplementario. Es interesante comprobar que si se vuelve a cambiar el grupo principal, automáticamente vuelve a aparecer al final del listado como grupo suplementario:

root@hal9000:~# usermod -g emi emi
root@hal9000:~# groups emi
emi : emi cdrom floppy audio dip video plugdev netdev lpadmin scanner grupito

La herramienta gpasswd permite administrar los archivos /etc/group y /etc/gshadow (contraseñas de grupos) y es otra alternativa para agregar y remover usuarios de grupos:

root@hal9000:~# gpasswd -a emi grupito
Adding user emi to group grupito
root@hal9000:~# groups emi
emi : emi cdrom floppy audio dip video plugdev netdev lpadmin scanner grupito
root@hal9000:~# id emi
uid=1000(emi) gid=1000(emi) groups=1000(emi),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner),1001(grupito)

Sin embargo, sólo permite trabajar con grupos suplementarios. Para cambiar el grupo principal se debe recurrir a usermod, tal como se mostró anteriormente.

Remover usuarios de un grupo

En Debian y derivados, la herramienta deluser permite eliminar un usuario de un grupo de manera sencilla. Simplemente basta con pasar el nombre del usuario que se desea eliminar, y el grupo en cuestión:

root@hal9000:~# deluser emi grupito
Removing user `emi' from group `grupito' ...
Done.

Cabe destacar que no se elimina el usuario del sistema, sólo se lo remueve del grupo pasado como parámetro. No confundir con la herramienta userdel, la cual sí elimina un usuario del sistema:

root@hal9000:~# groups emi
emi : emi cdrom floppy audio dip video plugdev netdev lpadmin scanner

También es posible utilizar la herramienta gpasswd para lograr el mismo resultado mediante la opción -d. Veamos un ejemplo:

root@hal9000:~# usermod -a -G grupito emi
root@hal9000:~# groups emi
emi : emi cdrom floppy audio dip video plugdev netdev lpadmin scanner grupito
root@hal9000:~# gpasswd -d emi grupito
Removing user emi from group grupito
root@hal9000:~# groups emi
emi : emi cdrom floppy audio dip video plugdev netdev lpadmin scanner

La alternativa menos práctica para eliminar a un usuario de un grupo suplementario consiste en emplear la opción -G de usermod sin -a. Esto significa que se redefinen todos los grupos sumplementarios. A tal fin se pasa la nueva lista de grupos suplementarios separados por coma.

Eliminar un grupo

Finalmente, para eliminar un grupo del sistema, se debe recurrir a groupdel:

root@hal9000:~# groupdel grupito
root@hal9000:~# grep grupito /etc/group
root@hal9000:~# echo $?
1

Referencias

  • man group
  • man groups
  • man groupadd
  • man id
  • man usermod
  • man deluser
  • man gpasswd
  • man passwd
  • man 5 passwd

Compartí este artículo