ducky | los slides estan en people.nl.linux.org/~felipe/presentaciones/intro-modularizacion-kernel |
---|---|
ducky | bueno vamos a hace una introduccion teorica |
ducky | a la modularizacion del kernel linux |
ducky | los temas a tratar son los siguientes |
ducky | modo protegido i386 |
ducky | espacio de kernel vs espacio de usuario |
ducky | que son los modulos |
ducky | caracteristicas |
ducky | aplicaciones para el manejo de modulos |
ducky | configuracion del kernel linux para darle soporte a modulos |
ducky | conclusiones |
ducky | bueno comenzemos dando una pequena introduccion a lo que es el kernel linux |
ducky | el kernel es el nucleo del sistema el cual nos permite interactuar con la maquina |
ducky | para que esta sea usable |
ducky | el kernel interactua con el hardware directamente |
ducky | linux es un kernel que invento linus torvalds en el año 1991 |
ducky | de estructura monolitica o sea esto quiere decir que el kernel es un unico gran proceso |
ducky | divivide su desarrollo en version estable (2.6) |
ducky | y version de desarrollo |
ducky | bueno pasemos a ver lo que es el modo protegido i386 |
ducky | es una caracteristica que se introdujo en los procesadores 386 |
ducky | para evitar que los procesos y aplicaciones de usuario interfieran con el kernel |
ducky | para elllo se inventaron los ring levels o niveles de proteccion |
ducky | en i386 existen cuatro niveles 0, 1 ,2 y 3 |
ducky | Linux usa solo dos de ellos |
ducky | 0 o sea modo protegido |
ducky | y 3 para el modo usuario |
ducky | de esta forma se hace una division y se evita que los procesos usuario/kernel interfieran |
ducky | en el modo protegido (ring 0) |
ducky | ocurren todos los procesos de E/S a nivel de kernel, e interaccion con el hardware directamente |
ducky | en el modo usuario (ring 3) |
ducky | toda la interaccion con el usuario |
ducky | y sus aplicaciones |
ducky | los modulos del kernel linux corren en modo protegido (ring 0) |
ducky | al igual que el resto del codigo del kernel linux |
ducky | bueno pasemos ahora si a ver lo que es espacio de kernel y espacio de usuario |
ducky | el espacio de kernel es aquel donde se interactua |
ducky | con estructuras de datos criticas, DMA, IRQs..etc..en fin manejo de hardware a bajo nivel |
ducky | y el espacio de usuario es aquel en donde corren todos los programas de los usuarios |
ducky | en el siguiente grafico |
ducky | http://people.nl.linux.org/~felipe/presentaciones/intro-modularizacion-kernel/mgp00006.html |
ducky | podemos obsevar claramente la disticion que hay entre estos dos espacios |
ducky | en el circulo mas externo podemos apreciar el espacio de usuario, en donde se encuentran |
ducky | las aplicaciones que manejan los mismos tales como lo son |
ducky | el interprete de comandos |
ducky | los editores |
ducky | los visores de imagenes...etc |
ducky | en fin.aplicaciones de los usuarios |
ducky | y en el circulo mas interno podemos apreciar el espacio de kernel con sus subsistemas |
ducky | y driver actuando, tales como lo son |
ducky | networking |
ducky | memoria virtual |
ducky | drivers para sistemas de archivos |
ducky | drivers para dispositivos en general |
ducky | bueno ahora si pasemos a ver |
ducky | Qué es un módulo |
ducky | es una pieza de codigo que corre en espacio de kernel y que se puede insertar o remover |
ducky | en caliente, sin tener que recompilar el kernel o esperar a reiniciar/apagar la maquina para ver los efectos |
ducky | o sea se puede insertar en caliente cuando la maquina esta en marcha |
ducky | los modulos del kernel linux los podemos encontrar en la ruta |
ducky | /lib/modules/"nuestra version de kernel" |
ducky | ejemplo |
ducky | /lib/modules/2.6.9 |
ducky | basicamente los modulos (se conocen tambien como modulos cargables) |
ducky | para tres funciones |
ducky | controladores para dispositivos |
ducky | controladores para sistemas de archivos |
ducky | llamadas al sistema |
ducky | se crearon por que |
ducky | tener todos los controladores de dispositivos/sistemas de archivos en una sola imagen binaria (/boot/vmlinuz) |
ducky | esta quedaria bastante grande y consumiria bastante memoria util |
ducky | permite que el desarrollo de los mismos sea mas eficiente, ya que como dije |
ducky | anteriormente no se tiene que esperar a largos ciclos de espera de reinicio de la maquina |
ducky | si no que simplemente, el la persona programa el modulo, lo compila y lo carga |
ducky | si contiene algun error funcional, solamente se debe descargar el modulo |
ducky | corregir sus errores/bugs, recompilrlo y volverlo a cargar |
ducky | No se tiene que recompilar el kernel muy a menudo si no que por ejemplo |
ducky | cuando necesitemos soporte para un x o y dispositivo podemos compilar el controlador como modulo |
ducky | y cargarlo, y una vez se haya hecho esto nuestro kernel contendra todas las funcionalidades |
ducky | que nos brinda aquel controlador o driver |
ducky | por esa razon ahorra tiempo |
ducky | se pueden descargar cuando ya no sean necesarios |
ducky | mas adelante enteremos esto con mas profundidad :) |
ducky | son mas faciles de mantener y/o depurar |
ducky | por ejemplo si un desarrollador esta programando un driver |
ducky | y nota que el funcionamiento de su kernel es bueno, antes de que se cargue el modulo |
ducky | y despues de su carga..el sistema se cuelga...es mucho mas facil notar que el modulo contiene errores funcionales |
ducky | o bugs |
ducky | si este driver/controlador se compilara "incrustado" o ligado a la imagen binaria de arranque |
ducky | el sistema se colgaria apenas arranque |
ducky | bueno ahora veamos algunas caracteristicas de los modulos |
ducky | - no todo puede ser modular |
ducky | en los ultimos tiempos. gran parte del kernel es modular, pero hay ciertas cosas que no lo pueden ser |
ducky | por ejemplo algunas funciones basicas de TCP/IP |
ducky | - son parte del kernel |
ducky | tienen libertad de ejecucion en el sistema, por que como ya dije anteriormente corren en modo protegido (ring 0) |
ducky | ya que es parte del Linux kernel, se compilan junto con el kernel |
ducky | a traves del comando |
ducky | make |
ducky | ese comando..compila la imagen de arranque (/boot/vmlinuz) y sus respectivos modulos |
ducky | una vez hecho esto instalamos los modulos en el sistema a traves del comando |
ducky | make modules_install |
ducky | todo esto obiavemente dentro de nuestro arbol de fuentes del kernel linux |
ducky | que usualmente se encuentra en /usr/src/linux |
ducky | bueno pasemos a la diapositiva 10 |
ducky | aplicaciones para el manejo de modulos |
ducky | la carga de un modulo se hace a traves del comando |
ducky | insmod |
ducky | su sintaxis es |
ducky | insmod nombre_del_modulo |
ducky | ejemplo |
ducky | insmod sis900.ko |
ducky | a traves de este comando podremos cargar el driver de mi tarjeta de red |
ducky | en el kernel y poder usar toda la funcionalidad que este nos brinda |
ducky | tambien este comando recibe parametros |
ducky | estos a veces son opcionales |
ducky | insmod sis900.ko [parametros] |
ducky | obiamente podremos hacer esto si previamente hemos compilado el controlador para que sea modular |
ducky | Remocion |
ducky | rmmod |
ducky | su sintaxis es |
ducky | rmmod nombre_modulo |
ducky | a traves de este podremos descargar del kernel el modulo requerido |
ducky | cuando ya no sea necesario |
ducky | Listar modulos |
ducky | se hace a traves del comando |
ducky | lsmod |
ducky | este comando es bastante util ya que nos muestra que modulos estan actualmente cargados en nuestro kernel ademas de algunos otros datos, tales como si tiene dependencias, y si se puede descargar |
ducky | Module Size Used by slamr 373444 2 i810_audio 32788 1 ac97_codec 16652 1 i810_audio sis900 17156 0 ide_scsi 13700 0 |
ducky | perdon.. |
ducky | Module Size Used by |
ducky | slamr 373444 2 |
ducky | i810_audio 32788 1 |
ducky | ac97_codec 16652 1 i810_audio |
ducky | sis900 17156 0 |
ducky | esa es la salida tipica del comando lsmod |
ducky | para este ejemplo |
ducky | podemos ver que actualmente tengo cargados 4 modulos |
ducky | y aqui hay algo importante que notar |
ducky | la dependencia entre modulos |
ducky | esta ocurre cuando un modulo es dependiente de otro para poderse cargar |
ducky | aqui podemos apreciar que el modulo la tarjeta de sonido i810_audio |
ducky | es dependiente del modulo |
ducky | ac97_codec, esto significa que si no cargamos este modulo, no podremos, cargar el modulo i810_audio |
ducky | y es aqui donde entra en juego un programa importante |
ducky | modprobe |
ducky | este nos permite hacer una carga con resolucion de dependencias entre modulos |
ducky | la sintaxis es |
ducky | modprobe nombre_modulo |
ducky | entonces para el ejemplo anterior |
ducky | si hacemos |
ducky | modprobe i810_audio |
ducky | el automaticamente ..cargará el modulo ac97_codec |
ducky | ahh que pena..aclaro en el ejemplo anterior el formato de lsmod |
ducky | Module Size Used by |
ducky | el primero es el nombre del modulo, el siguiente es el tamano del modulo en memoria, tambien se muestra cuantos usos tiene y si tiene alguna dependencia |
ducky | bueno sigamos adelante con modprobe |
ducky | modprobe es especialmente necesario y util por que lo usa kmod, del cual hablaremos mas tarde |
ducky | informacion acerca de modulos |
ducky | modinfo |
ducky | su sintaxis es |
ducky | modinfo nombre_modulo |
ducky | nos muestra informacion util acerca de un modulo |
ducky | tales como |
ducky | autor |
ducky | descripcion |
ducky | parametros |
ducky | licencia |
ducky | otros. |
ducky | he aqui un ejemplo, voy a hacerle modinfo al modulo que proporciona la funcionalidad del estandar de sonido ac97_codec |
ducky | modinfo ac97_codec |
ducky | license: GPL |
ducky | vermagic: 2.6.9-ac3 PENTIUM4 gcc-3.3 |
ducky | depends: |
ducky | aqui podemos ver por ejemplo que es un modulo publicado bajo licencia GPL |
ducky | la version del compilador y la version de kernel para la cual se compiló |
ducky | y alguna dependencia del modulo [si la hubiera] |
ducky | por favor pasemos a la diapositiva 14 |
ducky | todas estas aplicaciones para el manejo de modulos |
ducky | se encuentran dentro del paquete |
ducky | module-init-tools (para la serie 2.6) |
ducky | modutils (para la serie 2.4->version estable anterior a la 2.6, todavia bastante usada) |
ducky | Solo disponibles para el superusuario, ya que el manejo de modulos es critico dentro del sistema |
ducky | y por ejemplo si un modulo tiene un hueco de seguridad el sistema completo se verá comprometido |
ducky | [diapositiva 15] |
ducky | aqui encontramos las opciones básicas necesarias para que nuestro kernel linux |
ducky | tenga soporte a modulos |
ducky | CONFIG_MODULES=y |
ducky | Habilita el soporte para módulos cargables |
ducky | CONFIG_KMOD=y |
ducky | Habilita la carga inteligente de módulos |
ducky | Kmod es el cargador de módulos del Kernel, inteligente ya que permite que un módulo se cargue solo cuando se necesite y de forma automática y con resolución de dependencias, sin ninguna intervención del superusuario, carga y descarga módulos según sea necesario, llamando directamente a modprobe y rmmod |
ducky | kmod es bastante inteligente |
ducky | ya que por ejemplo si aun no tengo cargado el driver de mi tarjeta de red |
ducky | y se hace un ifconfig eth0 192.168.0.1 |
ducky | el previamente..antes de realizar el ifconfig, kmod llama a modprobe ..y este ultimo carga el controlador de la tarjeta |
ducky | de red |
ducky | ese ifconfig...llevaria por debajo..un modprobe sis900, sin que el usuario administrador lo note |
ducky | bueno ya casi para terminar |
ducky | mostrare dos funciones a nivel de programación que tienen los modulos |
ducky | un módulo SIEMPRE contendrá este par de funciones |
ducky | 1."module_init", se ejecuta al momento que se hace insmod |
ducky | 2."module_exit", se ejecuta al momento que se hace rmmod |
ducky | y se implementan de la siguiente forma |
ducky | module_init(nombre_de_la_funcion_de_entrada) |
ducky | module_exit(nombre_de_la_funcion_de_salida) |
ducky | cabe anotar que un módulo no posee funcion main() |
ducky | y ahora ..por ultimo en veamos un ejemplo codigo fuente de un modulo hola mundo |
<linux/module.h | /* Necesario para todos modulos */ |
<linux/init.h | /* Necesario para module_init y module_exit */ |
<linux/kernel.h | /* Necesario para KERN_ALERT */ |
ducky | MODULE_LICENSE("GPL"); |
ducky | static int hola_init(void) |
ducky | { |
ducky | printk(KERN_ALERT "Hola mundo\n"); |
ducky | } |
ducky | static void hola_exit(void) |
ducky | { |
ducky | printk(KERN_ALERT "Adios, kernel\n"); |
ducky | } |
ducky | module_init(hola_init); |
ducky | module_exit(hola_exit); |
ducky | bueno ese ejemplo era para que se llevaran una minima idea acerca del codigo fuente de un modulo cargable en Linux |
ducky | finalmente pasemos a las Conclusiones de esta charla |
ducky | Linux es un kernel modular |
ducky | Los módulos cargables son piezas de código que extieden la funcionalidad del Linux kernel y se insertan/remueven en tiempo de ejecución (en caliente) |
ducky | Los módulos cargables corren en espacio de Kernel en modo protegido (ring 0) |
ducky | Referencias |
ducky | KernelAnalysis-HOWTO |
ducky | Module-HOWTO |
ducky | Kernelnewbies español/ingles |
ducky | Gracias por su atención :), y espero que esta charla haya sido de su agrado |
ducky | preguntas :_ |
ducky | ? |
ducky | muchas gracias a todos |
sarnold | gracias por las presencion ducky :) |
ducky | espero gustosamente sus preguntas |
ducky | thanks a lot sarnold |
Dec 22 00:06:51 ---bio.hgy.es gives channel operator status to fernand0 | |
Dec 22 00:06:56 ---fernand0 sets mode -m #linux | |
sarnold | plas plas plas plas plas :) |
fernand0 | plas plas plas plas plas plas plas plas plas |
fernand0 | plas plas plas plas plas plas plas plas plas |
fernand0 | plas plas plas plas plas plas plas plas plas |
fernand0 | plas plas plas plas plas plas plas plas plas |
fernand0 | plas plas plas plas plas plas plas plas plas |
azulema | muchas gracias, buenas noches |
urkonn | plas plas plas plas plas plas |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
samx | el amigo ducky |
samx | queria preguntarle |
ducky | bueno espero les haya gustado, no soy un experto en cuestion de kernel linux, pero gustosamente, resolveria las dudas que esten a mi alcanze |
javierf | plas plas plas plas plas plas |
ducky | dime samx |
samx | Como puedo detectar si existe un hueco en algunos de los modulos de mi kernel |
samx | osea un hueco de seguridad |
ducky | pues eso esta directamente relacionado con funciones del modulo |
smoke | perdon en lo q me levante esto termino :P |
ducky | o tambien puede que el hueco se encuetre en otra parte del kernel, y este modulo se aproveche de ello |
ducky | aqui el companero trulux |
ducky | complementa |
krocz | smoke la unica forma es auditando el codigo |
trulux | ducky, copia desde #@c ;D |
krocz | no existe una manera uniforme para detectar bug en los modulos |
trulux | <<ducky> Los módulos cargables corren en espacio de Kernel en modo protegido (ring 0) |
trulux | <trulux> ducky, hay un problema aún no solventado y que es grave: la infección de módulos del kernel, interponiendo las llamadas init_module para cargar código arbitrario |
trulux | <trulux> el problema es que esto aún no está siendo estudiado en términos de protección |
trulux | <trulux> acabo de terminar unos tests de infección de LKM's en 2.6 |
krocz | si fuera asi el trabajo de los expertos en seguridad seria muy simple :) |
smoke | clap clap clap clap clap clap clap clap clap clap clap clap clap clap clap clap clap clap clap clap |
smoke | gracias krocz ;) |
trulux | samx, que tipo de hueco? |
trulux | preguntale a los kernel janitors ;D |
trulux | (risas) |
krocz | jaja |
trulux | bueno, pues contaba en el otro canal lo siguiente |
trulux | los módulos del kernel no poseen tests de integridad por sí solos |
fernand0 | pues entonces no es muy dificil |
fernand0 | ops |
fernand0 | sorry |
trulux | por lo cual, se pueden "atacar" de manera practicamente limpia: |
krocz | trulux la infeccion |
trulux | (cambiando las cabecras que le dicen dónde encontrar el código de init_module) |
krocz | en modulos de kernel |
trulux | krocz, si: |
krocz | al pareciera no esta funcional en 2.6 |
trulux | en 2.6: |
krocz | lo que se hacia en 2.4 |
krocz | era interceptar las syscall |
trulux | pues yo la tengo en 2.6 |
trulux | krocz, no en runtime todavía |
krocz | trulux quizas en runtime |
krocz | seria analizar la estructura de /dev/kmen |
krocz | a si se hacia en runtime |
trulux | krocz, con un kernel de hardened dbeian por ejemplo el raw access al kmemn sería imposible |
trulux | collision hace un test regresivo contra el kmem |
fernand0 | hasta mañana! |
ducky | bueno senores muchas gracias por todo, espero haya sido de su agrado la charla. dudas/sugerencias al mail felipe@noslave.net |
ducky | hasta pronto |
MJesus | clap clap clap clap clap clap clap clap clap clap |
ducky | gracias |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
fernand0 | plas plas plas plas |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
trulux | ducky, mi email es lorenzo@gnu.org, si quieres nos ponemos en contacto para probar algo |
smoke | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
smoke | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
smoke | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
smoke | clap clap clap clap clap clap clap clap clap clap |
smoke | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
smoke | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
smoke | clap clap clap clap clap clap clap clap clap clap |
trulux | CLA CLAA CLAAA CLAAAAAAP |
MJesus | clap clap clap clap clap clap clap clap clap clap |
ducky | visiten es.kernelnewbies.org |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
MJesus | clap clap clap clap clap clap clap clap clap clap |
fernand0 | gracias ducky! |
MJesus | clap clap clap clap clap clap clap clap clap clap |
trulux | a todo esto, orcero está por aquí? |
The Organizing Comittee