Permisos y usuarios en linux

Passwd, shadow,group

Como podemos saber de manera rapida, que usuario somos, a que grupo pertenecemos entre otras cosas?

id

uid=1000(akerman) gid=1000(akerman) groups=1000(akerman),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),118(lpadmin)

El so por detras usa el uid para saber que somos nosotros, pero lo que vemos en pantalla es nuestro user.

El gid es el group id, seria el grupo al que pertenecemos, podemos pertenecer a mas de un grupo a la vez. Como asi tambien pueden haber varios usuarios en simultaneo.

En este cao vemos el gid como akerman, porque en michos sistemas gnu linux por default se crea un grupo con el nombre del mismo usuario.

Donde se encuentra esta informacion?

Como en todo lo demas, linux lo almacena en un fichero que se encuentra en /etc/passwd

Si hacemos un cat podremos ver que hay varios usuarios por default, que se usan para correr distintos procesos.

Buscando un usario con grep

Podemos buscar con grep akerman /etc/passwd y ahi solo nos devuelve todo lo pertinente a nuestro user:

akerman:x:1000:1000:akerman:/home/akerman:/usr/bin/zsh

lo primero que vemos es nuestro usuarios, luego, representado con una x es la contrasenia pero como esta hasheada en otro fichero diferente, la vemos asi.

Luego vemos el uid seguido del gid (1000:1000) a continuacion vemos el nombre real de la cuenta (akerman) seguido del directorio raiz.(/home/akerman) y por ultimo la shell por defecto del usuario (/usr/bin/zsh).

Donde esta la contrasenia?

En /etc/shadow, pero no pododemos verlo con nuestro usuario comun, tenemos que hacer uso de sudo para elevar privilegios.

sudo cat /etc/shadow

speech-dispatcher:!:19465::::::
fwupd-refresh:!:19465::::::
nm-openvpn:!:19465::::::
saned:!:19465::::::
colord:!:19465::::::
geoclue:!:19465::::::
gdm:!:19465::::::
cups-browsed:!:19465::::::
gnome-initial-setup:!:19465::::::
hplip:!:19465::::::
akerman:$6$y90oXybQMARK9P$Woi/hjdmznnO3TeLEZNfOMpaGW996NVDBnPgVg67VNfDPwk7XO.w8R.jZKFBYtHbufW9YUw47DETPGXSFKD/:19733:0:99999:7:::
guest:!:19755:0:99999:7:::
sambauser:!:19755:0:99999:7:::
dhcpcd:!:19758::::::
polkitd:!*:19758::::::

Como vemos las contrasenias estan cifradas, estas pueden ser descifradas con herramientas de cracking.

Donde esta la informacion de grupos

En etc/group

Los grupos pueden tambien pueden tener contrasenia, la cual con cat /etc/group la veriamos como una x.

Lectura(r),escritura(w) y ejecucion (x)

Si hacemos ls -lh vamos a ver que en la primer columna , tenemos los permisos

drwxrwxr-x   2 akerman akerman   4096 Jan 11 10:38 .astro
-rw-rw-r--   1 akerman akerman    580 Jan 11 10:32 astro.config.mjs
drwxrwxr-x   2 akerman akerman   4096 Jan 11 10:32 .devcontainer
drwxrwxr-x   7 akerman akerman   4096 May  9 10:49 dist
-rw-rw-r--   1 akerman akerman   2088 Jan 11 10:32 .eslintrc.json

En la tercer columna tenemos akerman que es el duenio del fichero y luego akerman
que es un grupo que tiene acceso a ese fichero.

En los permisos, la primera letra nos dice el tipo de archivo, repasemos.

  1. Si es d es que es un directorio.
  2. Si es una l es que es un enlace simbolico
  3. Si fuera un fichero especial una c
  4. Si no hay nada especial es -

Tenemos tres tipos de usuarios en nuestros ficheros cada uno tiene permisos individuales sobre el fichero o directorio:

  1. El propietario
  2. El grupo
  3. El World

World es el resto de usuarios que no sean propietarios y no pertenezcan a ningun grupo.

Las tres primeras letras marcan los permisos que tiene el duenio.

d__rwx__rwxr-x 

Los siguientes tres , son los permsiso del grupo:

drwx__rwx__r-x 

