0% encontró este documento útil (0 votos)
64 vistas5 páginas

Linux Seguridad

El capítulo aborda la seguridad en Linux, destacando su naturaleza multiusuario y la importancia de los UID y GID para la gestión de permisos de acceso a archivos y procesos. Se explican conceptos fundamentales como el superusuario, los permisos de archivos y las llamadas al sistema relacionadas con la seguridad, incluyendo chmod y access. Además, se detalla cómo se implementa la seguridad en Linux a través del proceso de inicio de sesión y la verificación de permisos al acceder a archivos.

Cargado por

Jesús Petro
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
64 vistas5 páginas

Linux Seguridad

El capítulo aborda la seguridad en Linux, destacando su naturaleza multiusuario y la importancia de los UID y GID para la gestión de permisos de acceso a archivos y procesos. Se explican conceptos fundamentales como el superusuario, los permisos de archivos y las llamadas al sistema relacionadas con la seguridad, incluyendo chmod y access. Además, se detalla cómo se implementa la seguridad en Linux a través del proceso de inicio de sesión y la verificación de permisos al acceder a archivos.

Cargado por

Jesús Petro
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

CAPÍTULO 10.

7 LA SEGURIDAD EN LINUX 803

10.7 LA SEGURIDAD EN LINUX


Como clon de MINIX y UNIX, Linux ha sido un sistema multiusuario casi desde el principio. Es-
ta historia significa que la seguridad y el control de la información se integraron casi desde un prin-
cipio. En las siguientes secciones analizaremos algunos de los aspectos de seguridad de Linux.

10.7.1 Conceptos fundamentales

La comunidad de usuarios para un sistema Linux consiste en cierto número de usuarios registrados,
cada uno de los cuales tiene un UID (User ID, ID de usuario) único. Un UID es un entero entre 0
y 65,535. Los archivos (pero también los procesos y otros recursos) se marcan con el UID del pro-
pietario. De manera predeterminada, el propietario de un archivo es la persona que lo creó, aunque
hay una forma de cambiar la propiedad.
Los usuarios se pueden organizar en grupos, que también se enumeran con enteros de 16 bits cono-
cidos como GIDs (Group IDs, IDs de grupo). El proceso de asignar usuarios a los grupos se hace en for-
ma manual (por medio del administrador del sistema) y consiste en crear entradas en una base de datos
del sistema que indique el grupo al que pertenece cada usuario. Un usuario podría estar en uno o más gru-
pos al mismo tiempo. Por cuestión de simplicidad, no analizaremos esta característica con más detalle.
El mecanismo básico de seguridad en Linux es simple. Cada proceso lleva el UID y el GID de
su propietario. Cuando se crea un archivo, éste recibe el UID y GID del proceso que lo creó. El ar-
chivo también recibe un conjunto de permisos determinados por el proceso creador. Estos permisos
especifican el acceso que tienen el propietario, los demás miembros del grupo del propietario y el
resto de los usuarios para el archivo. Para cada una de estas tres categorías los accesos potenciales
son de lectura, escritura y ejecución, designados por las letras r, w y x, respectivamente. Desde lue-
go que la habilidad de ejecutar un archivo tiene sentido sólo si ese archivo es un programa binario
ejecutable. Si el usuario intenta ejecutar un archivo que tenga permiso de ejecución pero que no
sea ejecutable (es decir, que no empiece con un encabezado válido), se producirá un error. Como hay
tres categorías de usuarios y 3 bits por categoría, se requieren 9 bits para representar los permisos de
acceso. En la figura 10-37 se muestran algunos ejemplos de estos números de 9 bits y su significado.

Binario Simbólico Accesos permitidos para el archivo


111000000 rwx— — — El propietario puede leer, escribir y ejecutar
111111000 rwxrwx— - El propietario y el grupo pueden leer, escribir y ejecutar
110100000 rw-r— — - El propietario puede leer y escribir; el grupo puede leer
110100100 rw-r—r— El propietario puede leer y escribir; todos los demás pueden leer
111101101 rwxr-xr-x El propietario puede hacer todo, el resto puede leer y ejecutar
000000000 ————- Nadie tiene acceso
000000111 — — — rwx Sólo los usuarios externos tienen acceso (extraño, pero válido)

Figura 10-37. Algunos ejemplos de modos de protección de archivos.


804 CASO DE ESTUDIO 1: LINUX CAPÍTULO 10

