FreeBSD, cuya raíz histórica es el UNIX® BSD, se fundamenta en varios conceptos clave de UNIX. El primero y más importante es que FreeBSD es un sistema operativo multi-usuario. El sistema puede gestionar múltiples usuarios trabajando simultáneamente y en tareas que no guarden relación entre sí. El sistema se encarga de compartir y administrar peticiones de dispositivos de hardware, periféricos, memoria y tiempo de CPU de manera equitativa para cada usuario.
Debido a que el sistema es capaz de soportar múltiples usuarios, todo lo que el sistema administra tiene un conjunto de permisos que usa para decidir quién puede leer, escribir y ejecutar un recurso. Estos permisos se guardan como octetos divididos en tres partes: una para el propietario del fichero, otra para el grupo al que el fichero pertenece, y otra para todos los demás grupos y usuarios. Veamos una representación numérica de esto:
Valor | Permiso | Listado de directorio |
---|---|---|
0 | No leer, no escribir, no ejecutar | --- |
1 | No leer, no escribir, ejecutar | --x |
2 | No leer, escribir, no ejecutar | -w- |
3 | No leer, escribir, ejecutar | -wx |
4 | Leer, no escribir, no ejecutar | r-- |
5 | Leer, no escribir, ejecutar | r-x |
6 | Leer, escribir, no ejecutar | rw- |
7 | Leer, escribir, ejecutar | rwx |
Puede utilizar el parámetro de línea de órdenes -l
de ls(1) para ver un
listado largo que incluya una columna con información acerca de los permisos de fichero
para el propietario, grupo y los demás. Por ejemplo, un ls -l en
un directorio puede mostrar algo como esto:
% ls -l total 530 -rw-r--r-- 1 root wheel 512 Sep 5 12:31 mifichero -rw-r--r-- 1 root wheel 512 Sep 5 12:31 otrofichero -rw-r--r-- 1 root wheel 7680 Sep 5 12:31 email.txt ...
Aquí está como se divide la primera columna de ls -l:
-rw-r--r--
El primer caracter (más a la izquierda) indica si este fichero es un fichero regular, un directorio, un dispositivo especial de caracter, un socket o cualquier otro dispositivo especial pseudo-ficheroa . En este caso, el - un fichero regular. Los siguientes tres caracteres, rw- en este ejemplo, dan los permisos para el propietario del fichero. Los siguientes tres caracteres, r--, dan los permisos para el grupo al que el fichero pertenece. Los últimos tres caracteres, r--, dan los permisos para el resto del mundo. Un guión indica que el permiso está desactivado. En el caso de este fichero, los permisos están asignados de tal manera que el propietario puede leer y escribir en el fichero, el grupo puede leer el fichero, y el resto del mundo sólo puede leer el fichero. De acuerdo con la tabla de arriba, los permisos para este fichero serían 644, donde cada dígito representa las tres partes de los permisos del fichero.
Todo ésto está muy bien, pero ?cómo controla el sistema los permisos de los dispositivos? FreeBSD en realidad trata la mayoría de los dispositivos hardware como un fichero que los programas pueden abrir, leer y en los que pueden escribir datos como si de cualquier otro fichero se tratara. Estos ficheros especiales de dispositivo se encuentran en el directorio /dev.
Los directorios también son tratados como ficheros. Tienen permisos de lectura, escritura y ejecución. El bit de ejecución en un directorio tiene un significado ligeramente distinto que para los ficheros. Cuando un directorio está marcado como ejecutable significa que se puede mirar dentro, se puede hacer un «cd» (cambiar directorio) a él. Esto también significa que dentro del directorio es posible acceder a ficheros cuyos nombres son conocidos (sujeto, claro está, a los permisos de los ficheros mismos).
En particular, para poder realizar un listado de directorio, el permiso de lectura debe ser activado en el directorio, mientras que para borrar un fichero del que se conoce el nombre es necesario tener permisos de escritura y ejecución en el directorio que contiene el fichero.
Existen más permisos, pero se usan principalmente en circunstancias especiales como los binarios ejecutables de tipo setuid y los los directorios de tipo «sticky». Si desea más información acerca de los permisos de ficheros y cómo establecerlos, consulte chmod(1).
Los permisos simbólicos, también conocidos como expresiones simbólicas, utilizan caracteres en lugar de valores octales para asignar permisos a ficheros o directorios. Las expresiones simbólicas utilizan la sintaxis de (quién) (acción) (permisos) mediante los siguientes valores:
Opción | Letra | Representa |
---|---|---|
(quién) | u | Usuario |
(quién) | g | Grupo propietario |
(quién) | o | Otro |
(quién) | a | Todos («todo el mundo») |
(acción) | + | Añadir permisos |
(acción) | - | Quitar permisos |
(acción) | = | Activar permisos explícitamente |
(permisos) | r | Lectura |
(permisos) | w | Escritura |
(permisos) | x | Ejecución |
(permisos) | t | Bit Sticky («pegajoso») |
(permisos) | s | Activar UID o GID |
Estos valores se aplican con chmod(1) de la misma manera que los anteriores, pero con letras. Por ejemplo, podría usar la siguiente orden para bloquear a otros usuarios el acceso a FICHERO:
% chmod go= FICHERO
Puede usarse una lista separada por comas cuando se quiera aplicar más de un conjunto de cambios a un fichero. Por ejemplo la siguiente orden eliminará los permisos de escritura de grupo y «mundo» a FICHERO, y añade permisos de ejecución para todos:
% chmod go-w,a+x FILE
Además de los permisos de fichero previamente expuestos, FreeBSD permite el uso de «banderas de fichero». Estas banderas añaden un nivel de seguridad y control adicional a los ficheros, pero no a los directorios.
Las banderas de fichero añaden un nivel adicional de control sobre los ficheros ayudando a asegurar que en algunos casos ni siquiera root pueda eliminar o alterar ficheros.
Las banderas de fichero se modifican mediante chflags(1), gracias a una interfaz muy sencilla. Por ejemplo, para habilitar la bandera imborrable de sistema en fichero1, escriba lo siguiente:
# chflags sunlink fichero1
Y para dehabilitar la bandera imborrable de sistema, simplemente escriba la orden
previa con «no» antes de sunlink
. Observe:
# chflags nosunlink fichero1
Para ver las banderas de este fichero, utilice ls(1) con las opciones
-lo
:
# ls -lo fichero1
La salida debería ser como esta:
-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 fichero1
Varias banderas solo pueden ser añadidas o retiradas de ficheros por el usuario root. En otros casos, el propietario del fichero puede activar estas banderas. Se recomienda que para más información la persona encargada de la administración del sistema consulte las páginas de manual chflags(1) y chflags(2).
Además de los permisos que se han explicado hay más, hay tres tipos más que todos los administradores deberían conocer. Son los permisos setuid, setgid y sticky.
Estos permisos juegan un papel clave en ciertas operaciones UNIX puesto que facilitan funcionalidades que no se suelen permitir a los usuarios normales. Para comprenderlas totalmente hay que comprender la diferencia entre el ID real del usuario y el ID efectivo.
El ID del usuario real es el UID que arranca (y el propietario) del proceso. El UID efectivo es el ID bajo el que se ejecuta el proceso. Veamos un ejemplo; el programa passwd(1) se ejecuta con el ID real del usuario puesto que el usuario está cambiando su contraseña. Pero para poder manipular la base de datos de contraseñas debe ejecutarse con el ID efectivo del usuario root. De este modo es posible que los usuarios cambien su contraseña sin llegar a ver un error de “Permission Denied” (permiso denegado).
Nota: La opción nosuid de mount(8) hace que estos binarios den errores silenciosos, es decir, fallarán pero el usuario no recibirá ningún mensaje de error por ello. Esta opción no funciona siempre, pues, según la página man de mount(8), un «wrapper» nosuid puede sortear esta limitación.
El permiso setuid puede asignarse colocando un número cuatro (4) antes de los permisos. Se ve mejor con un ejemplo:
# chmod 4755 ejemplosuid.sh
Los permisos de ejemplosuid.sh deberían ser así:
-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 ejemplosuid.sh
Fíjese atentamente en la s que ha aparecido en los permisos del fichero, en la parte de los permisos del propietario; esa s está en donde estaría el bit de ejecución. Gracias a esto el funcionamiento de aplicaciones que necesitan permisos elevados, como passwd, pueden funcionar.
Si quiere ver un ejemplo con sus propios ojos abra dos terminales. En una arranque un proceso (ejecute) passwd con un usuario normal. Mientras la aplicación espera a que le de una nueva contraseña busque la información de usuario del proceso passwd en la tabla de procesos.
En la terminal A:
Changing local password for trhodes Old Password:
En la terminal B:
# ps aux | grep passwd
trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 grep passwd root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd
Tal y como se ha dicho, un usuario normal puede ejecutar passwd, pero en realidad está utilizando el UID efectivo de root.
El permiso setgid actúa del mismo modo que el setuid, pero afecta a los permisos del grupo. Cuando una aplicación funciona con esta configuración lo hace con los permisos del grupo al que pertenece el fichero, no los del usuario que ha arrancado el proceso.
Si quiere utilizar el permiso setgid debe situar un núnmero dos (2) al principio de los permisos que vaya a asignar mediante chmod.
# chmod 2755 ejemplosuid.sh
La nueva configuración tiene un aspecto muy similar a la que tenía antes, pero observe que la s de antes está ahora en el campo de los permisos de grupo:
-rwxr-sr-x 1 trhodes trhodes 44 Aug 31 01:49 ejemplosuid.sh
Nota: En ambos ejemplos, incluso si el «script» en cuestión es ejecutable, no se va a ejecutar con un EUID distinto o un ID efectivo de usuario porque los «scripts» de shell no pueden acceder a la llama del sistema setuid(2).
Los dos permisos que acabamos de mostrar los bits de permisos (setuid y setgid) pueden reducir el nivel de seguridad haciendo que se escalen los permisos. Pero hay un tercer bit especial de permisos que puede ser de mucha ayuda para reforzar la seguridad del sistema: el sticky bit.
El sticky bit( que podríamos traducir como «bit pegajoso») aplicado a un directorio hace que solamente el propietario de un fichero pueda borrarlo. Esto evita el borrado de ficheros ajenos en directorios públicos como /tmp. Si quiere usarlo coloque un uno (1) antes de los permisos. Veamos un ejemplo:
# chmod 1777 /tmp
Para ver el ;sticky bit en acción usamos ls:
# ls -al / | grep tmp
drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
El sticky bit es la letra t al final de los permisos.
Puede descargar éste y muchos otros documentos desde ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
Si tiene dudas sobre FreeBSD consulte la documentación antes de escribir a la lista
<questions@FreeBSD.org>.
Envíe sus preguntas sobre la documentación a <doc@FreeBSD.org>.