Las ultimas tres letras , son los permisos que tienen el resto de usuarios del sistema.

drwxrwx__r-x__ 

Significados de las letras

  1. r - read
  2. w - write
  3. x - execution

Si vemos un - significa que no tenemos ese permiso.

Permisos en directorios

En muchas ocasiones puede resultar confusa la asignación de permisos a directorios. A continuación os dejo un pequeño resumen que podréis recordar fácilmente.

Permisos en directorios:

El permiso de ejecución en los directorios permite acceder a los archivos dentro del directorio.

El permiso de lectura permite enumerar las entradas del directorio.

El permiso de escritura permite crear y eliminar entradas en el directorio.

Tener permiso de lectura o escritura en un directorio sin permiso de ejecución no es útil. Tener permiso de ejecución pero no de lectura es ocasionalmente útil: permite acceder a los archivos sólo si se conoce su nombre exacto, un mecanismo muy rudimentario de protección.

En la práctica los permisos útiles sobre un directorio son:

---: sin acceso

    --x: puede acceder a los archivos cuyo nombre se conoce

    r-x: acceso normal de sólo lectura

    rwx: acceso normal de lectura y escritura

Usuario root

El usuario root es un super usuario, porque tiene privilegios para realizar cualquier accion en nuestro sistema.

Este usuario no es un usuario de administracion, es un error grande tratarlo como tal. No hay que usarlo salvo casos muy especificos.

Incluso si tenemos un servidor linux, tenemos que crear un usario por separado y usar ese, nunca root.

Modificando permisos en octal

Lo primero que tenemos que saber es que para modificar los permisos de un fichero o directorio, tenemos que ser propietarios, o ser root.

Para modificar este tipo de permisos usarmos chmod

example permission image
  1. Lo primero es que la suma de cada grupo de permisos debe ser 7 en total como se ve en la imagen

  2. Lo segundo es que cada letra tiene su valor, r=4, w=2, x=1

  3. Entonces, si yo quiero dar el siguiente permiso a un fichero.txt: rw- -w- r-x debería ser algo así:

  • Usuario tendría “rw-” para lo cual debería sumar 4 + 2 = 6

  • Grupo tendría “-w-” para lo cual sería solo el valor de w = 2

  • Otros tendría “r-x” para lo cual tendría que sumar sus valores 4 + 1 = 5

ya con esto el comando para aplicar los permisos sería : chmod 625 fichero.txt

Modificaciones con persisos simbolicos.

Otra manera que tenemos de poner permisos sin usar la nomencaltura octal es usar la representacion simbolica.

Tene en cuenta que la representacion octal, es la mas comun y la que mas veces vas a leer en internet.

Usaremos como hicimos antes chmod, ademas vamos a referenciar a cada tipo de grupo de la siguiente manera:

  1. u para el usuario propietario
  2. g para el grupo
  3. o para todos los demas que no sean el caso 1 y 2
  4. a de all, incluye a todos los anteriores.

Ejemplo de uso para agregar a todos los usurios permisos de lectura sobre un fichero:

chmod a=r fichero1

En el caso anterior le dimos a todos los colectivos, u , g y o permisos de lectura a cada uno.

-r--r--r-- akerman akerman 19 oct fichero1

Si solo queremos que tenga escritura el propietario y el grupo lo hacemos asi :

chmod u+w,g+w fichero1

Para eliminar el permiso de escritorua al porpietario :

chmod u-w fichero1

Permisos por defecto: unmask

Cuando creamos un fichero por default tiene los siguientes permisos :

-rw-rw-r-- 1 akerman akerman 18 oct fichero1

En realidad por ejemplo , en ubuntu los permisos por defecto serian estos -rw-rw-rw-. Pero como vimos antes no es eso lo que se nos muestra. Esto quiere decir que algo modifico sus persmisos por default.

Esto quiere decir, que nosotros tambien podemos modificar cuales son los permisos por default con el que se crean nuestros archivos.

Si tipeamos unmask veremos la mascara que tenemos activa en este momento

unmask
0002

La mascara es una representacion en octal de los permisos. Para ir entendiendo esto , tenemos que omitir el entendimiento del primer cero de la izquierda.

Si hacemos unmask 0000 seteamos por default que unmask no haga nada sobre los archivos creados, por lo que si ahora creamos uno veremos que tiene los siguientes permisos:

-rw-rw-rw- 1 akerman .....

Esto funciona de manera inversa a cuando ponemos los permsos de manera octal, al unmask le decimos que permisos bloqueamos.

Por ejeplo si ahora queremos quitar para el resto de usuarios los permisos de escritura y lectura hariamos 4(r) + 2(w) y nos daria 6, por lo que unmask 0006 y los nuevos archivos se crearian con los siguientes permisos.

-rw-rw---- 1 akerman .....

Normalmente no tocaremos unmask al menos que queramos que algun sistema tenga seguridad adicional.

Setuid, Setgid, Sticky bit

En la seccion anterior dije que omitamos el primer 0 de unsmask Este cero permite setear permisos especiales y muy relevantes en cuanto a seguridad.

Cuando definimos el Setuid de un fichero o ejecutable, lo que pasa es que cualquier usuario que ejecute ese programa o directorio lo hara con el nombre del uid del propietario original.

Por lo que si root tiene permisos de ejecucion sobre un programa y tiene seteado el setuid. Cualquier otro usuario podria ejecutarlo pero para el programa quien lo ejecuta es root.Peligroso no?

Como setear el setuid?

Primero tiene sentido setarlo en un ejecutable. chmod 4770 fichero.txt Fijate que en chmod anterior seteamos con 4 el primero numero.

Ahora si hacemos ls -la fichero1.txt veremos que sale pintado en rojo, lo que nos dice que tiene seteado un setuid Ademas veremos el caracter s en los permisos de Setuid:

-rwsrwx--- 1 akerman akerman ..... fichero

Se listan los numeros que se puden usar com primer parametro:

0: No hay bits especiales establecidos. 1: Establece el Sticky bit. 2: Establece el SetGID (Set Group ID) bit. 3: Establece tanto el SetGID como el Sticky bit. 4: Establece el SetUID (Set User ID) bit. 5: Establece tanto el SetUID como el Sticky bit. 6: Establece tanto el SetUID como el SetGID. 7: Establece el SetUID, SetGID y el Sticky bit.

setgid

Si setuid nos permite ejecutar un programa en nombre del propietario setgid hara lo sismo pero en nombre del grupo propietario.

chmod 2770 fichero

Si hacemos ls -la veremos que es de color amarillo su resaltado, lo mismo, veremos s en el segmento de grupo, que nos dice que ese programa sera ejecutado como si fueramos miembros del grupo .

Sticky bit

Sirve mas que nada en directorios.

Cuando se aplica a un directorio, el mismo y sus sub directorios solo podran ser renombrados y eliminados por los propietarios de esos archivos, el owner de la carpeta y root.

chmod 1770 folder/

Ahora con ls -la el directortio se remarca en azul , y vemos en los permisos una T

drwxrwx--T 3 akerman akerman .... dir

Cambio de identidad: su

Tenemos dos formas de hacerlo.

Con su

Nos sirve para ejecutar una shell cambiando el uid y el guid del usuario que lo ejecuta.

su otro_usuario
password: xxxxxxx

Ahora si hacemos id vemos que estamos logeados en la nueva shell con este usuario.

Para salir de esa shell hacemos exit

Si queremos que cuando cambiemos de user en la shell, automaticamente nos lleve a la carpeta raiz perteneciente a ese user, usamos -

si - otro_usuario

Si queremos ejecutar un comando como otro user pero sin que entre en otras shell hacemos

su -c 'chmod o+r akerman' USER

Nos pode la contrasenia de USER y se ejecuta, con esto no tenemos la necesidad de hacer exit para salir de la nueva shell.

Si intentasemos hacer su root nos pedira la password, pero salvo en ciertas distros, este password esta bloquedo.

Lo que podemos hacer para ejecutar un comando como root es usar sudo

SUDO

Nos sirve para asumir los privilegios del usuario root, pero sin conocer la contrasenia de este.

Al usar sudo no se nos abrira una terminal interactiva como pasaba con su ni tenemos que saber la contrasenia del root:

sudo cat /etc/shadow
[sudo] password for akerman:

Como vemos arriba, nos pide nuestra propia constrasenia.

Esta habilida que tiene nuestra cuenta principal de elevar los privilegios con sudo se encuentra alamacenada en el fichero sudoers.

Para tener la consola interactiva en nombre de root hacemos :

sudo -i

Como modificar sudoers

Se ubica en /etc/sudoers

En este archivo, ni siquiera root tiene permisos de modificacion, solo puede leerlo.

Si tuvieramos que modificar este directorio usamos sudo visudo se nos abrira nano y podremos editarlo.

De todas maneras no deberiamos editar este fichero, sino que podemos agregar usuarios a los grupos que necesitemos, como el grupo sudo.

Si quisieramos extender los persmisos de /etc/sudoers tenemos que ir a
sudo visudo /etc/sudoers.d/config.

testuser ALL=(ALL:ALL) /user/bin/cat

Lo que decimos es que testuser con el comando cat pueda suplantar a cualquier usuario.

Si ahora hecemos :

su testuser

ponemos la pass 

sudo cat /etc/shadow

Ahora podemos ejecutar el cat como si fueramos root sobre un fichero q antes no teniamos permisos.

Si intentamos lo mismo con sudo ls veremos que no se nos permite.

Lo normal no es agregar nuevo usuarios a sudoers sino que lo normal es crear nuevos grupos y luego agregar a los usuarios a esos grupos, ya que es mas facil gestionarlos asi.

Cuando en un fichero vemos % significa que es un grupo, por ejemplo %admin eso significa que admin es un grupo.

Si quisieramos agregar a un usuario al grupo sudo lo hariamos asi :

sudo usermod -aG sudo testuser

Gestion de usuarios y grupos: useradd , groupadd, usermod, deluser…

adduser

adduser no estara disponible en todas las distros linux, ya que es una interfaz de el comando original useradd

sudo adduser newuser

Si usamos useradd no se nos generara la carpeta de trabajo para ese user.

addgroup

Al igual que con adduser tenemos el comando de bajo nivel que es groupadd, pero tenemos disponible la interfaz addgroup.

sudo addgroup newgroup

Si queremos ver todos los grupos hacemos groups

Si queremos agregar a un usuario a un grupo hacemos sudo usermod -aG newgroup newuser

-a indica que concatene este grupo a los que ya tiene el usuario. Si quitasemos el -a podria pasar que se le quiten todos los grupos que ya tiene cierto usuario y quede solo con el ultimo que agregemos.

Podemos ver los grupos de un user asi :

groups newuser

o con id newuser.

uid=1000(akerman) gid=1000(akerman) groups=1000(akerman),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),118(lpadmin)

Recordemos que el gid es el grupo primario, es el que se especifica cuando creamos un nuevo fichero o directorio.

Si queremos cambiar el grupo primario de un user:

sudo usermod -g newgroup newuser

Con -g en minuscula

Cambiando nombre de usuario

sudo usermod -l newuseredit newuser

Cambiando el directorio home

sudo usermod -d /home/kakerman newuser2

Podemos ver estos cambios en cat /etc/passwd

Cambiando el uid

sudo usermod -u 250 newuseredit

Bloquedo usuario

sudo usermod -L newuseredit

1.-L es de Lock 2. -U es de Unlock

Cambiando password de usuario

sudo passwd newuser

Borrando usuarios y grupos

Como comando de alto nivel delgroup

sudo delgroup newgroup

Para borrar hacemos sudo deluser newuser

A pesar de haber eliminado este usuario , su directorio de trabajo sigue existiedno /home/newuser

Para hacer todo de una vez:

sudo deluser --remove-home newuser

Si quisieramos ademas, elimiar todos los ficheros y directorios creados por este user, podemos hacer :

sudp deluser --remove-all-files newuser

chown

Sirve para cambiar el grupo y el propietario de un fichero.

sudo chown newuser prueba.txt

Cambio el usuario propietatio.

sudo chown :newgroup prueba.txt

Ahora hemos cambiado el grupo sobre prueba.txt

Para cambiar las dos cosas a la vez:

sudo chown akerman:akerman prueba.txt

Si queremos que cambie el owner y que tome como grupo al grupo principal de ese user, lo hacemos asi:

sudo chown akerman: prueba.txt

chgrp

Sirve para cambiar el grupo de un fichero, este comando es mas antiguo, aun sigue funcionando, pero por lo general usamos chown.