Las primeras dos entradas en la figura 10-37 son claras, ya que permiten al propietario y al
grupo del propietario el acceso completo, respectivamente. La siguiente entrada permite al gru-
po del propietario leer el archivo pero no modificarlo, y evita que los usuarios externos tengan
acceso. La cuarta entrada es común para un archivo de datos que el propietario desea hacer pú-
blico. De manera similar, la quinta entrada es la común para un programa disponible al público.
La sexta entrada niega todo tipo de acceso a todos los usuarios. Algunas veces se emplea este mo-
do para los archivos de señuelo que se utilizan para la exclusión mutua, debido a que el intento
de crear dicho archivo fracasará si ya existe uno. Por lo tanto, si varios procesos intentan al mis-
mo tiempo crear dicho archivo como un bloqueo, sólo uno de ellos tendrá éxito. El último ejem-
plo es sin duda extraño, ya que proporciona al resto del mundo más acceso que al propietario.
Sin embargo, su existencia es un resultado de las reglas de protección. Por fortuna, hay una
manera de que el propietario cambie después el modo de protección, aunque no tenga acceso al
archivo en sí.
El usuario con UID 0 es especial y se le conoce como superusuario (o root). El superusuario
tiene el poder de leer y escribir todos los archivos en el sistema, sin importar quién sea el propieta-
rio y la forma en que estén protegidos. Los procesos con UID 0 también tienen la habilidad de
realizar un pequeño número de llamadas protegidas al sistema que se niegan a los usuarios ordina-
rios. Por lo general, sólo el administrador del sistema conoce la contraseña del superusuario, aun-
que muchos estudiantes universitarios consideran un gran deporte tratar de buscar fallas de
seguridad en el sistema, para que puedan iniciar sesión como superusuario sin conocer la contrase-
ña. La administración tiende a ver mal dicha actividad.
Los directorios son archivos y tienen los mismos modos de protección que los archivos ordi-
narios, excepto que los bits x se refieren al permiso de búsqueda en vez del permiso de ejecutar. Por
lo tanto, un directorio con el modo rwxr-xr-x permite a su propietario leer, modificar y realizar bús-
quedas en el directorio, pero sólo permite a los demás leer y buscar en él, pero no agregar ni elimi-
nar archivos.
Los archivos especiales que corresponden a los dispositivos de E/S tienen los mismos bits de
protección que los archivos regulares. Este mecanismo se puede utilizar para limitar el acceso a los
dispositivos de E/S. Por ejemplo, el archivo especial de la impresora /dev/lp podría ser propiedad
del usuario root, de un usuario especial o de un demonio, y tener el modo rw------ para evitar que
alguien más tenga acceso a la impresora. Después de todo, si cualquiera pudiera imprimir a volun-
tad, se produciría un caos.
Desde luego que si un demonio es propietario de /dev/lp con el modo de protección rw------,
significa que nadie más puede usar la impresora. Aunque esto salvaría a muchos árboles inocentes
de una muerte anticipada, algunas veces los usuarios tienen la necesidad legítima de imprimir algo.
De hecho, hay un problema más general en cuanto a permitir el acceso controlado a todos los dis-
positivos de E/S y otros recursos del sistema.
Este problema se resolvió al agregar un nuevo bit de protección, el bit SETUID a los 9 bits de
protección antes descritos. Cuando se ejecuta un programa con el bit SETUID activado, el UID
efectivo para ese proceso se convierte en el UID del propietario del archivo ejecutable, en vez del
UID del usuario que lo invocó. Cuando un proceso trata de abrir un archivo, se comprueba el UID
efectivo y no el UID real subyacente. Al hacer que el programa que utiliza la impresora sea propie-
dad de un demonio pero con el bit SETUID encendido, cualquier usuario podría utilizarlo y tener
CAPÍTULO 10.7 LA SEGURIDAD EN LINUX 805

el poder del demonio (por ejemplo, el acceso a /dev/lp), pero sólo para ejecutar ese programa (que
podría poner los trabajos de impresión en una cola para imprimir en forma ordenada).
Muchos programas sensibles de Linux son propiedad del usuario root pero tienen activado el
bit SETUID. Por ejemplo, el programa que permite a los usuarios modificar sus contraseñas (pass-
wd) necesita escribir en el archivo de contraseñas. No sería conveniente hacer que todo el mundo
pudiera escribir en el archivo de contraseñas. En vez de ello, hay un programa que es propiedad del
usuario root y tiene activado el bit SETUID. Aunque el programa tiene acceso completo al archivo
de contraseñas, sólo modificará la contraseña del que lo llama y no permitirá ningún otro tipo de
acceso al archivo de contraseñas.
Además del bit SETUID hay un bit SETGID que trabaja en forma similar, ya que otorga de ma-
nera temporal el GID efectivo del programa al usuario. Sin embargo, este bit se utiliza raras veces
en la práctica.

