Control de accesos a las entidades de un sistemas GNU/Linux & Unix

    El UNIX estándar utiliza un mecanismo de control de accesos discrecional (DAC). Por ello cada usuario tiene la posibilidad de otorgar y denegar de modo voluntario parte o la totalidad de los derechos de acceso sobre los objetos (ficheros de datos, directorios, programas, etc) de los que es propietario. Para ello tradicionalmente se utiliza un mecanismo basado en una serie de bits asociados a cada objeto del sistema.

Control de accesos tradicional o estandard.

    El mecanismo de seguridad clásico de UNIX para el control de accesos se basa en la definición de tres clases de usuarios. Cada una incluye un usuario o grupo de usuarios del sistema a los que les puede conferir una serie de derechos de acceso sobre los objetos. Las tres clases se corresponden con los siguientes usuarios:

u: usuario propietario de la cuenta
g: resto de usuarios de su grupo
o: resto de usuarios de otros grupos

    Los permisos de acceso de cada grupo de usuarios se implementan utilizando los denominados bits de modo o bits de permiso. Todo objeto accesible en UNIX tiene asociados 9 bits indicando que derechos de acceso tienen los distintos usuarios sobre el mismo. Cuando listamos el contenido de un directorio cualquiera con la orden ls -l, obtenemos la siguiente información:

-rw-r----- 1 pedro inf 6 9 Sep 16:54 datos
drwxr-x--x 2 pedro inf 24 9 Sep 16:55 dire
-rw-r----- 1 pedro inf 7908 9 Sep 16:55 passwd.man

El significado de los distintos campos en el fichero datos es el siguiente:

-

Tipo del fichero; en este caso un fichero regular

-rw-r-----

Bits de modo asociados al fichero

1

Número de enlaces al fichero

pedro

Nombre del propietario del fichero

inf

Grupo del fichero

6

Tamaño del fichero en bytes

9 Sep 16:54

Fecha y hora de última modificación

datos

Nombre del fichero


Estos bits se distribuyen en 3 grupos de 3 bits y definen los permisos de acceso al objeto para las tres clases de usuarios diferenciados (u, g y o).

rwx

r-x

---

|

|

|

propietario

grupo

otros


    En cada grupo de bits, cada bit representa la presencia o ausencia de uno de los tres tipos o derechos de acceso al objeto:

r: permiso de lectura
w: permiso de escritura
x: permiso de ejecución

    El que el bit esté representado por la letra correspondiente significa que en ese objeto el permiso está concedido para el grupo correspondiente. Si el bit está representado con un guión (-), el permiso está denegado.

Ejemplo

-rwxr-x--- 1 pedro inf 7 9 Sep 17:02 datos

    El fichero datos es un fichero regular en el que su propietario, pedro, puede leer, escribir y ejecutarlo (rwx). Los usuarios de su mismo grupo (inf) pueden leerlo y ejecutarlo, pero no pueden escribir sobre él (r-x). Finalmente, el resto de usuarios del sistema (salvo el superusuario) no pueden leerlo, escribir sobre el ni ejecutarlo (---).

    Vamos a detallar algo más el significado de los bits de modo para ficheros, y diferenciarlo del que tienen para los directorios.

Permisos en el caso de ficheros

  • El permiso de lectura (r) significa que se puede abrir el fichero con la llamada open() en modo de lectura y leer su contenido con read().
  • El permiso de escritura (w) significa que se puede sobreescribir el contenido del fichero, modificándolo o añadiendo información.
  • El permiso de ejecución (x) tan solo tiene sentido con ficheros ejecutables o guiones del shell. Los ficheros se ejecutarán como una orden al shell o mediante alguna de las llamadas del tipo exec().

Permisos en el caso de directorios

  • El permiso de lectura (r) significa que se puede listar el contenido del directorio con la orden ls, o usar las llamadas opendir() y readdir() sobre el mismo.
  • El permiso de escritura (w) significa que se pueden añadir, renombrar o borrar entradas en el directorio.
  • El permiso de ejecución (x) en el caso de directorios se denomina permiso de búsqueda. Se usa para permitir listar toda la información sobre los ficheros que contiene, entrar al directorio con cd o abrir los ficheros que contiene (si se tiene permiso de lectura sobre los mismos).

La orden chmod

    La orden chmod permite al propietario de un fichero modificar sus permisos de acceso. Esta orden puede usarse en dos modos: simbólico o numérico.

Modo simbólico

    En modo simbólico es posible otorgar o denegar cualquier permiso individual sobre los ficheros y directorios. Su formato general es el siguiente:

chmod opción clase acción permiso lista-de-ficheros

Ejemplo

chmod go-w datos texto

En este caso ejecutamos la orden sin opciones y cada parte significa lo siguiente

go

