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.
- Si es
d
es que es un directorio. - Si es una
l
es que es un enlace simbolico - Si fuera un fichero especial una
c
- Si no hay nada especial es
-
Tenemos tres tipos de usuarios en nuestros ficheros cada uno tiene permisos individuales sobre el fichero o directorio:
- El propietario
- El grupo
- 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
- r - read
- w - write
- 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

-
Lo primero es que la suma de cada grupo de permisos debe ser 7 en total como se ve en la imagen
-
Lo segundo es que cada letra tiene su valor, r=4, w=2, x=1
-
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:
- u para el usuario propietario
- g para el grupo
- o para todos los demas que no sean el caso 1 y 2
- 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
.