Ver Mensaje Individual
Gestión simple de permisos (I)
  #1  
Antiguo 30-dic-2007, 09:22
Avatar de karlggest
karlggest karlggest está desconectado
Moderador
 
Fecha de Ingreso: 07-febrero-2007
Ubicación: Ourense
Versión: Leap 42.3
Mensajes: 8.175
Agradecimientos: 40
Agradecido 1.238 Veces en 910 Mensajes
Poder de Credibilidad: 19
karlggest está en el buen camino
Gestión simple de permisos (I)

El objetivo del presente documento es cubrir un poco la gestión de permisos de acceso en un sistema GNU/Linux(1) en modo texto (en konsole), excediendo el hacerlo en modo gráfico el ámbito del mismo. Simple significa que trataremos los aspectos más generales. El sistema de permisos de Unix es en origen simple, pero potente.

Los usuarios requieren al menos el conocimiento somero del trabajo en modo texto (con shell bash), comandos como df, mount, fdisk, etc., archivos de configuración, variables de entorno, la creación y montaje de particiones y el archivo /etc/fstab.

Como siempre, se agradecen comentarios, críticas o valoraciones. En particular, agradecer a Ivan de Leon su tiempo, crítica y sus consejos.

Por la extensión del tema a tratar, en lo sucesivo iré editando este post para añadir las cuestiones pertinentes, incorporando ya los comentarios que se realicen.


El documento consta de dos partes: "Gestión simple de permisos (I)" y "Gestión simple de permisos (y II)"

0. Axiomática

1. Cuanto más se restrinja qué usuarios pueden hacer qué menos probabilidades habrá de que alguien rompa algo.
2. Ni siquiera los administradores experimentados están a salvo de meter la pata y cargarse el sistema. Los que no somos administradores experimentados, por tanto, tenemos más peligro que una excursión de ESO en un polvorín.
3. Cualquier comando mal usado es peligroso. Cualquier comando mal usado por el administrador(2) es muy peligroso. Las opciones "recursivo" y "forzar sin preguntar" son tan cómodas como peligrosas.
4. Antes de usar un comando, léase la mayor cantidad de información sobre el mismo posible. Y trátese siempre de ejecutarlo como usuario no adminstrador.
5. El análisis de las necesidades de seguridad de un sistema dado excede con mucho el ámbito de este documento. Así, en el mismo sólo podrá encontrarse una descripción somera de las herramientas y posibilidades de la gestión de permisos.


1. Los permisos de usuario


En un sistema GNU/Linux existen tres tipos de permisos(3): lectura, escritura y ejecución, simbolizados respectivamente con las letras r (Read), w (Write) y x (eXecution).

En un archivo de texto, el significado de los mismos es obvio: si se activa el permiso r se podrá leer el contenido del mismo, si se activa w se podrá modificar y si se activa x se podrá ejecutar (siempre que sea un script o un ejecutable binario(4)).
Código:
mkdir prueba
karl@KARL-PC:~> cd prueba
karl@KARL-PC:~/prueba> touch archivo.txt
karl@KARL-PC:~/prueba> ls -l
total 0
-rw-r--r-- 1 karl users 0 dic 30 08:35 archivo.txt
karl@KARL-PC:~/prueba>
En este caso, podemos ver las propiedades de archivo.txt en las diez primeras letras de la salida de ls -l. La primera letra (en este caso, un guión) indica qué tipo de archivo es: un archivo regular, un directorio, un enlace a archivo, un dispositivo de bloques, etc. Las siguientes 9 letras son los permisos de dicho archivo, agrupados en tres grupos: las primeras tres para el usuario (User), las siguientes tres para el grupo al que pertenece el usuario (Group) y las siguientes tres para cualquier otro usuario del sistema (Other). En ese contexto, All (a) hace referencia a "todos los usuarios". Podemos ver que archivo.txt tiene permisos de lectura y modificación para el usuario, de lectura para el grupo y de lectura también para los demás. Probemos a modificar el archivo:
Código:
 echo "modificar archivo" >> archivo.txt
