lunes, 19 de mayo de 2008

Sistema de ficheros en Linux

Asran [asran@isppr.rimed.cu]

El sistema de ficheros de Linux posee una estructura arbórea cuya raíz es única y se representa por / que además constituye el caracter separador en el camino (path) de un recurso determinado. Los elementos del sistema de ficheros de Linux se clasifican en:

Ficheros
Directorios
Enlaces simbólicos
Dispositivos de caracteres y de bloques
Tuberías (pipes)
Sockets

Un fichero no se representa en memoria de forma continua sino a través de varios bloques de una longitud determinada. Por esto cada fichero tiene asociada una estructura o mapa que almacena, entre otras características, las direcciones físicas de los bloques que lo constituyen denominada i-nodo. Un i-nodo se almacena en un área fija, pequeña y continua y se identifica a través de un número entero. Su estructura está formada por los campos:

El tipo del fichero y sus permisos
La cantidad de enlaces fuertes al fichero
El identificador del usuario dueño del fichero
El identificador del grupo del fichero
La cantidad de bytes del fichero
Las direcciones de memoria de los bloques físicos del fichero
El tiempo del último acceso al fichero (lectura o ejecución)
El tiempo de la última modificación del fichero (escritura)
El tiempo de la última modificación del i-nodo

Para nombrar los ficheros es posible emplear una cantidad no mayor de 256 caracteres que pueden ser de cualquier tipo con excepción de /, por ser el separador de caminos (path). Los ficheros “ocultos” en Linux son aquellos cuyo nombre comienza con el caracter “.” (punto) .

En todos los directorios existen dos ficheros ocultos especiales nombrados “.” y “..”, el primero se refiere al directorio actual y el segundo, al directorio padre. No son mas que punteros.

Cada uno de los elementos del sistema de ficheros de Linux posee permisos de acceso de acuerdo a tres tipos de usuarios: Su dueño (casi siempre el creador) representado por la letra u (user) Su grupo representado por la letra g (group) El resto de los usuarios que no son el dueño ni pertenecen al grupo. Se representa con o (other)
Nota: Para representar a todos los tipos de usuarios se utiliza la letra a (all)

Para cada uno de estos tres grupos de usuarios existen tres tipos de permisos fundamentales:

r: read (lectura). El usuario que tenga este permiso podrá si es un directorio, listar los recursos almacenados en él si tiene además permiso de ejecución para ese directorio, y si es cualquier otro tipo de fichero podrá leer su contenido.

w: write (escritura). Todo usuario que posea este permiso para un fichero podrá modificarlo siempre y cuando tenga permisos de ejecución para todos los directorios del path del fichero, si se posee para un directorio se podrán crear, borrar y modificar ficheros en él.

x: execute (ejecución). Este permiso para el caso de los ficheros permitirá ejecutarlos desde el command prompt y para los directorios, el usuario que lo posea podrá posicionarse en él (change dir).

Estos tres tipos de permisos poseen una representación numérica basada en el sistema octal que parte de representar como “1” los bits de los permisos otorgados y “0” para los negados. Luego se transforma la representación binaria así obtenida en octal. De esta forma se obtienen para cada tipo de permiso los siguientes valores:

-w- = 010 (2 en octal)
--x = 001 (1 en octal)

La combinación de los tres tipos de permisos para un tipo de usuario oscila desde cero (ningún permiso) hasta siete (todos los permisos).

Ejemplos:

rw- = 110 (6 en octal)
rwx = 111 (7 en octal)
r-x = 101 (5 en octal)

Los permisos “totales” de un recurso constan de nueve bits, donde los tres primeros indican los permisos asociados al dueño, los otros tres, al grupo y los últimos, al resto de los usuarios.
Ejemplos:

rwx r-x --- = 111 101 000 (750 en octal)
rw- r-- r-- = 110 100 100 (644 en octal)

