Sie sind auf Seite 1von 81

Unidad III Mecanismos de

proteccin
M.C. Juan Carlos Olivares Rojas

Temario
3.1 Introduccin
3.2 Funciones de un sistema de proteccin
3.3 Limitaciones
3.4 Implantacin de matrices de derechos
3.5 Mecanismos de proteccin

3.1 Introduccin
El problema como se haba comentado la unidad
anterior, no es la comparticin de recursos de
software sino el control de los mismos por la
concurrencia. Por este motivo, todo Sistema
Operativo debe tener implementado un mdulo
dedicado a la proteccin.
Generalmente esos mecanismos de proteccin se
encargan de la gestin de los procesos a los
recursos compartidos.

3.2 Funciones de un sistema de


proteccin
Las principales actividades de un sistema
operativo son:
1.Proteccin de los procesos del sistema
contra los procesos de usuario.
2.Proteccin de los procesos de usuario
contra los de otros procesos de usuario.
3.Proteccin de Memoria.
4.Proteccin de los dispositivos.

3.3 Limitaciones
La funcin de la proteccin en un sistema
computacional es la de proveer un mecanismo para
la aplicacin de polticas que gobiernen el uso de
los recursos.
Estas polticas pueden ser establecidas de varias
maneras:
Definidas durante el diseo del sistema,
Definidas en la ejecucin del sistema.
Definidas por usuarios individuales para proteger sus
archivos y programas.

Limitaciones
Las polticas para el uso de recursos puede variar,
dependiendo de la aplicacin y pueden estar
sujetas a cambios. Por estas razones, la proteccin
no puede ser considerada como un problema que
solamente concierne al diseador de un Sistema
Operativo, sino que debe considerarse, como una
herramienta
para
los
programadores
de
aplicaciones, de manera que los recursos creados
y soportados por un subsistema de aplicacin,
puedan ser protegidos contra el mal uso.

Limitaciones
Un principio importante es la separacin entre
poltica y mecanismo.
Los mecanismos determinan como ser realizado
algo. En contraste, las polticas deciden que es lo
que se realizar.
Es posible que las polticas cambien de lugar en
lugar o de tiempo en tiempo. En el peor de los
casos, cada cambio en la poltica requerir un
cambio en el mecanismo.

Dominio de proteccin
Un sistema computacional es una coleccin de
objetos. Los objetos pueden ser objetos hardware
(como CPU, segmentos de memoria, impresoras,
etc.) y objetos software (como archivos, programas,
semforos, etc.).
Cada objeto tiene un nombre nico que lo
diferencia de los dems objetos del sistema y cada
una puede ser accedido solamente mediante
operaciones bien definidas.

Dominio de proteccin
Obviamente, un proceso tendr permitido acceder
solamente a aquellos recursos a los que est autorizado
Este requerimiento comnmente llamado el principio
"Need_To_Know" es til en la limitacin de la cantidad de
dao que un proceso defectuoso pueda causar al sistema.
Por ejemplo, cuando un proceso "P" invoque al
procedimiento "A", al procedimiento le ser permitido
acceder solamente a sus propias variables y los parmetros
actuales pasados a l; no podr acceder a todas las
variables del proceso "P".

Dominios de proteccin
Para facilitar este esquema se introduce el
concepto de dominio de proteccin. Un
proceso opera dentro de un dominio de
proteccin, el cual especifica los recursos
que el proceso puede acceder.
Cada dominio define un conjunto de objetos
y los tipos de operaciones que pueden ser
realizadas sobre cada objeto.

Dominios de proteccin
La capacidad de ejecutar una operacin
sobre un objeto es un derecho de acceso.
Un dominio es una coleccin de derechos de
acceso, cada uno de los cuales es un par
ordenado
<Nombre_Objeto,
Conjunto_de_Operaciones>.

Dominios de proteccin
Por ejemplo, si el dominio "D" tiene derecho
de acceso <Archivo F, {Leer, Escribir}>,
entonces un proceso que se est ejecutando
en el dominio "D" puede tanto leer como
escribir en el archivo F; no podr realizar
alguna otra operacin sobre este objeto.
Los dominios de proteccin no necesitan ser
distintos; por el contrario, pueden compartir
derechos de acceso.