karl@KARL-PC:~/prueba> cat archivo.txt
modificar archivo
karl@KARL-PC:~/prueba>
Esto es lo esperable. Modificamos el archivo así que el contenido del mismo se actualiza como nosotros queríamos.

Lo dicho para los archivos rige también para los directorios:
Código:
karl@KARL-PC:~> ls -l
drwxr-xr-x 2 karl users    24 dic 30 08:35 prueba
Ahora las cuestiones cambian ligeramente. El permiso de lectura sigue significando lo mismo, pero los demás no. Ahora Escritura es la capacidad de modificar el directorio (incluyendo eliminarlo, modificarlo y por supuesto, añadirle archivos dentro de él), mientras que Ejecución es la capacidad de acceder al mismo.

Para modificar estas propiedades, se usa el comando chmod (cambiar modo). Véase
Código:
man chmod
para aprender algo sobre él. En general la sintaxis será
Cita:
chmod permisos archivo(s)
Los permisos pueden fijarse en modo octal o bien añadirse y quitarse sobre los existentes. Por ejemplo, crearemos otro archivo (archivo2.txt) y le asignaremos propiedades de escritura para cualquier usuario:
Código:
karl@KARL-PC:~/prueba> touch archivo2.txt
karl@KARL-PC:~/prueba> chmod a+w archivo2.txt
karl@KARL-PC:~/prueba> ls -l
total 4
-rw-rw-rw- 1 karl users  0 dic 30 08:48 archivo2.txt
-rw-r--r-- 1 karl users 18 dic 30 08:39 archivo.txt
karl@KARL-PC:~/prueba>
Nótese que en cada grupito de tres letras está activada la letra w. Ahora cualquier usuario del sistema podrá modificar (e incluso eliminar) archivo2.txt.

Código:
su
Contraseña:
KARL-PC:/home/karl/prueba # useradd patoso
KARL-PC:/home/karl/prueba # passwd patoso
Changing password for patoso.
Nueva contraseña:
Vuelva a introducir la nueva contraseña:
Contraseña cambiada.
KARL-PC:/home/karl/prueba # exit
exit
karl@KARL-PC:~/prueba> su patoso
Contraseña:
patoso@KARL-PC:/home/karl/prueba> echo "modifica otra vez archivo.txt" >> archivo.txt
bash: archivo.txt: Permiso denegado
patoso@KARL-PC:/home/karl/prueba> echo "modifica archivo2.txt" >> archivo2.txt
patoso@KARL-PC:/home/karl/prueba> cat archivo2.txt
modifica archivo2.txt
patoso@KARL-PC:/home/karl/prueba> exit
exit
Vemos aquí que al registrarnos como el usuario "patoso", si intentamos modificar el contenido de archivo.txt el sistema no nos lo permite (sólo el usuario propietario puede hacerlo), mientras que si modificamos archivo2.txt funciona sin problemas.
Código:
karl@KARL-PC:~/prueba> su patoso
Contraseña:
patoso@KARL-PC:/home/karl/prueba> exit
exit
karl@KARL-PC:~/prueba> chmod a-w archivo2.txt
karl@KARL-PC:~/prueba> su patoso
Contraseña:
patoso@KARL-PC:/home/karl/prueba> ls -l
total 8
-r--r--r-- 1 karl users 22 dic 30 08:51 archivo2.txt
-rw-r--r-- 1 karl users 18 dic 30 08:39 archivo.txt
patoso@KARL-PC:/home/karl/prueba> rm archivo2.txt
rm: ¿borrar el fichero regular «archivo2.txt»  protegido contra escritura? (s/n) s
rm: no se puede borrar «archivo2.txt»: Permiso denegado
patoso@KARL-PC:/home/karl/prueba>
Aquí podemos ver que si se elimina la propiedad de escritura para todos los usuarios el archivo deja de ser eliminable. patoso no puede borrarlo, ¿y karl?
Código:
patoso@KARL-PC:/home/karl/prueba> exit
exit
karl@KARL-PC:~/prueba> rm archivo2.txt
rm: ¿borrar el fichero regular «archivo2.txt»  protegido contra escritura? (s/n) s
karl@KARL-PC:~/prueba> ls -l
total 4
-rw-r--r-- 1 karl users 18 dic 30 08:39 archivo.txt
karl@KARL-PC:~/prueba>
Veamos ahora la cuestión de escritura en directorios.
Código:
karl@KARL-PC:~/prueba> su patoso
Contraseña:
patoso@KARL-PC:/home/karl/prueba> cd ..
patoso@KARL-PC:/home/karl> rm -rf prueba
rm: no se puede borrar «prueba/archivo.txt»: Permiso denegado
patoso@KARL-PC:/home/karl> exit
exit
karl@KARL-PC:~/prueba> cd ..
karl@KARL-PC:~> chmod a+w prueba
karl@KARL-PC:~> su patoso
Contraseña:
patoso@KARL-PC:/home/karl> rm -rf prueba
rm: no se puede borrar el directorio «prueba»: Permiso denegado
patoso@KARL-PC:/home/karl>
Código:
patoso@KARL-PC:/home/karl> rm -rf prueba
rm: no se puede borrar el directorio «prueba»: Permiso denegado
patoso@KARL-PC:/home/karl> ls -l
drwxrwxrwx 2 karl users     6 dic 30 08:58 prueba
patoso@KARL-PC:/home/karl> ls prueba
patoso@KARL-PC:/home/karl>
Vemos que si bien prueba no puede ser eliminado por patoso, el contenido del mismo sí ha sido borrado. ¿Por qué no se puede eliminar prueba? Muy simple, prueba es un directorio que está dentro del directorio de usuario karl. Éste tiene las propiedades adecuadas para karl, lo que incluye no poder ser modificable por otros usuarios. Para poder eliminar prueba, habría que activar el permiso de escritura en /home/karl para el grupo 'users' o para todos los usuarios.

Ha de advertirse que en este ejemplo, patoso es un usuario del mismo grupo que karl (users). Esto no tiene porqué ser así.

Bien, si quitamos el permiso de lectura a un directorio, el mismo podrá ser listado, pero no así su contenido. Pero esto no quiere decir que no pueda accederse al mismo, sólo que no puede leerse su contenido
Código:
karl@KARL-PC:~> ls prueba/
karl@KARL-PC:~> chmod a-r prueba
karl@KARL-PC:~> touch prueba/archivo.txt
karl@KARL-PC:~> echo "modificar archivo.txt" >> prueba/archivo.txt
karl@KARL-PC:~> cat prueba/archivo.txt
modificar archivo.txt
karl@KARL-PC:~> ls prueba
ls: no se puede abrir el directorio prueba: Permiso denegado
karl@KARL-PC:~> cd prueba
karl@KARL-PC:~/prueba> ls
ls: no se puede abrir el directorio .: Permiso denegado
karl@KARL-PC:~/prueba> touch hola.mundo
karl@KARL-PC:~/prueba> ls
ls: no se puede abrir el directorio .: Permiso denegado
karl@KARL-PC:~/prueba>  chmod a+r ../prueba
karl@KARL-PC:~/prueba> ls
archivo.txt  hola.mundo
karl@KARL-PC:~/prueba>
¿Sorprendidos? Recuérdese que sólo el directorio prueba tiene suspendido el permiso de lectura, no el de modificación.

Finalmente, consideremos el permiso de acceso a directorio (la propiedad de ejecución):
Código:
karl@KARL-PC:~> chmod a-x prueba/
karl@KARL-PC:~> ls prueba
ls: no se puede acceder a prueba/archivo.txt: Permiso denegado
ls: no se puede acceder a prueba/hola.mundo: Permiso denegado
archivo.txt  hola.mundo
karl@KARL-PC:~> cat prueba/archivo.txt
cat: prueba/archivo.txt: Permiso denegado
karl@KARL-PC:~>
Bien, esto es una explicación (espero) sencilla del funcionamiento básico de estas propiedades. En lo sucesivo, abordaremos el uso de máscaras (umask), el montaje de particiones en modo "sólo lectura" y otras cuestiones de interés.

