1. Permisos y derechos en Linux
Cuántos de nosotros hemos tenido la necesidad de “limitar el acceso” a los archivos contenidos en
determinado directorio/carpeta o simplemente necesitamos evitar que algunas personas vean,
eliminen o modifiquen el contenido de determinado archivo? Más de uno, verdad? Podremos
lograrlo en nuestro amado pingüino? La respuesta es: por supuesto que sí:D.
Introducción
Muchos de los que provenimos de Windows, estábamos acostumbrados a lidiar con esta
“problemática” de una manera muy diferente, para conseguir este objetivo teníamos que recurrir
a “técnicas” poco ortodoxas, como, ocultar el fichero por medio de sus atributos, mover nuestra
información al lugar más recóndito de nuestro equipo (dentro de 20,000 carpetas) para tratar de
disuadir a nuestro “enemigo” XD, cambiando o eliminando la extensión del archivo, o la más
“común” de las practicas, descargar un programa que nos permita “cerrar” nuestro directorio
detrás de un lindo cuadro de dialogo que nos pida una contraseña para acceder al mismo.
Teníamos otra alternativa mucho mejor? No.
Lo siento mucho por mis amigos “Windoleros” (lo digo con mucho cariño para que nadie se
ofenda, ok? ;)), pero hoy me toca ensañarme un poquito con Windows :P, ya que explicare el
porqué este SO no permite de manera nativa esta funcionalidad.
Cuántos de ustedes habrán notado que cuando nos sentamos detrás de un equipo “Windows”
(aunque no sea el nuestro) nos convertimos automáticamente en dueños de todo aquello que
contiene el ordenador (imágenes, documentos, programas, etc.)? A que me refiero? Bueno, a que
simplemente al tomar el “control de Windows”, podemos copiar, mover, eliminar, crear, abrir o
modificar carpetas y archivos a diestra y siniestra, independientemente si nosotros somos los
“dueños” de esta información o no. Esto refleja un gran fallo en la seguridad del sistema
operativo, verdad? Bueno, todo esto se debe a que los sistemas operativos de Microsoft no fueron
diseñados desde el inicio para ser multiusuario. Cuando se lanzaron las versiones de MS-DOS y
algunas versiones de Windows, confiaban plenamente en que el usuario final sería el responsable
de “custodiar” su respectivo equipo para que ningún otro usuario tuviera acceso a la información
almacenada en el mismo… vaya ingenuidad ¬¬. Ahora amigos WinUsers, ya saben el porquéha
este “misterio” :D.
A contrapartida, GNU/Linux, al ser un sistema diseñado fundamentalmente para trabajo en red, la
seguridad de la información que almacenemos en nuestros equipos (y no se diga en los servidores)
es fundamental, ya que muchos usuarios tendrán o podrán tener acceso a parte de los recursos de
software (tanto aplicaciones como información) y hardware que están gestionados en estos
ordenadores.
Ahora podemos ver porque la necesidad de un sistema de permisos? Adentrémonos en el tema ;).
2. En GNU/Linux, los permisos o derechos que los usuarios pueden tener sobre determinados
archivos contenidos en él se establecen en tres niveles claramente diferenciados. Estos tres
niveles son los siguientes:
<° Permisos del propietario.
<° Permisos del grupo.
<° Permisos del resto de usuarios (o también llamados “los otros”).
Para tener claros estos conceptos, en los sistemas en red (como lo es el pingüino) siempre existe la
figura del administrador, superusuario o root. Este administrador es el encargado de crear y dar de
baja a usuarios, así como también, de establecer los privilegios que cada uno de ellos tendrá en el
sistema. Estos privilegios se establecen tanto para el directorio HOME de cada usuario como para
los directorios y archivos a los que el administrador decida que el usuario pueda acceder.
Permisos del propietario
El propietario es aquel usuario que genera o crea un archivo/carpeta dentro de su directorio de
trabajo (HOME), o en algún otro directorio sobre el que tenga derechos. Cada usuario tiene la
potestad de crear, por defecto, los archivos que quiera dentro de su directorio de trabajo. En
principio, él y solamente él será el que tenga acceso a la información contenida en los archivos y
directorios que hay en su directorio HOME.
Permisos del grupo
Lo más normal es que cada usuario pertenezca a un grupo de trabajo. De esta forma, cuando se
gestiona un grupo, se gestionan todos los usuarios que pertenecen a éste. Es decir, es más fácil
integrar varios usuarios en un grupo al que se le conceden determinados privilegios en el sistema,
que asignar los privilegios de forma independiente a cada usuario.
Permisos del resto de usuarios
Por último, también los privilegios de los archivos contenidos en cualquier directorio, pueden
tenerlos otros usuarios que no pertenezcan al grupo de trabajo en el que está integrado el archivo
en cuestión. Es decir, a los usuarios que no pertenecen al grupo de trabajo en el que está el
archivo, pero que pertenecen a otros grupos de trabajo, se les denomina resto de usuarios del
sistema.
Muy lindo, pero como puedo identificar todo esto? Sencillo, abre una terminal y realiza lo
siguiente:
$ ls -l
Nota: son letras “L” minúsculas ;)
Nos aparecerá algo como lo siguiente:
3. Como podrán observar, este comando despliega o “lista” el contenido de mi HOME, lo que nos
ocupa son las líneas de color rojo y verde. El recuadro de color rojo, nos muestra quien es
propietario y el recuadro de color verde indica a qué grupo pertenece cada uno de los archivos y
carpetas anteriormente listadas. En este caso tanto el propietario y el grupo se llaman “perseo”,
pero bien pudieron haberse encontrado con un grupo distinto como pudiera ser “ventas”. Por lo
demás, no se preocupen por ahora, lo veremos más adelante :D.
Tipos de permisos en GNU/Linux
Antes de aprender cómo se establecen los permisos en GNU/Linux, debemos saber cómo se
pueden diferenciar los diferentes tipos de archivos que el sistema puede tener.
Cada archivo en GNU/Linux queda identificado por 10 caracteres mismos a los que se les
denomina máscara. De estos 10 caracteres, el primero (de izquierda a derecha) hace referencia al
tipo de archivo. Los 9 siguientes, de izquierda a derecha y en bloques de 3, hacen referencia a los
permisos que se le conceden, respectivamente, al propietario, al grupo y al resto u otros. Una
captura para demostrar todo este rollo:
4. El primer carácter de los archivos puede ser el siguiente:
Permiso
Identifica
-
Archivo
d
Directorio
b
Archivo de bloques especiales (Archivos especiales de dispositivo)
c
Archivo de caracteres especiales (Dispositivo tty, impresora…)
l
Archivo de vinculo o enlace (soft/symbolic link)
p
Archivo especial de cauce (pipe o tubería)
Los siguientes nueve caracteres son los permisos que se les concede a los usuarios del sistema.
Cada tres caracteres, se referencian los permisos de propietario, grupo y resto de usuarios.
Los caracteres que definen estos permisos son los siguientes:
Permiso
Identifica
-
Sin permiso
r
Permiso de lectura
w
Permiso de escritura
x
Permiso de ejecución
Permisos para archivos
5. <° Lectura: permite, fundamentalmente, visualizar el contenido del archivo.
<° Escritura: permite modificar el contenido del archivo.
<° Ejecución: permite ejecutar el archivo como si de un programa ejecutable se tratase.
Permisos para directorios
<° Lectura: Permite saber qué archivos y directorios contiene el directorio que tiene este permiso.
<° Escritura: permite crear archivos en el directorio, bien sean archivos ordinarios o nuevos
directorios. Se pueden borrar directorios, copiar archivos en el directorio, mover, cambiar el
nombre, etc.
<° Ejecución: permite situarse sobre el directorio para poder examinar su contenido, copiar
archivos de o hacia él. Si además se dispone de los permisos de escritura y lectura, se podrán
realizar todas las operaciones posibles sobre archivos y directorios.
Nota: Si no se dispone del permiso de ejecución, no podremos acceder a dicho directorio (aunque
utilicemos el comando “cd”), ya que esta acción será denegada. También permite delimitar el uso
de un directorio como parte de una ruta (como cuando pasamos la ruta de un archivo que se
encuentra en dicho directorio como referencia. Supongamos que queremos copiar el archivo
“X.ogg” el cual se encuentra en la carpeta “/home/perseo/Z” -para lo cual la carpeta “Z” no tiene
permiso de ejecución-, haríamos lo siguiente:
$ cp /home/perseo/Z/X.ogg /home/perseo/Y/
obteniendo con esto un mensaje de error diciéndonos que no tenemos los permisos suficientes
para acceder al archivo :D). Si el permiso de ejecución de un directorio está desactivado, se podrá
ver su contenido (si se cuenta con permiso de lectura), pero no se podrá acceder a ninguno de los
objetos contenidos en él, pues para ello este directorio es parte del camino necesario para
resolver la ubicación de sus objetos.
Gestión de permisos en GNU/Linux
Hasta ahora, hemos visto para que nos sirven los permisos en GNU/Linux, a continuación veremos
cómo asignar o restar permisos o derechos.
Antes de comenzar, debemos de tener en cuenta que cuando damos de alta o creamos un usuario
en el sistema, le concedemos de forma automática unos privilegios. Estos privilegios, por
supuesto, no serán totales, es decir, los usuarios no dispondrán, normalmente, de los mismos
permisos y derechos del superusuario. Cuando el usuario se crea, el sistema genera por defecto
los privilegios del usuario para manejo de archivos y para manejo de directorios. Evidentemente,
éstos pueden ser modificados por el administrador, pero el sistema genera unos privilegios más o
menos válidos para la mayoría de las operaciones que cada usuario realizará sobre su directorio,
sus archivos y sobre los directorios y archivos del resto de usuarios. Por lo general, son los
siguientes permisos:
6. <° Para archivos: - rw- r-- r-<° Para directorios: - rwxrwxrwx
Nota: no son los mismos permisos para todas las distribuciones de GNU/Linux.
Estos privilegios nos permiten crear, copiar y borrar archivos, crear nuevos directorios, etc.
Veamos en la práctica todo esto :D:
Tomemos como ejemplo el archivo “CSS Avanzado.pdf”. Observemos que aparece de la siguiente
manera: -rw-r--r-- … CSS Avanzado.pdf. Miremos más a fondo.
Tipo
Usuario
Grupo
Resto de usuarios (otros)
Nombre del archivo
-
rw-
r--
r--
CSS Avanzado.pdf
Esto significa que:
<° Tipo: Archivo
<° El usuario puede: Leer (visualizar el contenido) y escribir (modificar) el archivo.
<° El grupo al que pertenece el usuario puede: Leer (únicamente) el archivo.
<° Otros usuarios pueden: Leer (únicamente) el archivo.
Para aquellos curiosos que se están preguntando en estos momentos a que se refieren los otros
campos del listado obtenido por ls -l, aquí la respuesta:
7. Si desean saber más acerca de los hard y soft/symbolic links, aquí la explicación y susdiferencias.
Bueno amigos, llegamos a la parte más interesante y pesada del tema en cuestión…
Asignación de permisos
El comando chmod (“changemode”) permite modificar la máscara para que se puedan realizar
más o menos operaciones sobre archivos o directorios, dicho de otra forma, con chmod puedes
quitar o eliminar derechos a cada tipo de usuarios. Si no se especifica el tipo de usuario al que
queremos quitar, poner o asignar privilegios, lo que sucederá al realizar la operación es afectar a
todos los usuarios simultáneamente.
Lo básico que hay que recordar es que le demos dar o quitar permisos en estos niveles:
Parámetro
Nivel
Descripción
u
dueño
dueño del archivo o directorio
g
grupo
grupo al que pertenece el archivo
o
otros
todos los demás usuarios que no son el dueño ni del grupo
Tipos de permiso:
Permiso
Identifica
8. r
Permiso de lectura
w
Permiso de escritura
x
Permiso de ejecución
Dar permiso de ejecución al dueño:
$ chmodu+x komodo.sh
Quitar permiso de ejecución a todos los usuarios:
$ chmod -x komodo.sh
Dar permiso de lectura y escritura a los demás usuarios:
$ chmodo+r+w komodo.sh
Dejar solo permiso de lectura al grupo al que pertenece el archivo:
$ chmodg+r-w-x komodo.sh
Permisos en formato numérico octal
Hay otra forma de utilizar el comando chmod que, para muchos usuarios, resulta “más cómoda”,
aunque a priori sea algo más compleja de entender ¬¬.
La combinación de valores de cada grupo de los usuarios forma un número octal, el bit “x” es 20 es
decir 1, el bit w es 21 es decir 2, el bit r es 22 es decir 4, tenemos entonces:
<° r = 4
<° w = 2
<° x = 1
La combinación de bits encendidos o apagados en cada grupo da ocho posibles combinaciones de
valores, es decir la suma de los bits encendidos:
Permiso
Valor Octal
Descripción
---
0
no se tiene ningún permiso
9. --x
1
solo permiso de ejecución
-w-
2
solo permiso de escritura
-wx
3
permisos de escritura y ejecución
r--
4
solo permiso de lectura
r-x
5
permisos de lectura y ejecución
rw-
6
permisos de lectura y escritura
rwx
7
todos los permisos establecidos, lectura, escritura y ejecución
Cuando se combinan los permisos del usuario, grupo y otros, se obtienen un número de tres cifras
que conforman los permisos del archivo o del directorio. Ejemplos:
Permiso
Valor
Descripción
rw- --- -–
600
El propietario tiene permisos de lectura y escritura
rwx --x --x
711
El propietario lectura, escritura y ejecución, el grupo y otros solo ejecución
rwx r-x r-x
755
El propietario lectura, escritura y ejecución, el grupo y otros pueden leer y ejecutar
el archivo
rwxrwxrwx
777
El archivo puede ser leído, escrito y ejecutado por quien sea
r-- --- -–
400
Solo el propietario puede leer el archivo, pero ni el mismo puede modificarlo o
ejecutarlo y por supuesto ni el grupo ni otros pueden hacer nada en el
10. rw- r-- ---
640
El usuario propietario puede leer y escribir, el grupo puede leer el archivo y otros
no pueden hacer nada
Permisos especiales
Aún hay otro tipo de permisos que hay que considerar. Se trata del bit de permisos SUID (Set User
ID), el bit de permisos SGID (Set Group ID) y el bit de permisos de persistencia (sticky bit).
setuid
El bit setuid es asignable a ficheros ejecutables, y permite que cuando un usuario ejecute dicho
fichero, el proceso adquiera los permisos del propietario del fichero ejecutado. El ejemplo más
claro de fichero ejecutable y con el bit setuid es:
$ su
Podemos ver que el bit está asignado como “s” en la siguiente captura:
Para asignar este bit a un fichero seria:
$ chmodu+s /bin/su
11. Y para quitarlo:
$ chmod u-s /bin/su
Nota: Debemos utilizar este bit con extremo cuidado ya que puede provocar una escalada de
privilegios en nuestro sistema ¬¬.
setgid
El bit setid permite adquirir los privilegios del grupo asignado al fichero, también es asignable a
directorios. Esto será muy útil cuando varios usuarios de un mismo grupo necesiten trabajar con
recursos dentro de un mismo directorio.
Para asignar este bit hacemos lo siguiente:
$ chmodg+s /carpeta_compartida
Y para quitarlo:
$ chmod g-s /carpeta_compartida
sticky
Este bit suele asignarse en directorios a los que todos los usuarios tienen acceso, y permite evitar
que un usuario pueda borrar ficheros/directorios de otro usuario dentro de ese directorio, ya que
todos tienen permiso de escritura.
Podemos ver que el bit está asignado como “t” en la siguiente captura:
12. Para asignar este bit hacemos lo siguiente:
$ chmodo+t /tmp
Y para quitarlo:
$ chmod o-t /tmp
Bueno amigos, ahora ya saben cómo proteger de mejor manera su información, con esto espero
que dejen de buscar alternativas para Folder Lock o Folder Guard que en GNU/Linux no los
necesitamos para nada XD.