10.7.2 Llamadas al sistema de seguridad en Linux

Sólo hay un pequeño número de llamadas al sistema relacionadas con la seguridad. Las más impor-
tantes se listan en la figura 10-38. La llamada al sistema de seguridad que se utiliza con más fre-
cuencia es chmod. Se utiliza para cambiar el modo de protección. Por ejemplo,
s = chmod(“/usr/ast/nuevojuego”, 0755);
establece los permisos de nuevojuego a rwxr-xr-x, de manera que todos puedan ejecutarlo (observe que
0755 es una constante octal, lo cual es conveniente ya que los bits de protección vienen en grupos de
3 bits). Sólo el propietario de un archivo y el superusuario pueden modificar sus bits de protección.

Llamada al sistema Descripción


s = chmod(ruta, modo) Cambia el modo de protección de un archivo
s = access(ruta, modo) Comprueba el acceso usando el UID y GID reales
uid = getuid( ) Obtiene el UID real
uid = geteuid( ) Obtiene el UID efectivo
gid = getgid( ) Obtiene el GID real
gid = getegid( ) Obtiene el GID efectivo
s = chown(ruta, propietario, grupo) Cambia el propietario y el grupo
s = setuid(uid) Establece el UID
s = setgid(gid) Establece el GID

Figura 10-38. Algunas llamadas al sistema relacionadas con la seguridad. El código


de retorno s es 1 si ocurrió un error; uid y gid son el UID y GID, respectivamente.
Los parámetros se explican por sí solos.

La llamada a access prueba si se permite un acceso específico mediante el uso del UID y GID
verdaderos. Esta llamada al sistema se necesita para evitar las fugas de seguridad en los programas
que tienen activo el bit SETUID y son propiedad del usuario root. Dicho programa puede hacer
806 CASO DE ESTUDIO 1: LINUX CAPÍTULO 10

cualquier cosa, y algunas veces es necesario para el programa averiguar si se permite al usuario rea-
lizar cierto acceso. El programa no puede probarlo, ya que el acceso siempre tendrá éxito. Con la
llamada a access, el programa puede averiguar si se permite el acceso con el UID y GID reales.
Las siguientes cuatro llamadas al sistema devuelven los UID y GID efectivos. Las últimas tres
sólo se permiten al superusuario. Modifican el propietario de un archivo, y los valores de UID y
GID de un proceso.

10.7.3 Implementación de la seguridad en Linux

Cuando un usuario inicia sesión, el programa de inicio de sesión login (que es SETUID root) pide
un nombre de inicio de sesión y una contraseña. Aplica una función hash a la contraseña y después
busca en el archivo de contraseñas /etc/passwd para ver si el hash coincide con la contraseña en ese
archivo (los sistemas en red funcionan de manera un poco distinta). La razón de utilizar hashes es
para evitar que se almacene la contraseña en forma no cifrada en cualquier parte del sistema. Si la
contraseña es correcta, el programa de inicio de sesión busca en /etc/passwd para ver el nombre del
shell preferido del usuario, que posiblemente sea bash, pero también puede ser otro shell como csh
o ksh. Después, el programa de inicio de sesión utiliza setuid y setgid para darse a sí mismo el
UID y GID del usuario (recuerde que empezó como SETUID root). Luego abre el teclado para la
entrada estándar (descriptor de archivo 0), la pantalla para la salida estándar (descriptor de archivo
1) y la pantalla para el error estándar (descriptor de archivo 2). Por último, ejecuta el shell preferi-
do y termina.
En este punto, el shell preferido se está ejecutando con el UID y GID correctos, y la entrada,
salida y error estándar tienen sus valores predeterminados. Todos los procesos que se bifurquen (es
decir, los comandos que escriba el usuario) heredan de manera automática el UID y GID del shell,
por lo que también tendrán el propietario y grupo correctos. Todos los archivos que creen también
obtendrán estos valores.
Cuando cualquier proceso intenta abrir un archivo, el sistema primero comprueba los bits de
protección en el nodo-i del archivo y los compara con el UID y GID efectivos del que hizo la lla-
mada, para ver si se permite el acceso. De ser así, el archivo se abre y se devuelve un descriptor
de archivo. En caso contrario, el archivo no se abre y se devuelve 1. No se realizan comproba-
ciones en las siguientes llamadas a read o write. Como consecuencia, si el modo de protección
cambia una vez que se abre un archivo, el nuevo modo no afectará a los procesos que ya tengan el
archivo abierto.
En esencia, el modelo de seguridad de Linux y su implementación son iguales que en la mayo-
ría de los demás sistemas UNIX tradicionales.