2. Máscaras
La máscara define los permisos que se asignan a archivos y directorios de nueva creación. Para ello se hace uso del comando 'umask' (man umask).
Código:
karl@KARL-PC:~> umask
0022
karl@KARL-PC:~> umask -S
u=rwx,g=rx,o=rx
karl@KARL-PC:~>
umask muestra la máscara asignada actualmente. Si se provee un número octal, se modifica la máscara para ese número octal. La opción -S muestra los permisos en la misma forma que chmod (rwx).

Los valores octales de la máscara (lo mismo rige para el uso de chmod) son los siguientes: 1 para lectura, 2 para escritura, 3 lectura + escritura, 4 para ejecución, 5 para ejecución+lectura, 6 ejecución+escritura y 7 para ejecución+lectura+escritura. Básicamente, al crear los permisos de un archivo, se le resta a 777 (lectura+escritura+ejecución para todos) el valor de la máscara. Así, en 022 le restamos 0 a la propiedad para usuario (7-0=7), 2 para el grupo (7-2=5 ->ejecución + lectura) y 2 también para Otros (7-2=5).

En los archivos, por defecto se omitirá la propiedad "ejecución", pero en los directorios no, ya que es la que permite el acceso a los mismos.
Código:
karl@KARL-PC:~/prueba> umask 023
karl@KARL-PC:~/prueba> umask -S
u=rwx,g=rx,o=r
karl@KARL-PC:~/prueba> mkdir otrodir
karl@KARL-PC:~/prueba> ls -l
total 4
-rw-r--r-- 1 karl users 22 dic 30 09:07 archivo.txt
-rw-rw-rw- 1 karl users  0 dic 30 17:25 hola2.txt
---------- 1 karl users  0 dic 30 17:26 hola3.txt
-rw-rw-rw- 1 karl users  0 dic 30 17:28 hola4.txt
-rw-r--r-- 1 karl users  0 dic 30 09:09 hola.mundo
-rw-r--r-- 1 karl users  0 dic 30 17:24 hola.txt
-rw------- 1 karl users  0 dic 30 17:32 novo.txt
drwxr-xr-- 2 karl users  6 dic 30 17:38 otrodir
karl@KARL-PC:~/prueba>
En un sistema robusto, puede que debamos analizar la conveniencia de que la máscara por defecto excluya a usuarios distintos del grupo del usuario, por ejemplo. Así, debe considerarse la conveniencia de que un usuario tenga una máscara tal como 027 (sin permisos de modificación para el grupo y sin permisos de lectura, modificación ni ejecución para los demás.


-------------------------------------------------
Registro:
1ª edición: 9:20 h. del 30/12/2007
2ª edición: 17:14 h. del 30/12/2007
* matiz en permiso de escritura para un directorio.
* sección 0. Axiomática
* sección 2. Máscaras
3ª edición: 16:18 h. del 02/01/2008
* sección 3.1
* sección 3.2
4º edición: 00:04 h. del 04/01/2008
*1ª Revisión íntegra
------------------------------------------------
(1) Lo que es lo mismo que decir que, con pocas modificaciones, cualquier "Unix-like".
(2) El usuario llamado root (en inglés, claro!! XD). Usaré el término en castellano porque creo que es mejor usarlo en castellano, y por el camino evitaremos ambigüedades con la raíz del sistema / (root).
(3)No confundir propiedades o permisos con atributos (man attr).
(4) En lugar de la extensión, como en los sistemas DOS y compatibles (incluido Windows), en los sistemas Unix e "Unix-like" lo que define el tipo de archivo es su contenido. Un ejecutable sólo será ejecutado si tiene la propiedad de ejecución válida para el usuario en cuestión y si contiene código de shell-script o binario. (Ver man file)
__________________
http://sementedotempo.blogspot.com/

-Si lo creen unos pocos, es un delirio; si son muchos los creyentes, es una religión

Última edición por karlggest; 09-ene-2008 a las 01:13
Responder Citando
Los Siguientes 2 Usuarios Han Dado las Gracias a karlggest Por Este Mensaje:
RaulEstela (21-may-2012), yogava9 (08-abr-2012)