12-Jun-2018 22:10
Linux al igual que otro sistema operativo basado en UNIX, por herencia obtiene uno de los hitos que marcó un antes y después en la era de los sistemas, y es el término multiusuario. Esto quiere decir que nos permite tener diferentes cuentas de distintos usuari@s iniciadas en el sistema corriendo n procesos a la vez pertenecientes a cada usuario. Anteriormente, si querías hacer uso del sistema y otra persona quería utilizarlo, no podías ya que tod@s disponían de una sola sesión de usuario, sin embargo con los avances que hicieron en el pasado, sacaron adelante esta magnífica característica, la del multiusuario.
L@s usuari@s son personas que tienen un determinado nivel de acceso tanto a la empresa dónde resida el equipo al que pueden acceder y operar, como en su equipo personal. A nivel lógico, esto se conoce como cuentas de usuari@, las cuáles contienen como mínimo un nombre para la cuenta siendo este el nombre de usuari@ y una contraseña. No obstante, l@s desarrolladores de sistemas operativos o de cualquier otro tipo de software intentan simplificar el tratamiento de las cuentas de usuarios mediante un ID numérico, ya que se consume menos recursos buscando números que letras.
En Linux, esos ID asignados a los usuarios se les denominan UID User Identifier o identificador de usuario. Según la distribución, el primer usuario o la primera usuaria del sistema, este establece un UID de 1000, y comienza a sumarse +1 a los posteriores UID creados. También, se añade un grupo nuevo al sistema con el mismo nombre de la cuenta del usuario o de la usuaria y se establece como un grupo primario con el mismo ID.
Como norma general y es altamente recomendado hacer uso de los comandos useradd(8)
o adduser(8)
podríamos crear un(a) usuari@ a mano, haciendo los siguientes pasos y como usuario root o haciendo uso de sudo(1)
:
grep 100* /etc/group
grep 100* /etc/passwd
/etc/passwd
haciendo uso de vipw(8)
añadiendo la información mínima para tener un(a) usuari@, vamos ha hacerlo con "pepito":
pepito:x:1004:1004::/home/pepito:/bin/bash
/etc/group
pepito:x:1004:
/etc/shadow
mediante haciendo uso de vipw -s
:
_NOTA:Para saber que algoritmo cifrado utilizar, podemos comprobarlo en el fichero /etc/login.defs
, en la variable ENCRYPT_METHOD
lo que pasa que utiliza el sistema un salto o varios (lo desconocemos) para generar la contraseña a parte de la codificiación. Para visualizar el prefijo que necesitamos se puede consultar en man 3 crypt
_
$1$
: MD5$2a$
: Blowfish$5$
: SHA-256$6$
: SHA-512Sin embargo, es altamente recomendable generar una contraseña nueva haciendo uso del comando passwd(1)
, ya que esta genera la contraseña con el salto correcto, el algoritmo correcto y se genera automáticamente la entrada en /etc/shadow
: passwd pepito
/home/nombre_usuari@
/var/spool/mail/nombre_usuari@
/etc/skel/* en /home/nombre_usuari@
/home/nombre_usuari@
nombre_usuari@:grupo_usuari@
+ chmod 700
chmod 660 /var/spool/mail/nombre_usuari@
Y listo, tendremos a nuestr@ usuari@ cread@. No obstante, este proceso, además de ser tedioso, complejo y propenso a errores, es preferible hacer uso de unos comandos que nos facilitan crearlo.
useradd(8)
Con este comando generamos un(a) usuari@ en ¡menos que canta un gallo! Todo lo que tenemos que hacer es:
sudo useradd pepito -m
sudo passwd pepito
Y ya directamente tenemos usuari@ con su directorio /home
y /var/spool/mail
por defecto con sus correspondientes permisos, con la entrada correctamente creada en el fichero /etc/passwd
, /etc/shadow
y /etc/group
listo para identificarse.
¿Fácil verdad? También hay que tener en cuenta, que la configuración por defecto del comando useradd(8)
que se encuentra en /etc/default/useradd
, ya que puede haber otras distribuciones que tengan otros parámetros, o directamente, no contenga ningún fichero y hay que especificarlo de forma manual tal que así:
sudo useradd pepito -m -k /etc/skel -U
sudo passwd pepito
-m
: Genera un directorio en /home
con el nombre de pepito-k /etc/skel
: Copia los archivos básicos para que funcione plenamente bash(1)
-U
: Crea un grupo con el mismo nombre que el usuarioadduser(8)
Si no tenemos suficiente con el anterior, podemos hacer uso de adduser(8)
. Es un comando parecido al anterior, no hay mucha diferencia de usabilidad al menos en Linux. En FreeBSD, este comando tiene por defecto un asistente interactivo que nos va preguntando paso por paso cómo crearlo facilitándonos un poco la tarea. Este comando toma los valores para crear el usuario del fichero /etc/default/useradd
como el comando anterior.
Según el man
de ambos comandos, tenemos una serie de ficheros implicados cuando ejecutamos uno de los dos comandos para crear el o la usuari@.
/etc/passwd
: Archivo clave con la información de la cuenta de usuari@/etc/shadow
: Información sobre la seguridad de la cuenta de usuari@/etc/group
: Grupos con sus correspondienes GID, usuari@s unid@s.../etc/gshadow
: Información relevante sobre la seguridad de los grupos/etc/default/useradd
: Esquema por defecto sobre cómo crear la cuenta de usuari@/etc/skel/
: Directorio que contiene ficheros por defecto para el/la usuari@/etc/login.defs
: Configuración del cifrado de las contraseñas, permisos...etcSi nos encontramos logeados mediante nuestr@ usuari@ rutinario, pero queremos acceder a otras cuentas del sistema, podemos hacerlo haciendo uso del comando su(1)
.
Estamos en la cuenta de pepito, y queremos pasar a la de susana.
su - susana
Tenemos un comando (¿Cómo no?), para modificar y actualizar la información de nuestr@ usuari@. Este comando se llama usermod(8)
. Entre otras cosas, nos permite bloquear una cuenta, actualizar y gestionar lá fecha de demora y fecha límite para cambiar la contraseña, añadir un usuario a grupos secundarios...
Por ejemplo, bloquear una cuenta
sudo usermod -L pepito
Si vemos el /etc/passwd
, habrá añadido delante de la contraseña una (!), eso quiere decir que se encuentra bloqueada la cuenta.
Desbloqueando la cuenta:
sudo usermod -U pepito
Añadiendo un(a) usuari@ a un grupo nuevo
sudo usermod -a -G pepito video
Cambiando el grupo principal
sudo usermod -g users pepito
Modificando el shell del/la usuari@
sudo usermod -s /bin/bash pepito
Cambiando el directorio de trabajo
sudo usermod -d /srv pepito
Insertando un comentario
sudo usermod -c "Comentario" pepito
Podemos obtener más información accediendo al man(1)
de usermod(8)
Como la mayor parte de las cosas en Linux o sistemas UNIX-like, se puede hacer prácticamente todo a mano, esto se puede hacer al sentido inverso cuando creamos el/la usuari@ en el sistema.
/etc/passwd
haciendo uso de vipw(8)
/home/pepito
o el asignado, en caso de haber escogido otro directorio/var/spool/mail/pepito
/etc/groups
pero haciendo uso de vigr(8)
Y si queremos evitarnos tanta historia, bastará con hacer uso del comando userdel(8)
Tan solo con ejecutar:
sudo userdel -r pepito
Habremos hecho todos los pasos anteriores con un sencillo comando.
Tod@s l@s usuari@s poseen un entorno de trabajo por defecto que se encuentra en el directorio /home
. Este entorno de trabajo contiene el nombre de la cuenta del/la usuari@ y le permite trabajar en él y que, por defecto, se van almacenando archivos de configuración de programas entre un largo etcétera.
Existe un usuario por defecto creado en el sistema llamado root. Este usuario por defecto en todos los sistemas UNIX, UNIX-like como Liux, FreeBSD, Minix...etc tiene acceso a tod@s los archivos, carpetas, operaciones con dispositivos, procesos... del sistema. Es muy importante utilizarlo lo menos posible y nunca revelar su contraseña, o ejecutar aplicaciones sobre todo gráficas con este usuario.
Por lo general, los grupos son agrupaciones de personas que tienen un objetivo en común, si bien pueden ser personas que tienen el mismo gusto por ver a su cantante favorito como obtener los mejores diseños de sus productos para una empresa. En nuestro caso, los grupos permiten formar un conjunto de usuari@s que desempeñen un rol determinado dentro del sistema. Creando, modificando documentos que ell@s hayan generado pero que otr@s que no pertenezca a dicho grupo no tengan permisos para hacerlo. Un usuario, o una usuaria puede formar parte de más de un grupo a la vez, pero por defecto, tienen un grupo primario al que pertenecen.
Los grupos como l@s usuari@s, contienen un ID que faciliten su recuperación dentro del sistema, en este caso se llama GID de Group Identifier o Identificador de grupo. El sistema por defecto tiene unos grupos ya asignados para determinadas actividades del mismo para diferentes tareas como el acceso a los dispositivos de audio y video entre otras cosas.
Los grupos primarios son algo así como el grupo principal al que pertenece un/una usuari@. Cada archivo que cree o modifique deberá contener el mismo grupo o si no, no podrá hacerlo a menos que se encuentre añadido a un grupo secundario. Un grupo primario como su nombre indica, es el primer grupo al que pertenece y por ende solo podrá tener un GID asociado a la cuenta. Sin embargo, una cuenta de usuari@ puede pertenecer a muchos grupos secundarios.
Existen una serie de ficheros clave que todo administrador debe saber que existen:
/etc/passwd
: Contiene los nombres de usuario, contraseñas (en antiguas versiones que no usen shadow(5)
, UID, GID, descripción, directorio de trabajo y el intérprete de comandos que utilice. Cuando en el campo de la contraseña se encuentra una "x" quiere decir que hace uso del archivo /etc/shadow
/etc/shadow
: Es un fichero que contiene todas las contraseñas ya sean de grupos o de usuari@s cifradas en un algoritmo determinado por el sistema, se utiliza para evitar que las contraseñas se puedan leer en /etc/passwd
ya que tod@s l@s usuari@s tienen acceso lectura. Este archivo contiene:
/etc/shadow-
: Copia de seguridad del fichero anterior/etc/group
: Contiene nombre del grupo, contraseña (en caso de no usar shadow(5)
), GID, lista de usuarios adjuntos
Son los archivos principales y que tod@s tenemos que tener hechos una copia de seguridad en caso de que falle el sistema o nos equivoquemos editando alguno de ellos.
NOTA: A pesar de no ser altamente recomendable su edición, si queremos editar a mano los ficheros passwd(5)
o shadow(5)
tenemos que utilizar los comandos vigr(1)
para edición de grupos y vipw(1)
para edición de los ficheros tanto passwd(5)
como shadow(5)
.
Los grupos se pueden crear manualmente al igual que l@s usuari@s haciendo uso del comando vigr(8)
. No obstante, es preferible como siempre hacer uso de los comandos que nos faciliten las cosas más que nada para evitar incorrecciones de cualquier índole.
groupadd(8)
groupadd(8)
es una bella herramienta con la que crear un grupo, edita el fichero /etc/group
y a su vez actualiza el /etc/gshadow
para añadir la contraseña asignada
Creando un grupo
sudo groupadd sysadmins
Creando un grupo con GID específico
sudo groupadd -g 1200 sysadmins
Asignando contraseña a un grupo
sudo groupadd -p contraseña sysadmins
Como podemos modificar l@s usuari@s, ¿Por qué no los grupos? Pues claro que sí podemos hacerlo con groupmod(8)
.
groupmod(8)
Este comando nos permitirá modificar cierta información de los grupos que tenemos como por ejemplo:
Cambiando el nombre del grupo
sudo groupmod -n devels sysadmins
Cambiando el GID
sudo groupmod -g 1203 devels
Modificando la contraseña
sudo groupmod -p "Contraseña" devels
También es otra operación que podemos hacer con vigr(8)
, pero es mejor utilizando este método.
sudo groupdel devels
Los usuarios siempre utilizamos un grupo primario que permite identificarnos con diversas partes o áreas del sistema. En caso de haber actualizado algo que requiera de una persona conectada al ordenador, se puede hacer pasar por la otra persona para saber que... Entonces existen una serie de restricciones intrínsecas como no editar un documento a la vez, si has instalado un software reciente que requiere permisos y por tanto reiniciar la sesión gráfica, se puede evitar.
Básicamente es gracias al comando newgrp(1)
newgrp finance
Y con esto, se activa nuestro grupo secundario como primario.
Se puede ver fácilmente haciendo uso del comando
groups
Tenemos un pequeño comodín que nos permite modificar ciertas cosas de nuestr@ usuari@ o de un grupo en concreto como su contraseña. Esta herramienta se llama gpasswd(1)
y la tenemos instalada por defecto.
Añadiendo un(a) usuari@ a un grupo
sudo gpasswd -a pepito users
Eliminando un(a) usuari@ de un grupo
sudo gpasswd -d pepito users
Suprimir contraseña en un grupo
sudo gpasswd -r users
Poco sentido tiene diferenciar usuarios y grupos si no les atribuímos algún permiso especial que permita establecer una cierta jerarquía o distinción, ya que si no, estaríamos dejando un sistema horizontal en el que tod@s l@s usuari@s puedan hacer lo que quieran dentro del sistema. Aquí entra en juego el factor permisos.
Los permisos en UNIX se rigen por una serie de campos
root
.Imaginemos que tenemos el siguiente ejemplo:
Somos jefes(as) de un proyecto de desarrollo, y tenemos vari@s emplead@s a nuestro cargo. Nosotr@s como jefe(as) del proyecto, tenemos plena acción sobre todos los ficheros (somos autores). Y, seleccionamos determinados ficheros para determinados grupos, por ejemplo, todos aquellos ficheros que tengan que ver con el departamento de comunicación que tiene múltiples usuari@s, solo podrán acceder los de comunicación; el grupo de desarrolladores(as) tiene sus ficheros a cargo...etc Y cada usuari@ dentro de su grupo, tiene acceso pleno a los ficheros, sin embargo, las personas de otros grupos no pueden acceder a dichos archivos por las restricciones. Y luego, tenemos un apartado público, que solo podrá leer determinados archivos. ¡Voilá! hemos explicado el funcionamiento de usuarios y grupos de una forma sencilla.
Jefes(as) de proyecto
\º/ \ª/
|
|-------------------|
| Contabilidad |
| Directivas |
| Contratos |
|-------------------|
________________|______________
/ \
Comunicación Desarrollo
\º/ \ª/ \º/ \ª/
| |
|-----------------| |-----------------|
| Inventario RRSS | | Código fuente |
| Inversores | | Contraseñas OS |
| Media | | Servidores |
| ... | | ... |
|-----------------| |-----------------|
| |
| Todo el mundo
| \º/ \ª/\º/ \ª/
*-------------------------> \º/ \ª/\º/
\ª/ \ª/
|
|-------------|
| index.html |
| setup.sh |
| screenshots |
| Twitter |
| Facebook |
| Google+ |
|-------------|
Ahora vamos a traducir las palabras en el lenguaje que lo interpreta el sistema, tenemos hasta tres formas de conceder, modificar o leer permisos:
Formato verbal o por carácter: Se hacen uso de las letras para asignar, modificar o simplemente leer los permisos.
# | r | w | x | rw | rx | wx | rwx |
---|---|---|---|---|---|---|---|
Usuario | chmod u+r f1 | u+w | u+x | u+rw | u+rx | u+wx | u+rwx |
Grupo | chmod g+r f1 | g+r | g+x | g+rw | g+rx | g+wx | g+rwx |
Todo el mundo | chmod o+r f1 | o+r | o+x | o+rw | o+rx | o+wx | o+rwx |
Tod@s | chmod a+r f1 | a+r | a+x | a+rw | a+rx | a+wx | a+rwx |
Formato numérico basado en Octal: Se hace uso del 1 al 7 para definir los permisos
# | r | w | x | rw | rx | wx | rwx |
---|---|---|---|---|---|---|---|
Usuario | 400 | 200 | 100 | 600 | 500 | 300 | 700 |
Grupo | 040 | 020 | 010 | 060 | 050 | 030 | 070 |
Todo el mundo | 004 | 002 | 001 | 006 | 005 | 003 | 007 |
Usuario + Grupo | 440 | 220 | 110 | 660 | 550 | 330 | 770 |
Grupo + Mundo | 044 | 022 | 011 | 066 | 055 | 033 | 077 |
Usuario + M | 404 | 202 | 101 | 606 | 505 | 303 | 707 |
Tod@s | 444 | 222 | 111 | 666 | 555 | 333 | 777 |
umask(1p)
Si queremos asignar el valor 022 a la máscara, este es el valor que le tendremos que restar al número actual de permisos que se encuentre en el directorio actual.
Por ejemplo:
umask(1p)
tal que así:
umask 020
Cuando se declara una máscara en un directorio, todos los archivos y rutas que se creen dentro de él, heredarán estos permisos. No es que se aplique directamente al archivo/directorio.
Para visualizar los permisos tenemos el magnífico comando ls(1)
como hemos visto en el post de Mastering en Bash ~ Primeros pasos.
ls -al
Este comando muestra todos los archivos y directorios que se encuentren en el directorio actual además de los ocultos. En suma, muestra los enlaces tanto duros como simbólicos. En la siguiente salida, si nos fijamos en la primera columna de la izquierda veremos los permisos y el tipo de archivo.
lrwxrwxrwx. 1 sincorchetes sincorchetes 37 May 19 21:51 .steampath -> /home/sincorchetes/.steam/sdk32/steam
lrwxrwxrwx. 1 sincorchetes sincorchetes 35 May 19 21:51 .steampid -> /home/sincorchetes/.steam/steam.pid
drwxrwxr-x. 3 sincorchetes sincorchetes 4096 Mar 7 14:17 .subversion
-rw-rw-r--. 1 sincorchetes sincorchetes 8 Mar 28 22:29 .tasks
drwxrwxr-x. 2 sincorchetes sincorchetes 4096 Jan 20 04:25 .themes
drwx------. 3 sincorchetes sincorchetes 4096 Feb 12 01:10 .thumbnails
drwx------. 3 sincorchetes sincorchetes 4096 Jan 20 11:05 .thunderbird
drwxrwxr-x. 3 sincorchetes sincorchetes 4096 May 27 19:56 .tmux
-rw-rw-r--. 1 sincorchetes sincorchetes 370 May 27 19:57 .tmux.conf
drwxrwxr-x. 7 sincorchetes sincorchetes 4096 Jun 2 12:38 .vagrant.d
drwxr-xr-x. 2 sincorchetes sincorchetes 4096 Jun 4 17:08 Videos
Los archivos que contienen una "l" en los permisos denotan que son enlaces simbólicos y se puede además saber porque apuntan a otro directorio/fichero "->".
Aquellos que contienen una "d", denotan que son directorios y los que no contienen nada más que un "-" se interpretan como archivos.
Como podemos ver, se pueden asignar múltiples permisos a los archiv@s, ahora bien, ¿Qué pasa si queremos cambiar el autor del fichero, el grupo o ambos?
Podemos hacerlo gracias al comando chown(1)
:
chown usuario fichero/directorio
: Cambiando el autor del fichero y/o directoriochown usuario:grupo
: Cambiando el autor y el grupo al fichero y/o directorioSe puede asignar un autor a un fichero y tener un grupo diferente, el autor podrá modificarlo, leerlo o ejecutarlo en cualquier momento, es indiferente.
¿Qué pasa si tenemos much@s usuari@s dentro de un grupo cuyo grupo tiene asignado un directorio de trabajo y el usuario "Pepe" crea un fichero y la usuaria "Susana" intenta eliminarlo? Que podrá hacerlo siempre y cuando, se aplique una restricción llamada "Sticky Bit" del inglés, "bit pegajoso". Este permiso especial, permite restringir los archivos creados y modificados por l@s miembr@s de un grupo y evitar que se genere un "autosabotaje" o un borrado por error.
Para habilitarlo bastará con efectuar:
chmod 1000 archivo/directorio
ó
chmod u+t archivo/directorio
Aplicar permisos recursivos en los ficheros y subdirectorios de un directorio
chmod 1000 -R directorio
Cuando ejecutemos un ls(1)
, veremos que en los permisos se habrá añadido un "t" al final tanto para directorios como para ficheros, esto nos indica la activación del Sticky Bit, también aparecerá modo de ejecución permitido. Si aparece una "T" en vez de una "t", esto quiere decir, que se ha activado el Sticky Bit pero solo para el usuario actual, si vemos el resultado, no contienen permisos de ejecución y por lo tanto no se permitirá crear archivos/directorios.
Salida con Sticky Bit activado:
ls -al
total 8
drwxrwxrwt. 2 root root 4096 Jun 11 07:41 .
drwxrwxrwt. 3 root users 4096 Jun 11 07:41 ..
Salida con Sticky Bit activado para el usuari@ actual:
ls -al
total 8
drwxrwxrwx. 2 root users 4096 Jun 11 07:38 .
drwxrwxrwx. 3 sincorchetes sincorchetes 4096 Jun 11 07:37 ..
-rwxrw-rwT. 1 sincorchetes sincorchetes 0 Jun 11 07:38 12
Aquí os podemos mostrar con más claridad el funcionamiento:
En Linux existen una serie de condiciones especiales para determinados ejecutables, archivos... que pueden editarse o ejecutarse sin ser el propietario de los mismos. Esta característica nos otorga una cierta ventaja como por ejemplo, si queremos cambiar la contraseña de nuestr@ usuari@ podemos hacerlo sin ser usuario "root".
Si nos fijamos en los permisos del comando passwd
, veremos que tiene la letra "s" dentro de la ristra de permisos.
ls -al /usr/bin
-rwsr-xr-x. 1 root root 29008 Apr 12 11:24 passwd
Digamos que el/la usuari@ se hace pasar por "root" para intentar cambiar su contraseña y lo puede hacer gracias a estos permisos. Estos se llaman SUID Set User ID Bit o SGID Set Group ID Bit. Podemos verificar si un archivo o directorio lo tiene activado porque en los permisos del usuario tiene una "s" o en los permisos del grupo contiene "s". Solo el propietario del fichero/directorio puede declarar estos permisos "extendidos".
NOTA: En caso de contener una "S", esto quiere decir, que tanto el autor del archivo/directorio como el grupo y el resto del mundo no podrá editar, modificar y/o ejecutar archivos dentro del directorio. De hecho, veremos como se encuentra reducida la salida de permisos.
Blogtity theme - Tema elaborado por - Álvaro Castillo. Iconos obtenidos de: Numix Circle