Dominios de proteccin
Qu pasa en los siguientes casos?
Se tienen 3 dominios: D1, D2 y D3; y los
siguientes objetos:
D1:
<O3,
{Leer,
Escribir}><O2,
{Escribir}><01, {Ejecutar}>
D2: <O1, {Leer, Escribir}><O4, {Imprimir}>
D3: <O3, {Leer}><O4, {Imprimir}>

3.4 Implantacin de matrices de


derechos
Un modelo de proteccin puede ser visto
abstractamente como una matriz, llamada matriz
de derecho. Los renglones de la matriz representan
dominios y las columnas representan objetos.
Cada entrada en la matriz contiene un conjunto de
derechos de acceso. La entrada "Matriz[i, j]" define
el conjunto de operaciones que un proceso
ejecutndose en el dominio "Dj" puede realizar
sobre el objeto "Oj".

Estructuras de Proteccin Dinmica


Las matrices de acceso vistas hasta el momento,
en las que no cambian los derechos en cada
dominio durante su ejecucin, son un ejemplo de
Estructuras de Proteccin Estticas.
Con el fin de ofrecer flexibilidad y de implementar
eficientemente la proteccin, un Sistema Operativo
debe soportar cambios en los derechos de acceso.
Para esto se requiere implementar alguna
estructura de proteccin dinmica.

Estructuras de Proteccin Dinmica


En este caso continuaremos considerando
las matrices de acceso, aunque en su
versin dinmica.
Bsicamente se requieren cuatro nuevos
derechos de acceso: Copia, Cambio,
Propietario y Control.

Derechos de acceso de copia


Este derecho de acceso da la facultad a un
proceso de copiar derechos existentes en un
dominio hacia otro dominio para el objeto en
cuestin; es decir, este derecho genera
copias en columnas.
Se puede representar este derecho con un
signo + dentro del dominio de proteccin

Derechos de acceso de copia


En general se podra hablar de 3 variantes
del derecho "copia": Copia Limitada, Copia
Completa, Translacin.
Copia Limitada: La copia no incluye el
derecho "Copia", con lo que no se podrn
hacer copias sucesivas del derecho. Se
puede indicar con el signo (+).

Derechos de acceso de copia


Copia completa: la copia incluye el derecho
"Copia", por lo que se pueden realizar copias
sucesivas del derecho. Se puede indicar con el
signo (*).
Traslacin: el derecho en cuestin junto con el
derecho copia se eliminan del dominio original y se
coloca en el nuevo dominio. Esta es una forma
bsica de retirar derechos de un dominio para
asignarlo a otro. Se puede indicar con el signo (?).

Derechos de acceso de cambio


Este derecho de acceso indica la posibilidad
de un proceso para cambiarse de un
dominio a otro.
La operacin cambio acta sobre dominios;
es decir, en este caso los dominios son los
objetos. Entonces, para considerar este
derecho de acceso se debern incluir los
dominios como objetos adicionales en la
matriz de acceso.

3.5 Mecanismos de proteccin


Proteccin de memoria: siempre que una
aplicacin intenta acceder a una zona de
memoria que no est comprendida dentro de
su mapa actual de memoria, el procesador
386 y posteriores, genera una interrupcin y
pasa al sistema operativo un conjunto de
informacin relativa al problema.

Mecanismos de proteccin
La proteccin de la memoria se logra por
medio de:
Tablas de paginas que describen exactamente
las reas de memoria fsica a las que un
programa puede acceder.
Un indicador de lectura/escritura para impedir
modificar una pgina de slo lectura o de cdigo
de programa.
Un indicador de usuario/supervisor que permite
al sistema operativo proteger su propia memoria
de cualquier intento de acceso.

Mecanismos de proteccin
La mejor proteccin hacia los recursos se logra
a travs del control de los procesos, dado que
estos son los que utilizan los recursos.
Existen dos tipos de control de los procesos
para el acceso a los recursos: cooperativos
donde los procesos se ponen de acuerdo y
centralizados a nivel del ncleo del sistema
operativo.

Mecanismos de proteccin
La mayora del control de procesos se hace
a nivel de sistema operativo a travs de las
llamadas del sistema, dado que la
cooperacin de los procesos no siempre es
justa.
El sistema de archivo forma parte importante
de las primitivas de sincronizacin entre
procesos.

IPC
La comunicacin entre procesos (IPC) es
parte fundamental de las primitivas de
sincronizacin de procesos y de los
mecanismos de proteccin.
Los mecanismos de comunicacin entre
procesos no slo aplican a aplicaciones
centralizadas sino tambin distribuidas.

Procesos
Son la unidad bsica de atencin del sistema
operativo.
Se pueden copiar procesos en diferentes
segmentos del sistema operativo.
Los procesos son dependientes del sistema
operativo por lo que no se ejecutan en todos
los sistemas.

Terminacin de procesos
A el cdigo de estado de un proceso
formalmente se llama seal.
Un proceso hurfano es aquel que se ha
quedado sin padre.
Un proceso zombi es aquel que se ha
quedado ocupando una posicin de la tabla
de descriptor de procesos.

wait()
En algunas ocasiones un proceso padre
necesita esperar a que sus hijos termine.
Para ello necesita sincronizarse los
procesos.
La funcin que nos permite parar un proceso
hasta que termine otro es wait
pid = wait(&estado);

wait()
Algunas macros que nos ayudan en este
proceso son:

WIFEXITED
WEXITSTATUS
WIFSIGNALED
WTERMSIG
WCOREDUMP

Ms sobre procesos
Un ejemplo de clonacin de procesos es la
ejecucin de la funcin system() que nos
permite ejecutar una llamada al sistema,
generalmente un comando de la shell.
hijo = getpid();
Padre = getppid();
Grupo = getpgrp();

Identificadores de usuario y de
grupo
En muchas ocasiones no slo es necesario
conocer los identificadores de procesos sino
conocer los usuarios y los grupos.

uid_t getuid(); /*usuario real*/


uid_t geteuid(); /*usuario extendido*/
gid_t getgid();
gid_t getegid();

Procesos bloqueantes y no
bloqueantes
Para el buen manejo de los recursos, se
necesita en la mayora de los casos que los
procesos se puedan bloquear, en otros no se
podr hacerlo.
La funcin sleep() permite dormir un proceso
una cantidad determinada de milisegundos,
es un ejemplo de una llamada bloqueante.

Seales
Las seales permiten a los procesos
comunicarse a travs de un evento, dicha
comunicacin es la base para una adecuada
proteccin.
A continuacin se muestran los tipos de
seales ms comunes en sistemas Unix, las
cuales se encuentran definidas en signal.h

Seales
1.
2.
3.
4.
5.
6.
7.
8.
9.

SIGHUP
SIGINT
SIGQUIT
SIGILL
SIGTRAP
SIGIOT
SIGEMT
SIGFPE
SIGKILL

10.
11.
12.
13.
14.
15.
16.
17.
18.
19.

SIGBUS
SIGSEGV
SIGSYS
SIGPIPE
SIGALARM
SIGTERM
SIGUSR1
SIGUSR2
SIGCLD
SIGPWR

Seales
int kill(pid, sig) sirve para mandar una seal
de un proceso a otro.
pid > 0 proceso; pid = 0 a todos los procesos
que pertenecen al mismo grupo.
La funcin signal sirve para capturar una
seal y realizar una funcin con ella.

Seales
main() {
void sigint_handler();
if(signal(SIGINT,sigint_handler)== SIG_ERR)
perror(Error en la seal);
..
}
void sigint_handler(int sig) {
printf(seal recibida);
}

IPC
El mecanismo de comunicacin entre
procesos ms famosos es el IPC (Inter
Process Comunication) de Unix System V.
Para evitar los problemas de cmo
establecer los mecanismos de comunicacin
entre procesos de distintos sistemas
operativos surgi el estndar POSIX
(Portable Operating System Interconection
X) para el mejoramiento de los mismos.

Tuberas
Las tuberas con nombre se manejan igual
que las tuberas sin nombre con la salvedad
de que presentan un nombre que ocupa una
entrada de directorio.
Se trabajan igual que un archivo slo que se
bloquea cuando un proceso escribe en la
tubera.

Tuberas
Para crear una tubera con nombre desde shell
se debe ejecutar: mknod fifo_1 p
Desde programacin las tuberas con nombre
se crean: mknod(tubo, S_IFIFO | permisos, 0)
Las comunicaciones vistas hasta ahora son
half-duplex. Se puede utilizar un poll o select
para realizar comunicacin full-duplex

3.2.2 Semforos
Los semforos son mecanismos que permiten
sincronizar procesos.
Todos los mecanismos IPC tienen una entrada en
una tabla especial con una llave definida por el
usuario.
Los posibles valores de la llave son IPC_PRIVATE,
IPC_CREATE, IP_EXECL, entre otros.

Semforos
Cada entrada de la tabla tiene un registro de
permisos (rw), informacin de estado y llamadas de
control.
Las llaves son del tipo key_t. Para crear una llave se
utiliza:
#include <types.h>
#include <sys/ipc.h>
key_t ftok(path, id)

Semforos
Es un mecanismo para prevenir colisiones
cuando uno o ms procesos solicitan
simultneamente un recurso.
Dijsktra los define como un objeto tipo entero
en los cuales se puede aplicar dos
operaciones: P (Proberen, comprobar) y V
(Verhogen, incrementar), donde P sirve para
obtener el recurso y V para liberarlo.

Semforos
Las operaciones sobre un semforo son semget
para crear un semforo o habilitar uno existente,
semctl para realizar operaciones de control e
inicializacin, semop para realizar operaciones P y
V.
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key, nsems, semflg)

Semforos
int llave, semid;
if((llave= ftok(auxiliar, K)) ==(key_t)-1)
/*Tratamiento del error*/

if((semid= semget(llave, 4, IPC_CREAT |


0600)) == -1)
/*Error al crear el semforo*/

Semforos
int semctl(semid, semnum, cmd, arg)
union semun{
int val;
struct semid_ds *buf;
ushort *array;

}arg;
Las opciones de control son: GETVAL, SETVAL,
GETPID, GETNCNT, GETZCNT, GETALL, SETALL,
IPC_STAT, IPC_SET

Semforos
ushort asem;
asem[0]=5; asem[1]=3; asem[2]=4; asem[3]=8;
semctrl(semid, 0, SETALL, asem)
valor = semctrl(semid, 3, GETVAL, 0)
int semop(semid, sops, nsops)
struct sembuf *sops;

Semforos
struct sembuf{
ushort sem_num;
short sem_op;
short sem_flg;
};
Si semop es negativo se decrementar (P), si se
incrementa (V) y si es 0 no hace nada.
Las banderas son: IPC_WAIT, IPC_NOWAIT, SEM_UNDO

Semforos
struct sembuf operacines[4];
Operaciones[0].semnum = 1;
Operaciones[0].sem_op = -1;
Operaciones[0].sem_flg = 0;
Operaciones[1].semnum = 4;
Operaciones[1].sem_op = 1;
Operaciones[1].sem_flg = 0;
semop(semid, operaciones, 2);

3.2.3 Colas (mensaje)


La filosofa de las colas de mensajes es
similar a las tuberas, pero con mayor
versatilidad.
Una cola es una estructura de datos
gestionada por el kernel, en la cual varios
procesos pueden escribir sobre ella. El
sincronismo para evitar colisin lo realiza el
kernel.

Colas de mensajes
#include <sys/msg.h>
int msgget(key, msgflg)
If((msqid= msgget(llave, IPC_CREATE | 0600)) ==
-1)
/*Error al crear la cola de mensajes*/

msgctrl(msq, cmd, buf) sirve para leer y modificar


la informacin estadstica y de control de una cola.

Colas de mensajes
Los comandos de control son: IPC_STAT, IPC_SET,
IPC_RMID. Por ejemplo: msgctrl(msqid, IPC_RMID,
0);
Las operaciones bsicas de una cola de mensajes
son enviar y recibir los mensajes que se realizan
con las siguientes funciones:
int msgsnd(msqid, msgp, msgsz, msgflg);
int msgrcv(msqid, msqp, msgtyp, msgflag);

Cola de mensajes
El parmetro msgtyp indica el tipo de
mensaje que se desea leer: 0 para el primer
mensaje, > 0 el primer mensaje de tipo
msgtyp que haya en la cola, <0 lee el primer
mensaje que sea menor o igual al valor
absoluto de msgtyp y adems sea el
mensaje ms pequeo de los que hay.

Cola de mensajes
struct{
long tipo;
char cadena[20];
}mensaje;
strcpy(mensaje.cadena, SD1);
mensaje.tipo = 1;
longitud = strlen(mensaje.cadena)
if(msgsnd(msqid,&mensaje,longitud,0)==-1) /*Err*/
if(msgrcv(msqid,&mensaje,longitud,1,0) ==-1) /*Er*/

3.2.5 Monitores
Es un procesos que se encarga de verificar el
funcionamiento de algn recurso garantizando
la exclusin mutua (mutex).
En un monitor los procesos se bloquean y
desbloquean.
Pueden existir diversas implementaciones no
estandarizadas de un monitor.

Hilos
Son procesos ligeros ya que no se duplican
completamente, slo duplican su segmento
de cdigo. Por tal motivo, comparten datos
fcilmente, la desventaja es que ocurren
muchos problemas del tipo race conditions,
pero al igual que IPC se soluciona con
mecanismos como regiones crticas, zonas
de exclusin mutua, etc.

Hilos
PThreads (POSIX Threads) es la biblioteca
para la creacin de hilos ms implementada
en sistemas *X.
Se utiliza la biblioteca pthread por lo que
algunos compiladores ya la incluyen de
manera predeterminada sino habr que
indicar su uso: gcc -lpthread

Hilos
Crear hilos:
int
pthread_create(pthread_t
*thread,
pthread_attr_t *attr, void * (*start_routine)
(void *), void *arg)
Esperar la finalizacin de hilos:
int
pthread_join(pthread_t
**thread_return)

th,

void

Hilos
No guardar estado del hilo:
int pthread_detach(pthread_t h)
Salir de un hilo:
pthread_exit(void *retval)
Biblioteca a utilizar: #include <pthread.h>

Hilos
typedef struct parametros {
int id;
char *nombre

};
void *funcion(parametros *p) {
printf(%s %d, p->cadena, p->id);
pthread_exit(&(p->id))

Hilos
Referencia asi mismo:
Yo = pthread_self(); /*Dems funciones*/
Enviar una seal a un hilo:
pthread_kill(pthread_t hilo, int seal);
Los hilos no estn tan extendidos por que
existen muchas variantes: hilos mach, hilos
solaris, Gthreads, etc.

Hilos
Mutex:
pthread_mutex_init(pthread_mutex_t *mutex, const
pthread_mutex_attr_t *attr)
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutext_t *mutex)
int pthread_mutex_destroy(pthread_mutext_t *mutex)

4.6. Criptografa
Viene del griego crypto que significa oculto y
grafa escritura.
La criptografa es el arte de cifrar la informacin.
El criptoanlisis es el arte de descifrar un
mensaje.
Criptografa y criptoanlisis van de la mano.

Criptografa
Los primeros mtodos de cifrado fueron el
de transposicin (cambiar el orden de las
letras) y el de sustitucin (cambiar una letra
por otra).
En la actualidad los mtodos de cifrados son
ms robustos pero no indescifrables. Se
trata de que el obtener el mensaje en claro
sea ms costoso que obtener el original.

Criptografa
Los mtodos actuales de cifrado basan la
codificacin d e la informacin en base a una
llave, dicha llave puede ser simtrica o
asimtrica.
Algunos algoritmos importantes de cifrado son:
DES (Data Encryption System) creado por IBM
en 1974 utilizando claves de 64.

Criptografa
En 1999 DES fue roto, por lo que ya no se utiliza en
sistemas de alta seguridad.
La firma digital es una clave muy grande utilizada
para cifrar informacin.
Otro algoritmo de cifrado importante es RSA (RivestShamir-Adleman).
El algoritmo de cifrado ms robusto es AES.

Criptografa
AES
(Advanced
Encryption
System)
fue
presentado en 2001, utiliza el algoritmo RIJNDAEL
con llaves de 128, 192 y 256 bits. Se espera tenga
una vida til de 20 aos.
Existen variaciones de los algoritmos como 3DES,
o algoritmos de libre distribucin como PGP (Pretty
Good Privacy)
RSA basa sus llaves en nmeros primos.

4.7. Proteccin
La proteccin de la informacin en cualquier
sistema sea distribuido o no resulta vital.
Para la proteccin se necesita plantearse
metodologas adecuadas que garanticen una
mayor proteccin.
Una de las mejoras maneras de tener protegido un
sistema es a travs de la autenticacin y
autorizacin de usuarios.

Proteccin
La autenticacin generalmente se da a
travs de esquemas de contraseas, las
cuales si no cuentan con una poltica robusta
de generacin y mantenimiento se vuelven
fcilmente vulnerables.
Un esquema de autenticacin seguro es
kerberos, el cual se utiliza para autenticar el
uso de servicios como NFS, etc.

Proteccin
Kerberos se basa en un esquema de boletos
entregados para la autenticacin y de dos llaves
secretas una dada por kerberos y otra conocida
por los usuarios para entrar al sistema.
Un buen mecanismo de proteccin debe evitar
que usuarios roben ciclos de CPUs a otros,
tener ms derechos que otros sin habercelos
otorgado previamente, etc.

Proteccin
Se debe garantizar la integridad y provacidad de
los datos de los usuarios.
Se debe proteger la cesin de derechos de algn
recurso en el sistema.
El esquema bsico de proteccin radica en una
matriz de acceso, en la cual se listan los recursos
y las actividades que se pueden realizar sobre l.

Proteccin
Las matrices de acceso no son tan eficientes ya
que dependen de la cantidad de recursos, usuarios
y accesos.
Un mejor esquema son las lista de control de
acceso en las cuales se puede especificar el
acceso a cada recurso de una mejor forma.
Un mejor esquema de proteccin es el acceso a
travs de roles

4.8. Seguridad
Existen muchos riesgos en los sistemas
distribuidos y en general en cualquier sistema
basado en red, por ejemplo:

Virus y troyanos
Entrada no autorizada a sistemas
Destruccin o prdida de informacin
Alteracin de transacciones
Etctera

Seguridad
Los principales ataques y vulnerabilidades
de seguridad son los siguientes:

Ingeniera social
Spoofing (suplantacin)
Denegacin de servicio
Uso de sniffers

Seguridad
Algunas recomendaciones para mejorar la
seguridad de un sistema son:
Revisar patrones de acceso y comportamiento
a cuentas de usuarios y servicios.
Verificar que las polticas del sistema no hayan
cambiado, de tal forma que no se permitan
muchos puertos abiertos, etc.

Seguridad
Se debe hacer especial nfasis en la seguridad
fsica por que muchos problemas de seguridad
vienen desde el interior.
Las
polticas
de
seguridad
deben
independientes de la tecnologa empleada.

ser

En general existen dos tipos de ataque: pasivos y


activos, siendo stos ltimos los ms perjudiciales.

Seguridad
Una buena forma de otorgar seguridad a los
sistemas distribuidos es a travs de un Firewall,
el cual se encarga de autorizar o no el acceso a
determinados recursos en base algunas reglas
definidas.
Otro mecanismo de seguridad son los proxys
que permiten centralizar el trfico de cierto
servicio pudiendo denegar el acceso o bien
limitarlo para los diferentes usuarios.

Seguridad
La implantacin de polticas de seguridad
puede hacerse desde dispositivos de red
como conmutadores y encaminadores.
La seguridad es un rea con un crecimiento
exponencial en los ltimos aos. Se
recomienda basar las polticas de seguridad
en estndares internacionales de tecnologas
de la informacin como ITIL, COBIT, etc.

Referencias
Tanebaum, A., Woodhull, A. (1997) Sistemas
Operativos. Diseo e Implementacin.
Mxico, Prentice Hall. ISBN: 970-17-0165-8.
Tutorial de Sistemas Operativos 2. Instituto
Tecnolgico
de
la
Paz.
http://sistemas.itlp.edu.mx/tutoriales/sistema
soperativos2/
[octubre 2007]

Referencias
Villegas, Cristobal. Material Curso de
Sistemas Operativos 2 (2002). Instituto
Tecnolgico de Morelia, Mxico.
Silberschatz, Abraham, Galvin, Peter,
Sistemas Operativos, Quinta edicin (1999).
Mxico, Pearson.

Referencias
Tanenbaum, Andrew (1996). Sistemas
Operativos Distribuidos. Mxico, Prentice
Hall.
Shah,
Steve
(2001).
Manual
de
administracin de Linux. Captulo 18:
Sistema de archivos de red (NFS), pp 375386. Espaa, Osborne McGraw-Hill.

Preguntas?

Das könnte Ihnen auch gefallen