10.8 RESUMEN
Linux empezó su vida como un clon de UNIX completo de código fuente abierto, y ahora se utili-
za en máquinas que van desde computadoras notebook hasta supercomputadoras. Existen tres inter-
faces para Linux: el shell, la biblioteca de C y las llamadas al sistema. Además, a menudo se utiliza
SECCIÓN 10.8 RESUMEN 807

una interfaz gráfica de usuario para simplificar la interacción del usuario con el sistema. El shell
permite a los usuarios escribir comandos para ejecutarlos. Éstos pueden ser comandos simples, tu-
berías o estructuras más complejas. La entrada y la salida se pueden redirigir. La biblioteca de C
contiene las llamadas al sistema y también muchas llamadas mejoradas, como printf para escribir sa-
lida con formato en los archivos. La interfaz actual de llamadas al sistema es dependiente de la ar-
quitectura, y en las plataformas x86 consiste en aproximadamente 250 llamadas, cada una de las
cuales hace lo necesario y nada más.
Los conceptos clave en Linux incluyen el proceso, el modelo de memoria, la E/S y el sistema
de archivos. Los procesos pueden bifurcar subprocesos, con lo cual se produce un árbol de proce-
sos. La administración de procesos en Linux es distinta en comparación con otros sistemas UNIX,
en cuanto a que Linux considera a cada entidad de ejecución (un proceso con un solo hilo, o cada
hilo dentro de un proceso multihilo o el kernel) como una tarea distinguible. Así, un proceso (o una
sola tarea en general) se representa mediante dos componentes clave: la estructura de tarea y la in-
formación adicional que describe el espacio de direcciones del usuario. La primera siempre está en
memoria, pero los datos del segundo componente se pueden paginar hacia/fuera de la memoria. La
creación de procesos se lleva a cabo mediante la duplicación de la estructura de tarea del proceso,
y después se establece la información de la imagen de memoria para que apunte a la imagen de me-
moria del padre. Las copias actuales de las páginas de imagen de la memoria se crean sólo si no se
permite la compartición y se requiere una modificación de la memoria. A este mecanismo se le co-
noce como copiar al escribir. La programación se realiza mediante el uso de un algoritmo basado
en prioridades, que favorece a los procesos interactivos.
El modelo de memoria consiste en tres segmentos por proceso: texto, datos y pila. La adminis-
tración de la memoria se realiza mediante la paginación. Un mapa en la memoria lleva el registro
del estado de cada página, y el demonio de paginación utiliza un algoritmo de reloj de doble mane-
cilla modificado para mantener suficientes páginas libres a la mano.
Para acceder a los dispositivos de E/S se usan archivos especiales, cada uno de los cuales tie-
ne un número de dispositivo mayor y un número de dispositivo menor. La E/S de dispositivos de
bloques utiliza la memoria principal para colocar en caché los bloques de disco y reducir el núme-
ro de accesos al mismo. La E/S de caracteres se puede realizar en modo crudo, o los flujos de ca-
racteres se pueden modificar mediante disciplinas de línea. Los dispositivos de red se tratan de una
manera algo distinta, al asociar módulos de protocolo de red completos para procesar el flujo de pa-
quetes de la red hacia/desde el proceso de usuario.
El sistema de archivos es jerárquico con archivos y directorios. Todos los discos se montan en
un solo árbol de directorios que empieza en una raíz única. Los archivos individuales se pueden vincu-
lar en un directorio desde cualquier parte del sistema de archivos. Para utilizar un archivo primero
se debe abrir, con lo cual se produce un descriptor de archivo para usarlo en las operaciones de lec-
tura y escritura del archivo. En su interior, el sistema de archivos utiliza tres tablas principales: la
tabla de descriptores de archivos, la tabla de descripción de archivos abiertos y la tabla de nodos-i.
Esta última es la más importante de las tablas, ya que contiene toda la información administrativa
sobre un archivo y la ubicación de sus bloques. Los directorios y dispositivos también se represen-
tan como archivos, junto con otros archivos especiales.
La protección se basa en el control del acceso de lectura, escritura y ejecución para el propie-
tario, el grupo y los demás. Para los directorios, el bit de ejecución indica el permiso de búsqueda.

También podría gustarte