Son las clases sobre las que se aplica la orden, es decir, los grupos de usuarios cuyos bits van a modificarse. En este caso se modifican los bits del grupo (g) y de otros (o).

-

Indica la acción a realizar. En este caso denegar un permiso

w

Indica el permiso a conceder o denegar

datos texto

Son los ficheros cuyos permisos se modifican


    En resumen, la orden anterior elimina el permiso de escritura sobre los ficheros datos y texto para todos los usuarios salvo su propietario.

    A continuación resumimos los posibles valores que puede tomar cada uno de los componentes del formato "Modo simbólico":

chmod    opción        clase    acción    permiso    lista-de-ficheros
chmod     [OPCIONES]        [ugoa]       [+-=]          [rwxstXugo]  ficheros

Detallemos algo más el significado de cada valor:

Valores de clase

u: modifica los permisos del usuario (del propietario).
g: modifica los permisos del grupo.
o: modifica los permisos de otros.
a: modifica los permisos de todos los usuarios.

Como hemos visto en el ejemplo anterior, puede indicarse más de un valor de clase a la vez.

Valores de acción

+: Añade (otorga) el permiso o permisos indicados.
-: Elimina (deniega) el permiso o permisos indicados.
=: Reemplaza el valor actual por los indicados

Valores de permiso

r: permiso de lectura
w: permiso de escritura
x: permiso de ejecución

s t X u g o: permisos especiales, alguno de los cuales explicaremos más adelante.

Opciones

Consultar la página de manual en cada sistema,

Ejemplos

% chmod a-x fichero

Elimina el permiso de ejecución para todos los usuarios

% chmod ug=rw fichero

Hace que el propietario y su grupo tengan permiso de lectura y escritura sobre el fichero. Al no asignarse explícitamente, no tendremos permiso de ejecución.

% chmod go+r fichero

Añade permiso de lectura del fichero a los usuarios no propietarios del mismo

    Las posibilidades de chmod aumentan porque podemos especificar varios conjuntos de clase+acción+permisos separados por comas en una misma orden.

Ejemplo

% chmod ug+r, o= ficheros

    Añade permiso de lectura al propietario y a su grupo, y anula todos los permisos al resto de usuarios.

Modo numérico.

    La orden chmod puede también utilizarse en modo numérico o absoluto, donde los permisos se representan mediante un número octal. Su formato general es el siguiente:

chmod opciones modo ficheros

    El modo es un número en octal que representa una combinación concreta de los valores de los bits de permiso (rwxrwxrwx). Consta de 4 dígitos, aunque normalmente el más significativo vale 0 y suele omitirse. Este dígito permite definir alguno de los permisos especiales antes citados y será tratado más adelante.

    Los tres dígitos restantes se corresponden con los permisos de cada grupo de usuarios (u g o), es decir, con cada grupo de 3 bits.

rwx

r-x

r--

|

|

|

dígito 1

dígito 2

digito 3


    La relación entre cada trío de bits (rwx) y cada dígito octal [0..7] se establece de la siguiente forma. Si el permiso está activo, el bit correspondiente del número octal vale 1, mientras que si el permiso está inactivo (-) el bit vale 0.

rwx

r-x

r--

|

|

|

111

101

100


    Una vez tenemos los 3 números en forma binaria podemos usar su valor en octal

rwx

r-x

1--

|

|

|

7

5

4


    Así pues, el número octal 754 representa los permiso rwxr-xr--.

    Una vez conocemos la relación entre la representación mediante caracteres y la numérica, podemos ver algún ejemplo de su uso

Ejemplos

% chmod 644 datos
% ls -l datos
-rw-r--r-- 1 pedro inf 7 9 Sep 17:02 datos
% chmod 750 datos
% ls -l datos
-rwxr-x--- 1 pedro inf 7 9 Sep 17:02 datos


    Usando el modo numérico la orden chmod no permite manejar permisos individuales, sino que les asigna un valor a todos a la vez, independientemente de su valor anterior

La orden umask

    En UNIX los ficheros son creados con unos permisos por defecto que vienen dados por el proceso que los crea. La orden umask permite modificar estos permisos por defecto.

    La orden umask se usa manejando una mascara de 4 dígitos en octal que se combina con los permisos de creación por defecto, para dar lugar a los permisos reales con los que se crean los ficheros. Si no se le pasa ningún argumento, devuelve el valor actual de esta mascara:

% umask
026

    Podemos ver que, dado que el bit más significativo es 0, este se ha obviado en la salida.

    La mascara actúa del siguiente modo. Para obtener los permisos con los que se creará un fichero se realiza el AND bit a bit del modo de creación por defecto con el complemento a uno de la mascara. Veámoslo con un ejemplo.

    Supongamos que los ficheros se crean por defecto con los permisos 0666 y que la mascara vale 0026:

octal

binario

0666

000

110

110

110

modo de creación por defecto

0026

000

000

010

110

mascara

(0026)

111

111

101

001

complemento a uno de la mascara

0640

000

110

100

000



    Otra forma de explicar su funcionamiento es diciendo que los bits del modo de creación se pasan sobre los de la máscara (sin complementar), cuando encuentran un 1 se conmuta su valor y cuando encuentran un 0 se mantiene.

Para fijar un valor dado a la mascara se le pasa este como argumento a la orden umask

% umask 022
% umask
022


Normalmente en el fichero .login, .profile o /etc/profile aparece una línea donde se fija el valor de la mascara.

Permisos especiales. Programas SUID y SGID

    Aunque los permisos de acceso más usuales son rwx, tal y como vimos al describir la orden chmod, existen toda una serie de permisos adicionales. En este apartado describiremos el permiso "s" debido a sus profundas implicaciones en relación con la seguridad del sistema.

    En ocasiones usuarios o procesos sin privilegios especiales necesitan llevar a cabo tareas que requieren permisos de los que no disponen normalmente. Ya vimos anteriormente el caso de la orden passwd. En estos casos UNIX proporciona un medio de conceder temporalmente una serie de privilegios mediante el uso de programas denominados SUID y SGID.

    Un programa SUID (setuid) es aquel que asume un UID efectivo distinto al UID real mientras se ejecuta. En concreto el UID efectivo pasa a ser el del propietario del fichero en lugar del UID del usuario que lo ejecuta. Así, el usuario que lo llama adquiere los privilegios del propietario mientras dura la ejecución del programa.

    Un programa SGID (setgid) es aquel que cambia su GID al del fichero cuando es ejecutado. De la misma forma que antes el usuario que lo ejecuta pasa a tener los privilegios del grupo del fichero.

    En UNIX se indica que un programa es SUID o SGID utilizando el permiso especial "s" en la posición de los permisos de ejecución del usuario y de su grupo respectivamente. Veámoslo con unos ejemplos

% ll /usr/bin
-r-sr-xr-x 1 root bin 65536 12 Jun 1995 /usr/bin/login

    El programa login, utilizado para conectarse a la máquina, es un ejemplo de programa SUID. En este caso el usuario que lo ejecuta adquiere el UID efectivo del root.

% ll /bin/mail
-r-sr-sr-x 2 root mail 36864 12 Jun 1995 /bin/mail

    Al ejecutar la orden /bin/mail el usuario pasa a tener como UID efectivo el del root y como GID efectivo el grupo mail.

La orden chmod y el permiso "s"

    En modo simbólico es muy sencillo convertir un fichero del que se es propietario en SUID o SGID.

% chmod u+s datos
% ll datos
-rwsr-x--- 1 pedro inf 7 9 Sep 17:02 datos
% chmod g+s datos
% ll datos
-rwsr-s--- 1 pedro inf 7 9 Sep 17:02 datos


    En modo numérico el permiso "s" se logra utilizando el cuarto dígito octal, el más significativo. Sus tres bits en binario tienen el siguiente significado:

    Así, la orden: % chmod 4700 datos convierte el fichero en SUID mientras la orden: % chmod 6750 datos lo convierte en SGID y SUID.

    No tiene porque ocurrir que el fichero sea ejecutable al mismo tiempo que SUID o SGID. En ese caso el permiso correspondiente aparece como S (mayúscula)

% chmod 6744 datos
% ll datos
-rwsr-Sr-- 1 pedro inf 10 10 Sep 10:53 datos

Problemas de seguridad con SUID

    Baste un ejemplo para entender el problema que puede suponer un programa SUID. Si un usuario consigue una copia del shell propiedad del root que sea SUID, al ejecutarla adquirirá todos los privilegios del superusuario y podrá ejecutar cualquier orden y acceder a todo el sistema sin restricciones.

    Imaginemos un caso simple. El superusuario ha dejado una consola abierta y desatendida momentáneamente. El usuario pirata aprovecha para hacer lo siguiente:

% cp /bin/sh /tmp/supersh
% chmod 4755 /tmp/supersh


    Una vez en su cuenta, el usuario pirata puede ejecutar la copia del shell /tmp/supersh y adquirir los privilegios del superusuario. Normalmente, para evitar este tipo de ataques en los sistemas UNIX actuales los distintos shells no son propiedad del root.

    El programa SUID a ejecutar como root no tiene porque ser una copia del shell. Teniendo una copia SUID root por ejemplo del editor vi, también podemos ejecutar ordenes del shell en el modo de última línea. Este tipo de programas se denominan shell escape, porque admiten secuencias de escape de la orden para ejecutar comandos del shell sin salir de las mismas.