Se dice que GNU/Linux es un sistema muy seguro, que no hay virus y que es muy difícil de vulnerar, la realidad es que eso es mentira. Como cualquier sistema, GNU/Linux es un sistema que es tan seguro como las medidas que se tomen para administrarle y una de las medidas más importantes es la gestión del sistema de archivos.
Antes de empezar, ya sé que algunos leen esto cada semana (sólo mi mamá, tal vez) y que esperaban la publicación el día lunes y hoy es martes. – Gabriel! Eres un flojo y te retrasaste! – Pues no, la verdad es que quiero probar diferentes fechas para analizar cuando tienen más tiempo de leer estas publicaciones, dicho esto, comencemos.
Hola mundo! Hoy es martes y toca hablar de GNU Core Utilities.
La semana pasada hablamos de Coreutils tac: Output de archivos completos (parte 2) , un comando bastante inútil y parece que bastante impopular, así que esta semana quiero redimirme con ustedes y les hablaré de un tema extremadamente útil y quizás la médula espinal de la seguridad en GNU/Linux.
¿Qué son «archivos»?
Me podrían decir: «¿Por qué debe ser tan importante proteger mis archivos? digo mis documentos, fotografías y canciones son importantes, pero no creo que eso constituya la médula espinal de nada». Y yo les diría que tienen razón, pero en sistemas basados en Unix, TODO ES UN ARCHIVO, a veces esto no es muy claro asi que lo repetiré, EN UNIX Y SUS DERIVADOS TODO ES UN ARCHIVO.
«Eso no tiene ningún sentido, mis dispositivos no pueden ser archivos, ¿cómo mi mouse va ser un archivo?»
1 2 3 |
gabriel@gultij:~$ ls /dev/input/ by-id by-path mice mouse0 mouse1 |
En realidad, los dispositivos no son realmente archivos, sino representaciones de los mismos como archivos, de esta forma podemos acceder a un dispositivo y a sus propiedades de la misma forma en que lo haríamos con un archivo, ya sea la configuración de un servicio, los parámetros de ejecución de un comando o tus documentos, música y otros medios, ante los ojos del root# todos los archivos son iguales.
Cuando hablamos de permisos de archivos, podemos dividirlo en dos categorías: Permisos Básicos y Permisos Avanzados, hoy sólo hablaremos de los básicos y si no los aburro, la próxima semana revisaremos los «Avanzados».
Permisos Básicos
Grupos de permisos
Una de las propiedad que tienen los archivos en el sistema es que pertenecen a un usuario y a un grupo ( esto lo revisaremos a detalle en otro artículo) y la forma más sencilla de descubrir la anatomía básica de un archivo es con el comando «ls -l» (Tambén algún día revisaremos ls a detalle).
1 2 3 4 5 6 7 8 9 10 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ls -l total 16 D U G O Owner Group (Esta línea fue agregada para ilustrar) d rwx r-x r-x 2 gabriel gabriel 4096 Aug 8 11:49 directorio - rw- r-- r-- 1 gabriel gabriel 245 Jul 27 17:48 ejemplo-101.txt - rw- r-- r-- 1 gabriel gabriel 110 Jul 27 18:23 ejemplo-102.txt - rw- r-- r-- 1 gabriel gabriel 664 Jul 27 18:45 ejemplo-103.txt - rw- r-- r-- 1 gabriel gabriel 227 Jul 27 18:54 ejemplo-104.txt - rw- r-- r-- 1 gabriel gabriel 31 Aug 8 13:06 script |
Intencionalmente separé el output del comando, para que mostrará 4 columnas, en realidad no existe esa separación, todo aparece junto, pero será más fácil para mi explicarlo así.
D: Aquí se muestra la letra «d» si se trata de un directorio.
U: (User) Aquí aparecen los permisos del propietario del archivo.
G: (Group) Aquí aparecen los permisos del grupo del archivo.
O: (Others) Aquí aparecen los permisos de acceso para el resto de los usuarios del sistema.
También el comando nos muestra el nombre del propietario y el grupo del archivo.
Tipos de permisos
Siguiendo el output del comando anterior, podemos ver que en las columnas O,G y A hay tres espacios en los que se pueden leer las letras r, w y x según corresponda, estos son los tipos de permisos.
r – read: Afecta la capacidad del usuario para ver el contenido del archivo.
w – write: Afecta la capacidad del usuario para guardar o modificar el contenido del archivo o en caso de un directorio para crear nuevos archivos.
x – execute: Afecta la capacidad del usuario para ejecutar un archivo (un script por ejemplo) y en el caso de los directorios, se requiere el permiso de ejecución para poder ver el contenido del directorio.
This file is made available under the Creative Commons CC0 1.0 Universal Public Domain Dedication.
Entonces, lo que nos indica el output del comando es lo siguiente:
- El usuario gabriel tiene permisos de lectura y escritura (rw) en todos los archivos.
- El grupo gabriel tiene permiso de lectura (r) en todos los archivos.
- El resto (others) tienen permiso de lectura (r) en todos los archivos.
NOTA: Algunas distribuciones por default crean un usuario para cada grupo para mantener privado el contenido de cada usuario, otras simplemente utilizan el grupo users.
¿Entonces cómo cambiar los permisos?
Para esto vamos a usar el comando chmod, a diferencia de los otros comando que hemos visto, no vamos a revisar cada opción, recuerda que el tema es sobre permisos y no sobre chmod.
Este es el ejemplo más común, en el directorio files, hay un archivo llamado «script», vamos a revisar su contenido.
1 2 3 4 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ cat script #!/bin/bash echo "No soy un Hola Mundo más, estoy hackeando al mundo, soy super hacker por que veo Mr. Robot."; |
!Vaya! ¡ Es un script super letal !… ok no, pero vamos a ejecutarlo :)
1 2 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ./script bash: ./script: Permission denied |
Wait… what? Permission denied? Me hackearon! a mi nadie me niega el permiso a ver, revisemos nuevamente sus permisos.
1 2 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ls -l script -rw-r--r-- 1 gabriel gabriel 113 Aug 8 13:11 script |
Aja! ahí está el detalle, tengo permiso de lectura y escritura (rw) pero no de ejecución, ¿qué pasa si le agrego el permiso «x»?
1 2 3 4 5 6 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ chmod u+x script gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ls -l script -rwxr--r-- 1 gabriel gabriel 113 Aug 8 13:11 script gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ./script No soy un Hola Mundo más, estoy hackeando al mundo, soy super hacker por que veo Mr. Robot. |
A ver, a ver, a ver… por partes.
Explicando chmod
chmod u+x script
Esto significa al propietario ( u ) agrégale ( + ) permiso de ejecutar ( x ) el archivo script.
Es por eso que en el segundo comando: «ls -l script», podemos ver que los permisos del propietario dicen (rwx).
Y finalmente en el tercer comando, ejecutamos el script sin problemas.
Pero es un script demasiado poderoso para que caiga en las manos equivocadas, vamos a impedir que alguien más lo vea.
1 2 3 4 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ chmod go-r script gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ls -l script -rwx------ 1 gabriel gabriel 113 Aug 8 13:11 script |
chmod go-r script
Esto significa: al grupo ( g ) y a otros ( o ) remueves ( – ) el permiso de leer ( r ) el archivo script.
Y podemos ver que antes tenían permiso de lectura y ahora ya no.
Un ejemplo más, digamos que están trabajando con el archivo «ejemplo-104.txt» y quieren que todos en el sistema puedan leer y escribir el archivo, la mejor forma de hacer sería así:
1 2 3 4 5 6 7 8 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ls -l ejemplo-104.txt -rw-r--r-- 1 gabriel gabriel 227 Jul 27 18:54 ejemplo-104.txt gabriel@gultij:~/Documents/Gultij/Coreutils/files$ chmod ugo+rw ejemplo-104.txt gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ls -l ejemplo-104.txt -rw-rw-rw- 1 gabriel gabriel 227 Jul 27 18:54 ejemplo-104.txt |
chmod ugo+rw
Esto significa: al usuario ( u ), grupo ( g ) y otro ( o ) agrégale ( + ) permisos de lectura ( r ) y escritura ( w ) en el archivo ejemplo-104.txt
¿Siguen conmigo?
Creo que ya se van entendiendo la cosa, cuando se trate de aplicarle un permiso a todos, simplemente se puede escribir a en lugar de ugo, de forma que el comando «chmod a-w ejemplo-104.txt» removerá el permiso de escritura a todos, incluso al propietario.
De igual modo pueden asignar diferentes permisos a cada grupo, por ejemplo
1 2 3 4 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ls chmod u=rwx,g=rw,o=r ejemplo-103.txt gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ls -l ejemplo-103.txt -rwxrw-r-- 1 gabriel gabriel 664 Jul 27 18:45 ejemplo-103.txt |
En este último ejemplo ejecutamos lo siguiente.
Al usuario ( u ) asignarle ( = ) los siguientes permisos: lectura ( r ), escritura ( w ) y ejecución ( x ); Al grupo ( g ) asignar ( = ) los siguientes permisos: lectura ( r ) y escritura ( w ); A los demás ( o ) asignar los siguientes permisos: lectura ( r ).
Cuando se utiliza la opción de asignación ( = ) va a dejar únicamente los permisos que fueron declarados; De forma que si un archivo tenía permiso de ejecución y definimos «chmod a=rw archivo», va a asignar a todos, permisos rw y eliminar el de ejecución.
Referencias en formato octal
Otra forma de expresar los permisos de archivos, es utilizando un formato octal, quizás mucho más popular, funciona como una opción de asignación y utiliza una representación numérica para cada permiso:
r = 4; w = 2; x = 1
se definen 3 dígitos, cada dígito representa uno de los grupos Usuario, Grupo y Otros (Siempre en ese orden)
De forma que podemos escribir algo así:
1 2 3 4 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ls chmod 741 ejemplo-101.txt gabriel@gultij:~/Documents/Gultij/Coreutils/files$ ls -l ejemplo-101.txt -rwxr----x 1 gabriel gabriel 245 Jul 27 17:48 ejemplo-101.txt |
«chmod 741 ejemplo-01.txt» Significa: Asignarle al usuario permisos 7, Asignar al grupo permisos 4 y asignarle a otros permisos 1.
What? ¿cómo es que eso tiene más sentido?
Calma!, todo tendrá sentido.
Octal | Binario | Permisos |
---|---|---|
0 | 000 | — |
1 | 001 | –x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r– |
5 | 101 | r-x |
6 | 110 | rx- |
7 | 111 | rwx |
Entonces… decir «chmod 741 archivo» es equivalente a decir «chmod u=rwx,g=r,o=x archivo» , sólo que es mucho más cómodo, es por eso que es un método mucho más popular.
Multiusuario
Oye Gabriel, está muy padre todo esto para un sistema empresarial con cientos de usuarios y diferentes grupos, pero nada de esto es para mi, nadie más usa mi computadora, no hay más usuarios aparte de mi.
Bien, parece un argumento válido, pero en realidad, aunque no compartas tu sistema con ningún otro usuario, hay un decena de usuarios «de sistema»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
gabriel@gultij:~/Documents/Gultij/Coreutils/files$ls cut -d: -f1 /etc/passwd root daemon bin sys sync games man lp mail news uucp proxy www-data backup list irc gnats nobody systemd-timesync systemd-network systemd-resolve systemd-bus-proxy Debian-exim messagebus statd avahi-autoipd gabriel avahi colord dnsmasq festival speech-dispatcher pulse rtkit saned usbmux hplip sshd mysql uuidd nm-openvpn _apt gloria postgres lightdm sddm Debian-snmp |
Estos son todos los usuarios que existen en mi laptop y salvo por el usuario de mi esposa y el mío, todos los demás usuarios los utiliza el demonio muahahahaha (ok,no… referencia aquí) … Muchos servicios (o demonios) se ejecutan utilizando un usuario propio, de forma en caso de ser vulnerado de alguna forma, tiene acceso limitado sólo a ciertos archivos en los que tiene permisos.
El sistema de permisos de archivos, está ahí para dar una capa de seguridad a nuestros sistema, pero algunas personas sólo quieren ver el mundo arder:
CONCURSO
Bien, ya que la semana pasada no me creyeron que había premio, les voy a dar otra oportunidad de ganarse una playera oficial del Gultij Edición Primavera-Verano 2016 xD.
Las bases será muy sencillas, el que postee en los comentarios del grupo de facebook, el mejor meme de «chmod 777» seleccionado por David Jarillo, Ricardo Rosales, Octavio Alvarez, Hiram Kampokalas y yo, se llevará la playera del Gultij.
CONCLUSIÓN
Pues una vez más aquí termina el artículo de hoy, por favor dejenme saber qué estamos haciendo bien, qué estamos haciendo mal, si te interesa ayudarnos en las actividades, siempre buscamos gente que nos apoye.
En los próximos días vamos a anunciar la siguiente reunión que será el Sábado 27 de Agosto, en el Intercomunidades, los esperamos a todos.
Hasta la próxima semana.
excelente explicación… muy divertida!