Nota:Los permisos de un fichero están supeditados a los de los directorios que lo contengan, pues aunque un fichero posea permisos de escritura o lectura para todo el mundo este no podrá ser modificado o leído si todos los directorios que lo contienen no poseen el permiso de ejecución correspondiente. Por tanto la forma de proteger fácilmente todos los ficheros en un directorio es quitarle a este todos los permisos para el grupo y para el resto de los usuarios.
Sólo el dueño de un recurso siempre tendrá derecho a cambiar sus permisos, además de root, claro. El dueño de un directorio siempre tendrá derecho a borrar los ficheros contenidos en este aun si pertenecen a root.

Tipos mas complejos:

Existen otros tipos de permisos más complejos:

s y S: es un permiso que de no administrarse correctamente puede provocar problemas de seguridad. Para su representación a través de caracteres se utiliza el lugar del permiso de ejecución y de ahí la diferencia entre s y S: si es s (minúscula) significa que incluye además el permiso de ejecución a diferencia de S (mayúscula). Este permiso se puede asociar al dueño o al grupo del recurso. Si se asocia a un fichero significa que cuando este se ejecute por un usuario que tenga permisos para ello adquirirá los permisos de su dueño o grupo en dependencia de a cual de los dos está asociado el permiso. Un ejemplo de fichero con este permiso es el comando passwd, el cual adquiere los permisos de root al ser ejecutado por los usuarios (sin argumentos) para poder modificar el fichero /etc/shadow que es donde se guardan las contraseñas de los usuarios. Para el caso de un directorio este permiso sólo tiene validez para el grupo del mismo permitiendo a los ficheros y a los subdirectorios que se creen en él heredar el grupo, los subdirectorios heredarán también el permiso s. Un ejemplo de directorio con este permiso es aquel donde se guardan los documentos de un sitio FTP anónimo. Este permiso se conoce como setuid bit o setgid bit, para el usuario y el grupo, respectivamente.

t y T: está asociado fundamentalmente a directorios donde todos o un grupo de usuarios pueden escribir nuevos ficheros pero estos sólo podrán ser borrados por sus dueños o por root. Si es t (minúscula) significa que incluye además el permiso de ejecución a diferencia de T (mayúscula). Este permiso sólo se asocia al resto de los usuario y para su representación se emplea el bit correspondiente al permiso de ejecución. Ejemplo de un directorio con este permiso es /tmp donde todos los usuarios pueden escribir pero sólo los dueños pueden borrar sus ficheros, además de root. Este permiso se conoce también como sticky bit.

Para representar los permisos t y s en el sistema binario se utilizan tres bits adicionales: el primero para s en el dueño, el segundo para s en el grupo y el tercero para t. Estos se colocan al inicio de la cadena numérica de nueve bits vista anteriormente. En la cadena de caracteres se mezclan con el permiso de ejecución y de ahí la necesidad de emplear las mayúsculas y minúsculas.

Ejemplos:

rws rwS r-- = 110 111 110 100 (6764 en octal)
rwx rws -wT = 011 111 111 010 (3772 en octal)

Después de toda esta introducción teórica a los permisos en Linux veamos como estos se muestran, modifican y se les asigna un valor por defecto. Posiblemente el comando más empleado en Linux es aquel que muestra el contenido de un directorio, llamado ls. Este permite observar los permisos que tienen asociados los ficheros de ese directorio además de otras características empleando la opción -l (formato largo). Los permisos se muestran a través de una cadena de 10 caracteres donde: el primero indica el tipo de recurso que es: d (para directorios), l (para enlaces simbólicos, ver sección ), b (para dispositivos de bloque), c (para dispositivos de caracteres), s (para sockets), p (para pipes) y - (para ficheros regulares), los otros nueve caracteres representan propiamente a los permisos del recurso.
Como siempre les digo:

You will never walk alone
I’m here
Todos somos =’s



Artículos relacionados


No hay comentarios: